4

プロパティを持つモデル クラスPersonがあるとしnameます。

サブビューの 1 つとしてPersonViewa を含む対応するものもあります。NameView

PersonViewは人物 (そのモデル) への参照も保持し、はNameView名前 (そのモデル) への参照も保持します。

の中にいる場合PersonView、名前を取得する方法は 2 つあります。

self.person.name

また

self.nameView.name

すべての参照は自然です。しかし、これは DRY に違反しているように見えます。上記のパスは同じ名前を生成するはずです。しかし、何かが同期しなくなった場合、それらは同期しない可能性があります.

上記の例は、これらのことが実際に行われる傾向があるよりもはるかに単純です。たとえば、人物がオブジェクトの一部である場合、そのオブジェクトはオブジェクトFamilyによって参照されFamilyViewます。FamilyView現在、ダウンから特定の人物の名前までの 3 つの異なるパスがあります。木が成長するにつれて、それは悪化するだけです。

状況を処理する最善の方法は何ですか?

4

1 に答える 1

1

この状況では、DRY に違反するか、疎結合をあきらめるかのどちらかを選択する必要があると思います。どちらも避けられないと思います。

NameViewにデータの独自のコピーが含まれていない場合は、データへのポインターが必要になります。NameView単体では使用できないため、カップリングを締めました。

一方、NameViewモデル データの複製を保持する場合は、DRY に違反しており、同期の問題が発生する可能性があります。多くの GUI フレームワークには、モデルとビューの間で値の同期を保つ「バインディング」の概念があります。

個人的には、疎結合とバインディングを選択します。使用するバインディングが適切であれば、同期の問題は発生しないはずです。多くの異なる言語とフレームワークでバインディングが広く使用されていることは、これがまともなアプローチであることを示唆しています。

self.person.nameまたはを使用するかどうかself.nameView.nameについては、モデルの状態を変更しようとしているか、ビューの状態を変更しようとしているかによって異なります。モデルを変更しようとしている場合は、変更するだけself.person.nameです。ビューは何らかの形でモデルの変更を監視し、それに応じて自身を更新できる必要があります。GUI を更新したいが、モデルは気にしない場合は、 を使用してself.nameView.nameください。

于 2012-07-02T06:23:07.423 に答える