2012-03-05 14 views
0

モデルとコントローラの参照が公開されている必要があります。これは悪いデザインのにおいですか?あるいは、これは「安全な」練習と考えられていますか?例えばMVCパラダイム:ビューからモデルとコントローラを公開する

:私は(ItemViewItemController、そしてItemModelからなる)(ListViewListController、及びListModelから成る)リストと多くのリスト項目を有します。

Iは、各リスト項目のItemModelItemView、及びItemControllerを作成すると、私はListViewを切っItemViewインスタンスを渡します。しかし、後で、私のListControllerには、対応するItemControllerインスタンスへの参照が必要です。

だから、ListView::addItem()とでItemViewItemController両方を渡す、または単にItemViewに渡し、例えばItemView::getController()としてインスタンスメソッドを公開することがより適切であろうか?

それは問題ですか?それぞれのアプローチは同等に実行可能ですか?彼らの論理的結論に従うならば、どちらの戦術が反パターンになるか?

+0

'しかし、後で、私のListControllerは、対応するItemControllerインスタンスへの参照が必要です - なぜですか?クラスを適切に分離している場合は、この必要はありません。 –

+0

'ItemModel、ItemView、およびItemController'を作成すると、リスト内の各項目のコントローラが作成されますか?それは私の匂いです。 –

+0

Webアプリケーションやデスクトップアプリケーションについて話していますか?違いがあります。 –

答えて

1

しかし、いくつかの後の時点で、私のListControllerは

なぜ対応ItemControllerインスタンスへの参照を必要ですか?クラスを適切に分離している場合は、この必要はありません。

コントローラはほとんど常に機能ドメインを扱います。このようなドメインの例は、「Sales」または「Admin」です。さらに、MVCは、組織の追加の階層レベルを提供する「エリア」の使用もサポートしています。

他のコントローラからコントローラへの参照を追加することは、この組織構造との相互目的に基づいています。コードをよりDRYにするために機能を結合する必要がある場合は、通常のリファクタリングがそれを達成します。 は、共通の機能を含む基本クラスからコントローラを継承することもできます。

+0

偉大な洞察力 - ありがとう! –

0

実際にコードを表示していないことを考慮してください。 私の意見では、デザインを変更する必要があります。コントローラは(直接)別のコントローラと通信することは想定されていませんが、MVCはそれを指示します:reference

コントローラのアクションを別のコントローラから呼び出す必要がある場合は、代理人またはコンポジションの使用を検討してください。コントローラーアクションを直接呼び出すのではなく、

1

mvcパターンでは、ユーザーが要求するのは、アクションを持つコントローラ、たとえばinvoicecontrollerにルーティングされます。 デフォルトのアクションIndexが請求書のリストを返します。コントローラは次に請求書オブジェクトのリストを含むモデルを作成し、正しいビューをインスタンス化し、そのモデルをビューに注入する。 今、それはその魔法をやるために変わったものです。 1つまたは複数のコントローラへのルートを含む可能性のあるデータを使用して、最良のビューをレンダリングします。 ビュー(またはモデル)はビジネスロジック自体を行うべきではありません。 それは、私はJakubに全く同意したと言っています。希望が役立ちます。

関連する問題