パッシブビューを正しく使用する方法を理解しようとしています。パッシブビューで見るすべての例は、デメテルの法則に違反しているように思われます。
//In the presenter code
myview.mytextfield.text = "whatever";
では、パッシブビューのより良い実装は何ですか?
パッシブビューを正しく使用する方法を理解しようとしています。パッシブビューで見るすべての例は、デメテルの法則に違反しているように思われます。
//In the presenter code
myview.mytextfield.text = "whatever";
では、パッシブビューのより良い実装は何ですか?
まず、デメテルの法則は、プログラミングのほとんどのルールと同様に、原則またはガイドラインのようなものであり、原則が適用されない場合があります。そうは言っても、デメテルの法則はパッシブ ビューには実際には適用されません。この場合、法則の理由は問題ではないからです。
デメテルの法則は、次のような依存関係の連鎖を防止しようとしています。
objectA.objectB.objectC.DoSomething();
明らかに、objectB の実装が代わりに objectD を使用するように変更された場合、objectA の依存関係が壊れ、コンパイル エラーが発生します。極端な場合は、実装の変更によってチェーンが妨げられるたびに、散弾銃の手術を行うことになります。
パッシブビューの場合
したがって、あなたが与えた例は通常実装されます:
//from presenter
view.MeaningfulName = "data";
ビューは次のようになりますが、
//from view
public string MeaninfulName
{
get
{
return someControl.text;
}
set
{
someControl.text = value;
}
これが物事を少し明確にすることを願っています。
さて、そうです、それはデメテルの法則を破ります。それは基本的に、オブジェクトへのインターフェースがオブジェクトの実装を明らかにするべきではないと言っています。しかし、2つ目は、実装にも多くのヒントを与えます。
一般的に正しいインターフェースを持っているかどうかを尋ねる時が来たと思います。これらのテキストフィールドは何ですか?誰がそれらをビューに設定していますか?ビューは、その逆ではなく、モデルにデータを要求するべきではありませんか?
おそらく、オブザーバーパターンが必要です。モデルは関係者のリストを保持し、内部状態が変化したときに通知します。
ああ、そのパッシブビュー。長い間それを見ていませんでした。基本的に、2つの部分があります。1つは、コントローラー(モデルではない)にすべての更新を駆動させることで、(おそらく)効率のために、特定のフィールドメソッドを公開してそれらのフィールドを更新することです。これは、デメテルの法則に違反します。これは、結局のところ、マーフィーの法則のように、比喩的な意味での「法則」にすぎません。ただし、通常はそれをお勧めします。この場合、ビューをやり直して、個々のフィールドへの更新をラップするためのファサードとして使用します。
ただし、コントローラーがすべての更新を行うようになったため、オブザーバーパターンは必要ありません。並列更新を行うためにコントローラーを作成する必要があるため、コード全体に複雑さとエラーが発生しやすくなります。
より良い実装は、プレゼンターとビューの間に API を持つことです。プレゼンターは、(ビューのインターフェイスで定義された) 単一のメソッドを介してビューにデータをプッシュします。ビューは、何らかの内部ロジックに従って新しい入力を管理します。
したがって、プレゼンターはビューについて何も知る必要がなく、デメテルの法則は安全です。