私はさまざまなフィルターを介してドキュメントを処理するアプリケーションを構築しています。
Document
というクラスがあります(または、test-doubleを作成するためのインターフェースとして優れていますか?)。 Document
クラスには多くのフィールドが含まれているため、構築にBuilderパターンを使用することを考えていました。
これで、追加のフィールドを含む特定の「特殊な」ドキュメントがあります(これをSpecialDocument
と呼びましょう)。明白な解決策は、Document
クラスを拡張することです。しかし、どうすれば(実行時に)Document
インスタンスを取得してSpecialDocument
インスタンスにすることができますか? Document
インスタンスの構築は非常に複雑であることを覚えておいてください。したがって、コピーコンストラクターは面倒でエラーが発生しやすい(ファイルを追加するときなど)と思います。
考えられるもう1つの解決策は、元のDocument
インスタンスをSpecialDocument
コンストラクターに渡し、すべてのドキュメント呼び出しをそのインスタンスに委任することです。
または、これらのフィールドをSpecialDocument
からDocument
クラスに追加して、Optional<String> getSpecialField
のようにオプションのゲッターを提供する必要がありますか?この最後のオプションは、概念が混在しており、クライアントが(最初にオプションを処理する必要があることを除いて)処理するドキュメントの種類がわからないため、最も好ましくないようです。
このシナリオをモデル化する、よりシンプルでエレガントな方法はありますか?
アドバイスありがとうございます。
オブジェクトのクラスは、オブジェクトのライフサイクル中に変更されることは想定されていません。もしそうなら、設計に問題があるはずです。
あなたが説明する課題の種類は通常、次のように対処されます。
SpecialDocument
は、いくつかのメソッド、いくつかのプロパティ、またはその両方など、基本クラスDocument
にいくつかの責任を追加します。Document
には、一連のプロパティと動作を定義するSpecialDocument
などのコンポーネントがあります。Document
は strategy が動的に設定してその動作を変更できるように定義されます。これらの設計パターンの背後にある共通の特徴は、チャンギンクラスの考えが動的にあなたの心と交差するときはいつでも、 継承よりも優先 である構成の創造的な使用です。
ほとんどの場合私はこれを行います:
class SpecialDocument {
Document getDocument();
String getField1();
String getField2();
}
SpecialDocument
はDocument
を拡張せず、リクエストに応じて返されるドキュメントへの参照を含みます。
Document
またはSpecialDocument
のいずれかを明示的に取ることができます。