2012-07-02 2 views
8

나는 최근에 특정 유형의 파일을 모델링하는 일부 개체를 포함하는 클래스 라이브러리를 작성했습니다. 예를 들어, 현재 누가 적절한 파생 클래스를 선택해야합니까?

길 클라이언트가 새로운 객체를 선택하여 쉽게 만들 등 (예 WordDocumentExcelDocument 콘크리트 유도 된 클래스를, 추상적) 파생 클래스 PdfDocument (콘크리트) 및 OfficeDocument 추상 Document 클래스가 적절한 파생 클래스를 만들고 바이트 배열을 전달합니다.

var wordDocument = new WordDocument(wordDocumentByteArray); 
var pdfDocument = new PdfDocument(pdfDocumentByteArray); 

이 허용 디자인은 클라이언트가 사용하는 클래스를 파생 알고 있어야,이다 : 나는 PdfDocument과 WordDocument의 바이트 배열이있는 경우 그래서, 예를 들어, 내가 좋아하는 일을 할 것인가? 아니면 추상적 인 Document 클래스를 숨기고, 추상 팩터 리 패턴과 같은 것을 사용하여 올바른 파생 타입을 반환하는 것이 더 좋을까요? 예컨대 : 파생 유형이 추상 클래스에 추가 속성/메소드를 추가하지 않는 것이

var wordDocument = DocumentFactory.GetDocument(wordDocumentByteArray, "docx"); 
// pass file extension so we know what the file is 

주, 그들은 단지 다른 방식으로 추상 메소드를 구현합니다.

+0

확실히 두 번째 옵션입니다. 미래의 확장 성을 훨씬 용이하게하며,보다 적절한 새로운 유형이 추가 될 때 클래스 선언을 업데이트하는 데 소요되는 시간을 줄여줍니다. –

+0

'Document' 클래스는 최종 사용자가 주어진'Document'로 처리해야하는 모든 것을 가지고 있습니까? 아니면 더 자주 파생 된 유형에 특정한 기능에 대한 액세스 가끔 필요합니까? – Servy

+0

@Servy 네,'Document' 클래스는 하나의 public abstract 메소드를 가지고 있습니다. 파생 클래스는, 1 개의 public 메소드를 구현하는 목적으로, protected 및 private 헬퍼 메소드 (오버라이드 (override) 된 public 메소드를 더한 것)로만 구성됩니다. – Andrew

답변

9

두 번째 방법은 라이브러리 사용자로부터 Word 및 Pdf 문서의 존재 사실을 숨기므로 첫 번째 방법보다 훨씬 좋습니다. 이 기능은 문서 유형을 추가 할 때 특히 중요합니다. Rtf, Html 등 : 코드를 다시 컴파일 할 필요없이 새로 추가 된 유형의 이점을 얻을 수 있습니다. 실제로, 그들은 당신이 무엇인가를 변경했다는 사실조차 알지 못할 것입니다. 제대로 수행된다면, 그들의 코드는 결코 존재하지 않았던 타입의 문서로 "단지 작동 할 것"입니다.

P. 바이트 배열을 스캔하여 올바른 형식을 찾아 낼 수 있다면 API는 두 번째 매개 변수를 제거하여 스타일에 대한 몇 가지 포인트를 얻을 수 있습니다.

+0

감사합니다. 바이트 배열의 형식을 알아낼 수 있는지 살펴 보겠습니다. 예제에서 확장자를 추가 한 유일한 이유는 파일을 결정하는 확실한 방법이 아닌 것처럼 보인 매우 간단한 연구에서 였기 때문입니다 때마다 이진 표현에서 유형을 입력하십시오. – Andrew

3

파생 형식이 속성/메서드를 추가하지 않고 주어진 바이트 []에 사용할 형식을 결정할 기술적 능력이 있다면 파생 클래스를 공개하지 않을 것입니다. 라이브러리를 학습 할 때 소비자가 분석해야하는 물건의 표면적. Document 클래스에 public static Document OpenDocument(byte[] data)과 같은 정적 팩토리 메소드 만 있으면됩니다.

+0

감사합니다. 나는 추상적 인 공장 대신에 공장 방법으로 갈 것이다. (이는 내가 성취해야 할 필요성에 과잉이라고 생각된다.) – Andrew

+0

* "파생 된 유형에 속성/메서드가 추가되지 않은 경우"* 매우 큰 "if"입니다. 일반적인 "문서"로는 수행 할 수없는 알려진 파일 유형을 사용하여 수행 할 수있는 많은 작업이 있습니다. – Servy

+0

@Servy 나는이 질문에 언급하지 않은 나의 라이브러리의 목적에 동의하지만 바이너리 데이터를 약간 수정했다.이 기능은 꽤 특정 적이기 때문에이 경우에는 가정이 괜찮다고 생각합니다. 변경 사항과 구현이 파일 형식에 따라 다르므로 처음에는 파생 클래스가 필요합니다. – Andrew