2012-07-02 5 views
8

私は最近、特定の種類のファイルをモデル化するいくつかのオブジェクトを含むクラスライブラリを作成しました。例えば、抽象Documentクラスはなど、派生クラスPdfDocument(コンクリート)とOfficeDocument(例えばWordDocumentExcelDocumentなどの具体的な派生クラスで抽象的、)と、そこにある適切な派生クラスを選択する責任は誰にありますか?

現在のクライアントが新しいオブジェクトを作成する方法が選択することです適切な派生クラスを作成し、バイト配列を渡します。

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

2番目のオプションです。将来の拡張性がはるかに容易になり、より適切な新しい型が追加されたときに、クラス宣言の更新に要する時間が短縮されます。 –

+0

'Document'クラスは、エンドユーザが与えられた' Document'を使って行う必要があるすべてのものを持っていますか、あるいはより派生した型に特有の機能へのアクセスを必要とする(あるいは頻繁に) – Servy

+0

@Servyはい、 'Document'クラスは公開抽象メソッドを1つ持っています。派生クラスはすべて、1つのパブリックメソッドを実装する唯一の目的で、保護されたヘルパーメソッドとプライベートヘルパーメソッド(オーバーライドされたパブリックメソッド)で構成されます。 – Andrew

答えて

9

2番目の方法は、ライブラリのユーザーからWord文書とPdf文書が存在しないという事実が隠されているため、最初の方法よりはるかに優れています。これは、さらに多くのドキュメントタイプを追加する場合に特に重要になります。 Rtf、Htmlなど:コードを再コンパイルせずに、新しく追加された型の利点を得ることができます。実際には、彼らはあなたが何かを変更したことに気づくことさえしません。もし正しく行われれば、彼らのコードは存在しなかったタイプの文書で "ちょうどうまくいく"でしょう。

P.S.バイト配列をスキャンして正しい配列を見つけ出すことができれば、APIは2番目のパラメータを削除することでスタイルにいくつかのポイントを得ることができます。

+0

ありがとうございます。バイト配列の型を調べることができるかどうかを確かめるために、私の例で拡張子を追加した唯一の理由は、いくつかの非常に短い研究から、ファイルを決定する確かな方法がないように見えるからです毎回バイナリ表現からタイプします。 – Andrew

3

派生型にプロパティ/メソッドが追加されておらず、指定されたバイト[]に対して使用する型を決定する技術的能力がある場合、派生クラスを公開することさえできません。あなたのライブラリを勉強するときに消費者が解析しなければならないものの表面積。 Documentクラスにはpublic static Document OpenDocument(byte[] data)のような静的なファクトリメソッドがあります。

+0

ありがとうございます。私は、抽象的な工場ではなく工場の方法で行く(これは、私が達成する必要があるために過度のように見える)。 – Andrew

+0

* "派生型にプロパティ/メソッドが追加されていない場合" *かなり大きい "if"です。一般的な "ドキュメント"では行えない既知のファイルタイプを使っていると考えられることがたくさんあります。 – Servy

+0

@Servy私は、私の質問には言及していない私の図書館の目的のために同意するが、それはバイナリデータをいくらか変更することである。機能は非常に特殊なので、この場合は前提がうまくいっていると思います(派生クラスの必要性は、変更とその実装がファイルタイプによって異なるためです)。 – Andrew

関連する問題