2010-12-14 2 views
1

그래서 XML 라이브러리의 나머지 부분에서 '숨길 수 있도록 xerces XML 라이브러리 주위에 클래스를 만들려고 시도했습니다. 계획.XML 라이브러리 용 C++ '래퍼 클래스'

이것은 매우 쉬운 작업이지만, 프로젝트의 나머지 부분에서 라이브러리를 숨겨서 클래스를 작성하는 것은 완전히 불가능합니다.

내가 잘못된 접근 방식을 가졌거나 내 '래퍼'아이디어가 완전히 바보입니까?

나는 이런 식으로 뭔가와 끝까지 내 생각이 잘못 사라

DOMElement* root(); //in my 'wrapper' class, however this DOMElement is part of the xerces library, at this point my 'wrapper' is broken. Now I have to use the xerces library everywhere I want to use this function. 

?

+0

XML로 무엇을하고 있습니까? 이유는 XML 라이브러리를 래핑하고 래퍼 클래스를 코드에 노출하는 대신 XML에 저장하고 노출하는 간단한 개체 모델을 구현하지 않는 이유는 무엇입니까? 그런 다음 유지할 수있는 깨끗한 인터페이스가 있어야합니다./XML에서 해당 객체 모델을 추출 하시겠습니까? – Nim

+0

@ 님, XML은 네트워크 연결을 통해 클라이언트와 통신하는 데 사용됩니다. XML 문자열을 XML의 특정 '형식'으로 유지하며 요청을받을 때 따로 따로 가져와 답변과 함께 입력하면됩니다. –

+0

그래서 전체 프로젝트에서 역할은 매우 크지 않다고 말하고 싶지만, 클라이언트 측을 변경할 수 없기 때문에 여전히 거기에 있어야합니다. –

답변

1

첫 번째 단계에서 래퍼를 사용하지 않는 것이 좋습니다. 레이어와 경계선이 명확한 지 확인합니다. 예를 들어 네트워크 레이어는 XML의 직렬화/비 직렬화를 처리하며 내부 형식 만 사용합니다. 이 작업을 수행하고 나중 단계에서 xerces를 다른 라이브러리로 바꾸려면 직렬화 계층 만 바꾸면됩니다. 즉, 각 XML 객체를 래핑하는 대신 전체 작업을 마무리하면됩니다 (serialize/deserialize).

1

라이브러리에 대한 고유 한 추상 인터페이스를 작성하는 것은 변경하려는 계획이나 사용중인 라이브러리를 변경할 가능성이있는 경우 바보 같은 생각이 아닙니다.

래퍼 인터페이스를 구현하기 위해 라이브러리 개체에 의존해서는 안됩니다. 자신의 구조와 자신의 함수 인터페이스를 구현하십시오. xml 구현 방법을 변경하고자 할 때 많은 작업을 쉽게 할 수 있습니다 (예 : 라이브러리 변경). 구현의

한 예 : 프로그램에서

class XmlElement 
{ 
    private: 
    DOMElement element; // point to the element of your library 

    public: 
    // Here you define how its public interface. 
    // There should be enough method/parameter to interact 
    // with any xml interface you will use in the future 
    XmlElement getSubElement(param) 
    { 
     // Create the Xmlelement 
     // Set the DOMElement wanted 
     // return it 
    } 
} 

당신이 볼 수 있습니다 : 그 어떤 DOMElement 또는 기능처럼

void function() 
{ 
    XmlElement root(); 
    root.getSubElement("value"); // for example 
} 

프로젝트에 나타납니다.

+0

이 접근법의 단점은 잠재적으로 많은 클래스를 래핑하고 결국 저장소에 위임하는 많은 메소드를 다시 구현한다는 것입니다. 따라서 XmlElement를 사용하면 이제 DOMElement 접근 자 메소드를 다시 구현해야합니다. 나에게 시간 낭비 .. Esp. xml 와이어 형식이 버려지면 다른 메시징 형식을 사용합니다. – Nim

+0

나는 당신에 동의합니다. 그러나 DOMElement 접근 자 메서드를 다시 구현하는 것은 래퍼가 구현을 숨기기 위해 수행해야하는 작업입니다. 이것은 또한 주제의 시작 부분에서 그가 그것을 뒤에서 변경할 계획 인 경우에만 사용해야한다고 명시한 이유이기도합니다. 내부 구현 방법은 당신에게 달린 것입니다 (내보기가 좋지 않을 수도 있고 설명하는 시스템을 사용할 수도 있습니다 ...). 그러나 래퍼 인터페이스는 명확하게 정의되어야합니다. – Phong

1

내 의견에 언급했듯이 약간 다른 접근 방식을 취할 것입니다. 내 코드베이스가 내가 사용하고있는 특정 메시징 형식 (xml)에 의존하는 것을 원하지 않습니다 (예를 들어 xml을 나중에 다른 것으로 변경하려는 경우 어떻게해야합니까?) 대신 잘 정의 된 개체 모델로 작업하고 XML 문자열로 변환하거나 XML 문자열로 변환하는 간단한 인코더/디코더. 이 인 코드/디코더는 기본 와이어 포맷이 바뀌면 대체 할 비트가 될 것입니다.

디코더는 소켓에서 읽은 데이터를 가져 와서 적절한 개체 (요청을 나타내는 개체가 중첩 된 개체)를 생성하고 디코더는 비슷한 개체를 가져 와서 XML을 생성합니다. 퍼포먼스가 주요 관심 사항이 아니라면 TinyXML과 같은 라이브러리를 사용하면 꽤 가벼워 질 것입니다.이 라이브러리를 사용하면 더 가볍게 만들 수 있습니다 ...

+0

+1 : 우리가 인코더와 디코더를 "어댑터"라고 부르는 곳에서 디코더의 역할은 입력 데이터를 가져 와서 BOM을 구축하는 것입니다. 그리고 잘 작성 되었다면 나머지 코드를 보완합니다. 디코더 인터페이스를 가짐). TinyXML에 관해서는 TinyXML에 비해 C++ 래퍼 인 TiCpp가 있으며 멋진 C++ 인터페이스를 제공합니다. http://ticpp.googlecode.com/svn/docs/ticpp.html –