なぜ誰もがコントローラーを1つのフォルダーに入れ、ビューを別のフォルダーに入れるのですか?


36

私は、aspから曲げてmvcフレームワーク、asp.net mvcまたはnancyに移行する準備をしています。どこに行っても、コントローラー/モジュール用のフォルダーとビュー用のフォルダーが表示されます。これは単にタイプごとに物事を片付けるパブロフの反射ですか、それともより深い知恵が働いていますか?一緒に開く可能性のあるファイルを一緒に保存する概念実証プロジェクトが少しありますが、かなり快適です。これらのファイルは相互に呼び出すことも多いため、短く、脆弱性の低い相対リンクで呼び出すことができます。フォルダーパスがURLパスに自動的に対応しなくなったため、このパターンはmvcによってチャレンジされ、asp.net mvcでは、プロジェクトテンプレートとルーティングがviews \ controllers \ schismを強制します。

このMicrosoftページでは、エリアの概念を紹介しています。これは、この人為的な分離が原因で、扱いにくい大型アプリがどのようになるかを認めたものとして読むことができます。

人々は「懸念の分離」に反対しますが、懸念の分離はすでに別々のソースファイルを持つことで達成されています。密結合されたこれらのソースファイルを取得し、フォルダー構造の反対側に送信することから、具体的なゲインはありませんか?

他の誰かがこれと戦っていますか?任意のヒント?


3
バックエンドコードファイルをビューファイルから分離することは論理的ではないと思いますか?すでに指示を出している場合は、関連するCSSファイルとJavaScriptファイルも同じフォルダーに入れてください。
Alternatex

2
Resharperを取得した場合View、コントローラーの呼び出しでF12を押すとビューが表示され、ビューの右クリックメニューの最初のオプションを使用するとコントローラーが表示され、ナビゲーションの欠如に関する問題はすべてなくなります。
ピートKirkham

4
@Alternatexすみませんが、コントローラーがどのように「バックエンド」であるかわかりません。ビューと密に結合されています。ビューがなければコントローラーは役に立たず、コントローラーはビューなしでは役に立たない。いつか一緒に削除したくなるでしょう。それは私にとって、フォルダに一緒に属するものの最高のテストですか?誰かが私にもっと良い方法を見せてくれない限り?
bbsimonbb

2
ビューはプレゼンテーション層です。コントローラーは、サービスを含むレイヤーであり、サービスにはドメインのオブジェクトが含まれる場合があり、ドメインにはビジネスロジックが含まれるので、アプリケーションのバックエンドロジックが含まれます。ビューは、単純な条件とコレクションを反復するための単純なループのみで構成されています。ビューに何か他のものが含まれている場合、それは間違っています。通常の構造と同様に、あなたはバックエンドとフロントエンドを分離しました。これはあなたが提案しているものよりも良い構造です。
アンディ

10
したがって、コントローラーが食器類であると私に伝えるために人々の不足がないので、それは食器棚に行きます。ビューはガラスなので、ガラスの食器棚に入れます。私が知っているコントローラが食器類であることが、私たちはものの話をしているので、唯一の昼食時に使用されることを、ランチとディナー食器棚の食器棚を持っているのは素晴らしいだろう提案しています夕食時。
bbsimonbb

回答:


38

カーゴカルトプログラミングだと言いたいのですが、この構造には技術的な理由があります。Asp.Net MVCは、ほぼすべてに対して構成アプローチよりも規約を採用しました。デフォルトでは、RazorビューエンジンはViewsディレクトリを検索して、コントローラーから返されるビューを解決します。ただし、異なるプロジェクト構造を取得するためのハックがいくつかあり、MicrosoftはAreasと呼ばれるMVC機能を提供して、より健全なプロジェクト構造を作成できるようにします。ビューを探す場所を指定するために、独自のビューエンジンを実装することもできます。

なぜそれがカーゴカルトプログラミングであり、あなたがこれについて正しいと言うのですか?ボブおじさんは、プロジェクトのディレクトリ構造から、それがMVCアプリケーションであることを教えてはいけないと確信しました。店頭であること、または休暇申請システムであること、その他のことを教えてください。高レベルの構造とアーキテクチャは、実装方法ではなくこれが何であるかを教えてくれるはずです。

要するに、私はあなたがこれについて正しいと信じていますが、他のディレクトリ構造は単にフレームワークと戦っていて、Asp.Net MVCフレームワークにそれを行わせたくないと言うとき私を信頼するでしょうするように設計されていません。それは本当に設定可能ではないことは残念です。


アーキテクチャ上の懸念に迅速に対処するために、ビジネスモデル(ビジネスではなくビジネス)とDALは、MVCアプリから呼び出される別のプロジェクト/ライブラリに存在する必要があると考えています。

コントローラが実際にビューと非常に密接に結合されており、一緒に変更される可能性が高いというだけです。依存性による結合と論理的な結合の違いを覚えておくのは賢明です。コードの依存関係が分離されているからといって、論理的に結合しているわけではありません。


1
カミソリがビューを探す場所を制御する包括的な方法はこちらです。ただ辛抱するかもしれません。
bbsimonbb

3
提案された通り、私は叔父のボブをx1.25で見ました。ITアーキテクトが建物を建てたら、私たちは皆、湖に浮かぶ小さなlittleのグループに住んでいると思うようになります。人生は必ずしも単純ではありません。
bbsimonbb

1
少し複雑になります。コントローラーとビューを実際に同じ場所に配置するには、実行時にビューパスを解決して、コントローラーの名前空間を含める必要があります。方法は次のとおりです
bbsimonbb

1
また、ボブおじさんが説明している内容に対応する学術向けの、機能指向のソフトウェア開発(fosd.net)もご覧ください
ngm

1
職場でのコンウェイの法則。これはあなたの会社の@Flaterで機能するはずです。標準のMVCレイアウトは多くの会社で機能しますが、構文よりもセマンティクスでグループ化することを好みます。私が働いている会社は、役割/職務の代わりに製品を中心に組織されています。これが私の好みの根源だと思います。
ラバーダック

9

理由が何であれ、これは悪い練習です。パッケージまたはフォルダー(それらを呼び出すものは何でも)は、弱い相互依存関係を持つ必要があるため、非常に反オブジェクト指向です。それらの内部のクラス(またはファイル)は、強力な相互依存関係を持つ必要があります。

すべてのビューを1つのフォルダーに、すべてのコントローラーを別のフォルダーにスローすることにより、非常に密結合した2つのパッケージを作成します。これは、パッケージ間の依存関係が弱いという原則に反します。

ビューとコントローラーは全体の半分であり、互いに属している必要があります。左側の靴下用に1つの戸棚のドロー、右側の靴下用に別のドローはありません。


6

「なぜ...」と答えるには 質問:いくつかの潜在的な理由がありますが、実際には主観的な質問なので、どの組み合わせが本当の原因であるかは完全にはわかりません

  • フォルダーと名前空間の構造が一致する論理アーキテクチャー(モデル、ビュー、コントローラー)を複製するには

  • ASP.net MVCプロジェクトテンプレートに従う慣習と利便性

  • Controllers/フォルダは.Controllers名前空間につながるため、名前空間でグループ化するには

  • 可能性があるコントローラクラスは/両端-有する「コントローラ」(これは間違っているかもしれない)を含む名前空間からクエリ/スキャンしただけであるDI / IoCの中にいくつかのシナリオを有効にします

  • T4テンプレートがスキャンを実行し、モデルとコントローラーをスキャフォールドしてビューを生成できるようにする

あなたのプロジェクトにとって理にかなっているなら、いつでもあなた自身の規約を作成し、それに従うことができます。ただし、大規模なプロジェクトや大規模なチームで作業する場合は、全員に知られているデフォルトの規則の方が適切な場合があることに注意してください(必ずしも正しいとは限りません!)

あなたの慣習が従うのがより簡単で、生産性を妨げないなら、ぜひそれをしてください!開発者コミュニティと交流してフィードバックを得るために、ブログの投稿を1つまたは2つ書くこともできます


2

ビューとコントローラーを別々のディレクトリに保持する理由の1つは、プロジェクトで作業するフロントエンドとバックエンドの開発者がいる場合です。フロントエンド開発者がバックエンドコードにアクセスするのを防ぐことができます(たとえば、PCIコンプライアンスを支援し、機密コードへのアクセス権を持つユーザーを制限します)。

もう1つの理由は、ビューパスを少し変更することで、「テーマ」を作成し、すべてのテンプレートを簡単に切り替えることができるようにすることです。

3番目の理由は、MVCフレームワークでビューを指定するときに単純なディレクトリパターンを使用することです。各ビューへの大きな長いパスではなく、サブディレクトリとファイルを指定する方が簡単です。

唯一の「密結合」は次のとおりです。

  1. コントローラーによってビューに送信される変数。
  2. ビューのフォームフィールドまたはアクション。コントローラーに送り返されます。

多くのビューが同じコントローラーを使用でき、多くのコントローラーが同じビューを使用できるように、汎用コントローラーを使用してビューの変数名を汎用に保つようにします。このため、ビューを完全に分離することを好みます。モデルは、アプリケーション内の各「もの」を区別できる場所です。これらは、プロパティのリストとこれらのプロパティにアクセス/変更するメソッドを持つオブジェクトにすることができます。

密結合コードの場合、パッケージまたは「モジュール」の一部であるすべてのファイルを名前空間のディレクトリにまとめて保持するのが効果的です。次に、スクリプトを使用して、rawテンプレートをメインの「views」ディレクトリにコピーまたは「コンパイル」できます。例えば:


    lib/my-namespace/my-package/
        -> controllers/
        -> models/
        -> views/
            -> theme/
               -> template-name1
    app/compiled_views/theme/
        -> url/path/template-name1

残念ながら、既存のテーマの構造を変更したい場合は、ビューを更新するためにパッケージディレクトリの内外にさらに織り込みます。

ビューは、json、xml、csv、またはhtmlのいずれであっても、データをフォーマットするための単なる方法であることを考慮してください。これは、アプリケーションをAPIとしても機能させる場合に特に役立ちます。ジェネリック変数名を使用して、ビューをデータから切り離してみてください。多くのコントローラーまたはモデルに同じテンプレートを使用できます(または、インクルードを使用して、維持する必要があるコードの量を最小限に抑えます)。


1

必ずしも誰もがこれを行うとは限りません。たとえば、PythonのDjangoフレームワークにはアプリの概念があり、アプリケーションのサブモジュールは、独自のモデルとビューおよびテンプレート(ビューは本質的にコントローラーと呼ばれるものです)とともに独自のディレクトリに存在します。プロジェクト設定のアプリリストに「アプリ」を含めるだけで、「アプリ」を簡単にパッケージ化し、プロジェクト間で再利用できるため、そのようなやり方を好むことがあります。また、さまざまなパーツがどこにあるかを見つけるのも簡単です。urls.pyファイルを見て、のようなものを見ると、ユーザーを処理するすべてのコードがurl(r'^users/', include('my_site.users.urls'))モジュールにmy_site.users含まれていることがわかります。私は、モジュールを見て知っているmy_site.users.viewsmy_site.users.models私は、ユーザーが作成され、認証される方法を確認したいとき。すべてのルートがで定義されていることを知っていますmy_site.users.url

また、十分に汎用的な場合は、構成を変更するか、ライブラリとしてパッケージ化し、OSSとして公開するだけで、他のサイトでそのモジュールを使用できます。


1

コントローラーとビューを別のフォルダーに保存するのはマイクロソフトが推奨する方法であるため、多くは推奨される構造に従うため、

  1. 理由の1つは、コントローラーが常にビューと1対1の関係を持たない可能性があることです。特に、部分ビューはコントローラー間で共有できます。
  2. 別の理由としては、プロジェクトが大きくなった場合、コントローラーとユニットテストを別のプロジェクトにプルする必要があるかもしれませんが、ビューとビュー/ js / cssが相互に参照するために一緒に属する場合、同じことを行うのはかなり困難です。

など、それをあなたの方法をやっについて多くの記事があることを言って、これは


「Microsoftが推奨する方法です」...それが何を意味するのか明確にできますか?これに関する実際の権威あるMS記事はありますか?または、それはMVCアプリのデフォルトのプロジェクト設定ですか?そして、これを後者に基づいている場合、デフォルトのMVCプロジェクトのセットアップは、「全員」がどのように行うのかという理由からそうなる可能性はありませんか?
svidgen 16

1
記事に基づいてmsdn.microsoft.com/en-us/library/...それは等...、ビューのためにというように、「推奨されるコントローラ、」言う
低フライングペリカン

0

記録のために

なぜそれがカーゴカルトプログラミングであり、あなたがこれについて正しいと言うのですか?ボブおじさんは、プロジェクトのディレクトリ構造がMVCアプリケーションであることを教えてはいけないと私に確信させました。店頭であること、または休暇申請システムであること、その他のことを教えてください。高レベルの構造とアーキテクチャは、実装方法ではなく、これが何であるかを教えてくれるはずです。

質問:コードにアクセスできるのは誰ですか?プログラマ。エンドユーザーはコードを気にしますか?いいえ。そして、プログラマーが行うこと、コード。より具体的には、タイプ(コントローラー、サービス、モデルなど)に基づいたクラス。したがって、コードの動作ではなく、コードの種類に基づいてコードを見つけることができれば、それは理にかなっており、コードをデバッグするのは簡単です。さらに、チームプロジェクトを考えてみましょう。1人はコントローラー、もう1人はモデル、もう1人はdao、もう1人はビューを担当しています。プロジェクトをパーツに分割するのは簡単です。良いコードとは、構文シュガーコードではなく、デバッグしやすいコードです。ボブおじさんはまた間違っている。

プロジェクト(店頭)の振る舞いを模倣しようとするのは、貨物カルトです。


3
コードではなく、型ではなく機能に最も関心があります。機能が期待どおりに機能しない場合、その機能に関連するコードに何か問題があることがわかりますが、それがどのタイプのコードであるかは必ずしもわかりません。
モニカへの害を止める

1
「チームプロジェクトを考えてみましょう。1人はコントローラーを担当し、もう1人はモデルを担当し、もう1人はモデルを担当します」。そのようなチームは何かを出荷するのに苦労します。
ラバーダック

受け入れられた答えの下にあるコメントチェーンで確立されているように、あなたはポイントを持っていますが、特定の場合にのみです。企業が多くのさまざまなクライアントに販売するMVCプロジェクトに注力している場合、MVC構造を維持することは再利用性にとって意味があります。企業がニッチ(ウェブショップなど)に焦点を合わせ、場合によっては多くの異なるテクノロジーを使用する場合、ウェブショップ指向の構造を持つことがより理にかなっています。これは、コンウェイの法則の実用的な応用です。コード(およびプロジェクト構造)は、会社の構造に従う必要があります。
18

@RubberDuck:どちらの方法でも追加コストについて議論することができます。さまざまな人がさまざまな技術コンポーネントを実行すると、ビジネスロジックコミュニケーションが増加することは間違いありません。ただし、さまざまな人がさまざまな機能を完全に実装している場合、全員が同じ技術的アプローチを使用して(スキル+同意)参加していることを確認するためのコストが増加する可能性があります。いずれにせよ、人々が一緒に働くことを確実にするためにコミュニケーションのオーバーヘッドが必要です。
18

はい、ハンドオフは常に、1対の開発者がエンドツーエンドのIME機能を実装するよりも高価です。
ラバーダック
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.