8

私は最近、特定のタイプのファイルをモデル化するいくつかのオブジェクトを含むクラスライブラリを作成しました。たとえば、Document派生クラスPdfDocument(concrete)とOfficeDocument(abstract、WordDocumentandなどの具体的な派生クラスを持つ)などの抽象クラスがありますExcelDocument

現在、クライアントが新しいオブジェクトを作成する方法は、適切な派生クラスを選択し、それにバイト配列を渡すことです。したがって、たとえば、PdfDocumentとWordDocumentのバイト配列がある場合は、次のようにします。

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

これは許容できる設計であり、クライアントは使用する派生クラスを知っている必要がありますか?または、抽象クラス以外のすべてを非表示Documentにし、抽象ファクトリパターンなどを使用して正しい派生型を返す方がよいでしょうか。例えば:

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

派生型は、抽象クラスに追加のプロパティ/メソッドを追加するのではなく、さまざまな方法で抽象メソッドを実装するだけであることに注意してください。

4

2 に答える 2

9

2番目のアプローチは、最初のアプローチよりもはるかに優れています。これは、WordおよびPdfドキュメントが存在するという事実をライブラリのユーザーから隠すためです。これは、Rtf、Htmlなどのドキュメントタイプを追加する場合に特に重要になります。ユーザーは、コードを再コンパイルしなくても、新しく追加されたタイプのメリットを享受できます。実際、彼らはあなたが何かを変更したことに気付くことさえありません。正しく行われた場合、彼らのコードは、彼らが存在することを知らなかったタイプのドキュメントで「正しく機能」します。

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

于 2012-07-02T16:09:38.760 に答える
3

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

于 2012-07-02T16:10:34.737 に答える