문제

나는 최근에 이런 질문을 했습니다. XML 또는 개체 노출 - 모두 답변 감사드립니다.

명확히해야 할 한 가지 사항.

  • API는 항상 원격으로 액세스됩니다(예:서비스로), 대부분 웹 서비스나 WCF를 통해 이루어집니다.

나는 이론적으로 개체를 입력/출력으로 노출하는 강력한 형식의 API가 오른쪽 잘 했어.그러나 XML을 노출해야 한다는 주장이 여전히 남아 있다고 생각합니다.제가 보기에 XML을 사용하는 이유는 다음과 같습니다.

  1. 비즈니스 규칙은 Schematron의 비즈니스 분석가가 작성할 수 있습니다.
  2. 인터페이스의 형식은 약하지만 호출되자마자 데이터 및 비즈니스 규칙에 대해 데이터의 유효성을 검사할 수 있습니다.
  3. 서비스 구현이 더 간단해집니다.도메인 개체 모델을 만들 필요가 없습니다.
  4. XML 스키마는 이미 정의되어 있습니다(스키마의 데이터 사전이 있습니다).
  5. 웹 서비스 기술을 사용한다는 것은 새로운 자동차 '유형'이 추가될 때 XML 기반 API를 변경할 필요가 없다는 것을 의미합니다.

    void AddNewCar( string newCarXml )    
    string[] GetCars( /* some query conditions */ )
    

    객체 기반 API를 사용한 경우 새 유형을 추가하려면 반환될 수 있는 가능한 파생 유형을 정의하는 새로운 쿼리 메서드가 필요합니다(참조 웹 서비스 확장).이와 같은 웹 서비스를 업데이트하려면 이 서비스가 필요하며 모두 기존 클라이언트를 재구축하고 재배포해야 합니다.

객체 기반 API는 우리에게 무엇을 제공합니까?강력한 형식의 선언적 인터페이스입니다.XML보다 더 많은 추상화를 제공하지 않습니다(XML은 그 자체로 추상화입니다).객체 기반 API 비용은 얼마입니까?비즈니스 규칙과 데이터 검증이 필요한 전체 도메인 개체 세트에 비용이 듭니다.

그렇다면 내 질문은 무엇입니까?내가 물건을 사용해야 하는 절대적이고 논쟁의 여지가 없는 이유를 나에게 알려주세요.

도움이 되었습니까?

해결책

  • 물체가 더 잘 수행 될 수 있습니다 (여기에서 이진 직렬화를 생각).
  • 객체는 더 강력한 간단한 유형 검증을 가질 수 있습니다.
  • 객체를 사용하면 검증 및 비즈니스 규칙을 데이터 구조 정의에 더 가깝게 배치 할 수 있습니다.
  • 본질적으로 객체를 사용하면 더 간단한 비즈니스 규칙과 검증을 작성할 수 있습니다. 그 중 상당수는 객체 정의 자체에 포함되기 때문입니다.
  • 물체는 또한 행동을 정의 할 수 있습니다.
  • .NET을 사용하면 객체를 XML로 바꾸고 직렬화를 통해 다시 다시 돌아가서 객체에 XML과 동일한 이점을 제공하는 것이 간단합니다.

다른 팁

XML에 유리한 논쟁을 찾고 있다면 (특히 XML에 찬성하지는 않음)는 다음과 같습니다.

  • XML을 노출시키고 XSD를 제공하는 것은 데이터와 관련하여 자체 설명입니다. 모든 데이터를 해당 형식으로 전달할 수 있습니다. 자체 문서화이며 합리적으로 간단하게 검증 할 수 있습니다.

  • 데이터베이스 또는 코드 모델에 대해 많은 안전한 코드를 작성할 수 있으며 자체적으로 자체적으로 안전하고 안전한 방식으로 데이터를 추가 문서 나 설명이 필요한 다른 비즈니스 단위로 릴리스 할 수 있습니다.

  • 읽기가 쉽기 때문에 문서 나 코드 주석을 읽을 수있는만큼 쉽게 읽을 수 있습니다.

그러나 그것에 대한 논쟁은 계속해서 계속해서 ... 최악의 범죄자를 지명하려면 :

  • 지나치게 장점.
  • 거대한 네트워크 오버 헤드.
  • 추가 기술에 대한 이해가 필요합니다.
  • 더 복잡할수록 무언가를 만들수록 오류가 더 커집니다.

실제로 그 문제에 대한 타이핑은 실제로 그 문제에 대해 전혀 타이핑하는 것은 프로그래머가 어리석은 실수를하지 않는다는 유일한 이유가 존재합니다 (예 : 문자열을 int 등을 기대하는 함수로 문자열을 전달). 게다가 이것은 컴파일 타임에서 발생하며 런타임에 비용이 들지 않으므로 런타임 검사 (예 : 적절한 캐스트의 경우)를 피하고 관리되지 않은 코드의 런타임에서 비정상적인 동작을 피함으로써 효율적인 코드를 생성합니다.

말한 것처럼 XML은 교체 객체 모델을 정의하는 데 사용될 수 있지만이 객체 모델은 런타임에 동일한 검사를 받아야합니다. 그러나 이것은 특정 유한 런타임 오버 헤드가 있습니다.

내가 말하고 싶은 것은 최종 선택은 당신의 것입니다. "엄격한"객체 모델로 제공되는 안전 (그리고 때로는 마음의 평화)을 포기 하시겠습니까? XML은 더 큰 프로그래머 징계와 경보가 필요합니다 (따라서 IMHO를 사용하는 집안일).

"객체 기반"API는 생각만큼 견고하지 않으며 자동으로 생성 된 XML Schemas는 실제로 원하는 일을 할 수 없습니다. 객체 기반 API는 잘 설계된 경우 XML 기반 API만큼 유연하게 만들 수 있습니다. 동적 타이핑은 때때로도 도움이 될 수 있습니다.

일반 XML을 노출하는 경우 모든 클라이언트는 해당 XML을 생성하고 구문 분석하는 코드를 작성해야 합니다.일부 언어에서는 쉽고 다른 언어에서는 PITA입니다.

그러나 대부분의 언어에는 wsdl/xsd를 사용하고 몇 초 만에 전체 클라이언트 라이브러리를 생성할 수 있는 웹 서비스 API가 있습니다.물론, 내부 모델에서 귀하의 모델로 매핑하여 귀하와 상호 작용할 수 있는 매핑 유틸리티를 작성해야 하지만 이는 예상된 일입니다.

웹 서비스는 모든 Object<-->XML 항목을 내부적으로(클라이언트 보기용) 처리하므로 SOAP 및 그 모든 것에 대해 걱정할 필요가 없습니다.인터페이스를 정의합니다.

void addCar(Car newCar);
Car getCar(String make, String model, String year);
void removeCar(...);
List<Car> getAllCars();

이는 고객에게 많은 의미가 있습니다.그들은 당신의 wsdl을 잡고 Java, C#, PHP, Python 등으로 클라이언트 라이브러리를 생성합니다.

추가하는 것을 막을 수 있는 것은 없습니다.

int addCarXML(String carXML);
String getCarXML(int carID);

하지만 왜 두 가지 수준의 웹 서비스 크러프트(먼저 wsdl, 그 다음에는 XML 스키마용 xsd)를 추가합니까?

계약 우선 디자인에 대한 기사는 웹을 살펴보십시오. Spring 웹 사이트에는 좋은 예가 있습니다. 현재 새로운 웹 사이트를 개발 중이며 시작 및 XML 스키마로 시작하여 응용 프로그램 도메인 모델을 설계하는 데 접근했습니다. XML은 이질적인 시스템 또는 응용 프로그램 계층간에 데이터를 전송하는 데 탁월합니다. 언어가 불가지론 적이며 XML 기반 디자인을 편집, 설계 및 구현하기위한 많은 도구가 있습니다.

그것은 장점이지만, 사물의 계획에서는 구두 성이 사소한 성가심입니다. 큰 파일을 만들고 압축 할 수 있습니다. 처리에는 더 많은 오버 헤드가 있지만 개발자는 항상 사용 편의성, 유지 관리, 확장 성 등을 위해 순수한 성능을 거래하고 있습니다.

또 다른 임의의 생각은 다음과 같습니다. 최근 프로토콜 버퍼로 많은 작업을 수행했습니다. 이것은 계약 우선 사용을 제공하지만 ( ".proto"정의를 통해) 안전한 확장 성을 염두에두고 설계되었습니다. 즉, 예기치 않은 데이터를 통과 할 수있는 물건을 디자인 할 수 있습니다. 또는 손실. 불행히도, 기본 프로토콜 버퍼 사양에는 실제로 상속이 포함되어 있지 않지만 내 구현 (Protobuf-Net)은 확장을 통해이를 수행합니다.

그것이 충분히 성숙하는지 여부는 시나리오에 달려 있습니다 - 나는 그것이 관심이있을 것이라고 생각했습니다. 제쳐두고, IT (protobuf-net)는 사전 순간 RPC 스택의 편의를 위해 WCF에 연결됩니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top