2011-04-14 20 views
1

私は抽象的な "FriendEvent"モデルを持っているとします。これにはいくつかの具体的な実装があります。 (FriendUploadPhotoにはサムネイルが含まれている必要があります)など、視覚的に区別できるように、FriendEventsのすべてのビューでレンダリングする必要があります。多態性ビューのパターン

これを達成するためのオブジェクト指向の良いパターンは何ですか?

ビューコードのモデルの具体的なクラスを切り替える方法があるかどうかを知りたいと思っています。それは何らかの形で間違っていると感じます。なぜなら、多形性に頼ることが可能でなければならないと信じている条件付きロジックが使われているからです。これに対処する確立されたパターンはありますか?明確にするために

(それが責任を混合されるので、私は明らかに、モデル内のビューロジックを実装したくない、と私はモデルごとに異なる見解を持ってしたいことがあるため)

:どのようにモデルレイヤーで異なるイベントタイプをモデル化することは問題ではありません。いくつかのよく知られているOOソリューションがあります。問題は、視覚的にモデルを提示する役割を果たすビューコードに関係します。イベント(モデル)の表示を扱うEventViewクラスがあると思います。問題は、イベントの具体的なタイプに応じて別のコードパスを選択するスイッチブロックを使用せずにこのクラスを実装する方法です。

+1

継承を使用したいと思うような音です。すべての共通プロパティを持つ基本クラスを用意して、具体的な実装を基本クラスから継承させます。 –

+0

@エヴァン明らかに、私は多相を達成するためにモデルレイヤーで継承を使用しています。質問はビューコードに関するものです。 – KaptajnKold

+0

タスクステートメントが少なすぎます。クラスの責任と協力者は何ですか?最も単純なケースでは、EventTypeクラスを参照する単一のEventクラスのインスタンスである可能性があります。 –

答えて

1

DoubleDispatchさんの懸念が出ているようです。

私が正しく理解している場合は、モデルとビューのミックスを避けようとしています。各イベントクラスは

HtmlString getHtmlView() { /* code */ } 

を持つことができますが、その後、すべてのイベントは、ビューの知識と私たちは新しいgetXXXView()メソッドを追加し、ビューの新しい種類を追加するたびに持っています。これは不愉快だと私は同意する。

だから我々は、すべてのイベントが、今、少なくとも私たちが独自のクラスにビューのコードを持っている

HtmlViewMaker getHtmlMaker { return new MyKindOfViwer(this); } 

を提供することによって関心事の分離を増加させる可能性があります。はい、私たちは、イベントの種類ごとに特別なケースコードを書く必要がありますが、それは避けられません。私たちの最初の問題は、その特別なコードを置く場所です。

しかし、私たちはまだ問題があります。新しい種類のViewには、新しいgetXxxMakerメソッドが必要です。そこで、より複雑なファクトリとジェネリックスとテンプレートなどの使用を見ていきます。

0

私にとって、私は部分ビューの概念を使用します。基本クラスはプライマリビューで処理され、そのプライマリビューには具体的なクラスを表示する必要性を処理する部分的なビューが必要です。

+0

どうしますかどの部分ビューに必要なのか分かりますか? – KaptajnKold

+0

「具体的なビュー」が主ビューで、すべてが「ベースビュー」を必要とするように、それを反転します。 – cdeszaq