2009-06-10 13 views
2

私は確かに何か巨大なものを見逃しています、私はこの問題を何度か見たので、これらのコード臭を解決するあなたの意見を知りたいと思います。MVCパターンの多型の過度使用?

  • 背景は、MVCアーキテクチャパターンを使用して整理されたWindowsフォームアプリです。
  • データは階層的な方法(ツリーモデル)で構成され、異なるタイプのデータを表すさまざまなタイプのノードがあります。
  • データビューは、顧客の要求に応じて追加または変更できるさまざまなビューを含む複合ビューです。各データノードは、いくつかのビュー(テーブル、チャート、カスタム品)を使用して表現することができ、各ビューは、1つまたは複数の異なるデータノードタイプを表示する方法を知っています。
  • 表示する前に、一部のビューではデータを何らかの方法で処理する必要があります。複数のビューで同じ処理済みデータを使用できますが、すべてのビューで同じデータが使用されるわけではないため、この処理は1つのビューまたは1つのノードタイプとは関係ありません。

だから、私を悩ますことは、現在の実装では、ノードのインタフェースは、各派生ノードを実装するために必要とされる 『Node.CanProvideThisData』または 『Node.CanProvideSomeOtherData』、などの多くのプロパティで過負荷になるさ、ということです。これは、ノードのインターフェイスがすべてについてあまりにも多くを知っていることを示しています。

あなたの意見では、この処理がどこでいつ行われるのかを決定し、それぞれのビューに必要な処理済みデータが得られ、処理が重複しないようにするべきですか?

以前にも同様の問題がありましたか? MVCの実装(または実装の理解)に何か問題があると思いますか?または、これはいくつかのリファクタリングで修正できるものですか?

編集:さらに考慮すべきもう1つのことは、後で変更を処理することです。このインタフェースは、プログラマーに契約の各部分を実装させることを強いるので、新しいノード実装は即座に動作するはずです。

答えて

3

あなたのアーキテクチャをより深く理解していなければ、私の提案は良いことだと確信することはできませんが、Custom Attributesを使用して各ノードタイプが公開できるデータを宣言的に述べる可能性があります。私はあなたの "このデータを提供する"メソッドはすべて非常に愚かであり、基本的には特定の型に対して一定の値を返すと仮定しています。

あなたの質問には、多形性が広範囲に使用されていることと、新しいタイプごとに複数の「この種類のデータを提供できます」機能を再実装する必要がないことが記載されています。この場合、「このタイプはこれらの種類のデータをサポートします」という明示的な状態のカスタム属性(「AvailableDataAttribute」)を追加することを検討してください。 SortsOfDataは、おそらくフラグ列挙型、または同様のものです。その後、すべての適切なノードにAvailableDataAttributeを追加できます。次に、「データXを提供でき、データYを提供できる」実装の実装を削除し、SortsOfDataのインスタンスを受け入れる基本クラスの1つのメソッドに置き換え、その動的型がそのデータをサポートするかどうかを評価します属性。そのタイプのSortsOfDataの値を取得し、その値をチェックします。

これは、ノードタイプ(それ静的メタデータであると仮定して)約静的メタデータの動的決意を除去する大きな利点を有し、従ってデザインを自分のタイプでより明確に反映されています。

もちろん、特定のノードがある時点でデータをサポートでき、数秒後にデータをサポートできない場合は、これは成立しません。

+0

ありがとうございます!現在、ノードはデータをサポートしているか、サポートしていませんが、後でロジックを追加する必要があれば、簡単に「単一ベースメソッド」を作成できます。 – Groo

関連する問題