web-dev-qa-db-ja.com

MVCでは、コントローラークラスに非アクションのプライベート関数を含めることをお勧めしますか?

コントローラークラスのアクション関数は、モデルからビューへのデータのフローを単純に制御するための多数のコード行を含む、巨大で厄介なものになる場合があります。ある時点で、これらの巨大な関数は、優れたコードの基本原則を完全に失うことになります。つまり、小さいこと、読みやすく、管理しやすいことなど、1つのことだけを実行します。

これらの巨大なアクション関数をコントローラークラスで小さなプライベート関数に分割することは良い習慣と考えられますか、またはそのような最適化の必要性はモデルにそれらを追加する必要があることを意味しますか?

アクションに関連するように、コントローラーで小さい関数をプライベートとして使用することを投票しますが、モデルが巨大でぎこちない場合は、コントローラーはシンプルであることが望ましいという意見を聞いています。そして、どちらが最も好ましい方法であるかとただ思っていました。

最高の類推ではないかもしれませんが、蜘蛛の巣について考えるのと同じ方法でコントローラーについて考えてください。その唯一の仕事は、クモ(下の層)が消化するハエ(要求)をキャッチすることです。ウェブは、小さいハエまたは大きいハエ(モデル)をキャッチして保持できます。クモのウェブの役割は獲物を消化することではありませんが、この目的で使用することはできます。薄くてきれいなウェブほど、クモは生計を立てやすくなります。

MVCアプリケーションに多少同じロジックを適用できます。説明する巨大で厄介な関数は、モデルの動作である可能性が最も高く、モデルに属している必要があります(モデルはビューに表示されているオブジェクトだけではないことに注意してください)。モデルの動作が変化した場合、モデルを変更する必要があり、それを処理するコントローラーではありません。

また、それらをコントローラーのプライベートメソッドとして保持することは、混乱を招くだけであり、メンテナンスが困難になります。また、開発に関与している他の人々も、プロジェクトで以前にそれを行ったのを見たことがあるので、同じことをするように誘惑されるので、それは悪い習慣にもつながります。

16
devnull

私ができる最良の答えは、ロバート・マーティンの素晴らしい本「クリーン・コード」から引用することです。このテーマに興味のある人にはぜひお勧めします。

関数の最初のルールは、それらが小さいことです。 2つ目のルールは、それよりも小さいことです。

それをよく言うことはできません。同じ本の別の素晴らしい引用が適用されます:

関数は1つのことを行う必要があります。彼らはそれをうまくやるべきです。彼らはそれだけをすべきです。

コードをより多くの関数に分割する場合、コードの読みやすさを大幅に向上させることができる意味のある名前をこれらの関数に与える必要があります。言うまでもなく、クラス外での使用を目的としていないすべての関数はプライベートである必要があります。そうすることで、継承によってコードを簡単に再利用できます。

コントローラの機能が多すぎる場合は、多すぎる可能性があります。次に、それをいくつかの独立した部分に分割するか、他の回答で述べたように、いくつかの関数をモデルに移動してみます。また、ビューがいくつかのロジックを持つことを許可されている非古典的なMVCフレーバーに従っている場合は、適合する場合はいつでもそこにいくつかの関数を置くことができます。

8
Dmitri Zaitsev

MVCでは、コントローラーが可能な限り「薄い」ことを確認し、モデルが可能な限り非効率であることを確認します。

必要なロジックとヘルパー関数は、独立したスタンドアロンのヘルパークラスに入れられます。それは私のテストも非常に簡単にします(あなたはテストしています...そうですか?:D)コントローラをテストすることは悪名高いほど困難です。 httpあれこれ、そしてそれは苦痛ですが、それは故意の苦痛です。コントローラーはHTTPとWebに密接にリンクされているため、これらすべてが必要です。 Webアプリへのエントリポイントです。

ロジック関数とヘルパー関数は、Webとは関係ありません。それらは完全に環境にとらわれない(またはそうでなければならない)。それだけで、同じ場所に一緒に属していないことがわかるはずです。さらに、すべてのアプリケーションロジックをWebまたは特定のWeb実装に非常に密接に結び付けている場合、それを決して持ち歩けません。

すべてのデータベースエンティティ(MVCモデル、実際のDBエンティティではない)、ストレージ、ヘルパークラス、および独立したスタンドアロンDLLのロジックを使用して、MVCサイトを開発しました。私たちはすべてのWebサイトを1つしか持っていませんでしたが、とにかくこのようにしました。

数か月前に、いくつかのフリンジシステムに関連するいくつかのデスクトップアプリを作成するように依頼されました。テスト済みのコードはすべて簡単に再利用できるため、これは簡単に実行できました。コードをWebプロジェクトに押し込んだり、コントローラーに組み込んだりすると、これを行うことはできませんでした。

0
spaceman