OOP言語が適切に活用されていない一般的な赤い旗が次のようになります。多型を使用するとタイプ固有の機能はどのように実装されますか?
if (typeof(x) == T1)
{
DoSomethingWithT1(x);
}
else if (typeof(x) == T2)
{
DoSomethingWithT2(x);
}
このような設計上の問題のための標準的な「修正」はどちらかの継承によって、T1
とT2
の両方を共有インターフェースを作ることです共通インタフェースの基本型または実装(それをサポートする言語で)。例えば、C#でソリューションは次のようになります。
public interface IT
{
void DoSomething();
}
が、時にはあなたは、オブジェクトの種類によって異なり機能を実装したいが、その機能はがは、そのオブジェクトの型の中に属していません。したがって、多形性は間違った方法に見える。
たとえば、特定のデータの集まりを表示するUIの場合を考えてみましょう。このビューでは、表示されるデータの種類に応じてさまざまなレイアウトやコントロールをレンダリングすることができますが、if
/else
文を使用せずに、このタイプのレンダリングをどのように実装しますか?
I 希望が明らかなので、レンダリングロジックを型に入れることは、この場合非常に悪い決定として私に当てはまります。一方、データオブジェクトのタイプをビジュアルプレゼンテーションに結合することなく、if
/else
のシナリオを回避するのは難しいです。
具体的な例を示します。私は、様々な市場製品に対してさまざまな価格設定モデルを使用する取引アプリケーションに取り組んでいます。これらの異なるモデルは、共通のPricingModel
ベースを継承するタイプによって表されます。各タイプは全く異なるパラメータのセットに関連付けられています。ユーザーが(特定の製品の)特定の価格設定モデルのパラメーターを表示する場合、現在、これらはモデルのタイプを検出し、適切なコントロールを表示するフォームで表示されます。私の質問は、現在よりももっとエレガントに実装できる方法です(大きなif
/else
ブロック)。
これはおそらく非常に基本的な質問のようです。それは、私が知っている(固体のOOPの原則 - 設計パターン - 常識?)のギャップの1つに過ぎないと思っていました。
ビジターは、おそらく十分な柔軟性がありません。訪問型を動的に追加することはできません。ビジターの実装を動的に追加することができます。 –
「訪問したタイプを動的に追加する」とはどういう意味ですか?ビジターパターンでは、この新しいタイプを扱うビジターインターフェイスに新しいメソッドを追加するだけで、簡単に新しいタイプを追加できます。コンパイル時に、この新しいタイプを適切に処理するために、既存のすべての訪問者実装を更新する必要があります。これは、辞書ベースのソリューションでは見過ごされる可能性があります。 –
時には注入、簡単な型の登録、実行時の型の追加、ビジターインタフェースなどを指定するアセンブリでは知られていない型の追加などがあります。 *おそらく十分柔軟ではない*ここに記載された問題のため。 –