4

私が遊んだ MVC / MV* タイプのフレームワークのほとんどでは、ソースを次のように整理する必要があります。

model/
    FooModel.xyz
    BarModel.xyz
view/
    FooView.xyz
    BarView.xyz
controller/
    FooController.xyz
    BarController.xyz

アプリケーション オブジェクト タイプではなく、MVC 要素に基づいてディレクトリに編成します。私の一部は、コードが次のように整理されていれば、生活が楽になると常に感じています。

Foo/
    FooModel.xyz
    FooView.xyz
    FooController.xyz
Bar/
    BarModel.xyz
    BarView.xyz
    BarController.xyz

一般に、Foo で作業している場合 (たとえば、新しいフィールドを追加する場合)、すべての Foo* ファイルを開くことがよくあります。これは、すべての Foo ファイルが異なるディレクトリにあるため、面倒です (最初の世界の問題)。

Foo ソース間の結合がきつすぎるというコードの匂いですか?

そしてもちろん、対応するビュー、コントローラー、およびモデルを持たないモデル、ビュー、またはコントローラーがある場合、この代替手段はあまり魅力的ではありません。多くの場合(通常は?)、どちらが当てはまりますか...

では、なぜ MV* フレームワークの標準的な構成が、私が提案したストローマンの代替案よりも実際に優れているのでしょうか?

4

2 に答える 2

1

私自身も同じジレンマに陥っています。StackOverflowを見ると、Javaプロジェクトのパッケージ命名にどのような戦略を使用していますか。その理由は何ですか。いくつかの興味深い洞察、特に粒度に関するボブおじさんの設計原則があります。Common Reuse Principleで、彼は次のように述べています。

パッケージ内のクラスは一緒に再利用されます。パッケージ内のクラスの1つを再利用する場合は、それらをすべて再利用します。

modelあなたが言及するデザインパッケージでは、コントローラーとビューレイヤーを介していくつかのモデルクラスを再利用するのが非常に一般的であるように、パッケージを持つことは完全に理にかなっています。一方、fooパッケージは、アプリケーションモジュール自体のように再利用することはほとんどできません。また、共通閉鎖原則によると:

パッケージ内のクラスは、同じ種類の変更に対して一緒に閉じる必要があります。パッケージに影響する変更は、そのパッケージ内のすべてのクラスに影響します。

JavaScriptライブラリや依存性注入フレームワークの変更など、いくつかの技術関連の変更model-view-controllerは、機能的なもの(変更はすべてのパッケージに及ぶ)よりもパッケージ(1つのパッケージのみを変更する必要があります)への影響を最小限に抑えます。

于 2013-01-28T19:42:13.080 に答える
1

他の MVC フレームワークについてはわかりませんが、特に ASP.NET MVC の場合、ビューはViews/フォルダーにある必要があります。

ASP.NET MVC の背後にある原則の 1 つは、設定より規約です。ビュー エンジンは、特定の場所でビューを見つけることを想定しています。それをオーバーライドできると思いますが、一般的にはしないほうがよいでしょう。(規約を使用)

このファイル編成の最大の問題は、カスケード変更だと思います。フィールドを追加する必要がある場合は、5 つの場所 (モデル、ビュー、ビューモデル、コントローラー、単体テスト) を更新する必要があります。これらのものを見つけるためにフォルダ ツリーを探し回る場合、面倒な作業になる可能性があります。

たぶん、質問の背後にある質問は、「ソリューション成果物をより効率的にナビゲートするにはどうすればよいですか?」ということです。他の IDE についてはよくわかりませんが、私は Visual Studio を使用しているので、そのタスクを支援するための独自の設定があります。

Visual Studio ctrl+,(コントロール コンマ) では、ソリューション内の型/ファイル/アーティファクトに移動するのに最適です。また、「定義への移動」と「すべての参照の検索」にもF12andを使用します。Shift+F12また、[ファイルを検索] ボタンをカスタマイズして、ツールバーに画像とテキストを表示し、ボタンを押しやすくしました。

于 2013-01-28T20:07:00.507 に答える