MVCのビジネスロジック[終了]


184

2つの質問があります。

Q1。「ビジネスロジック」はMVCパターンのどこにあるのでしょうか。モデルとコントローラーの間で混乱しています。

Q2。「ビジネスロジック」は「ビジネスルール」と同じですか?そうでない場合、違いは何ですか?

小さな例で説明していただければ幸いです。

回答:


173

ビジネスルールはモデルに組み込まれます。

メーリングリストのメールを表示していたとしましょう。ユーザーがいずれかの電子メールの横にある「削除」ボタンをクリックすると、コントローラーはモデルにエントリーNを削除するよう通知し、次にモデルが変更されたビューを通知します。

おそらく、管理者のメールアドレスをリストから削除しないでください。それはビジネスルールです。その知識はモデルに属しています。ビューは最終的にこのルールを何らかの形で表す可能性があります-モデルはビジネスルールの関数である「IsDeletable」プロパティを公開しているため、ビューの削除ボタンは特定のエントリに対して無効になっていますが、ルール自体は含まれていませんビューで。

モデルは、最終的にはデータのゲートキーパーです。UIにまったく触れずにビジネスロジックをテストできるはずです。


5
例をありがとう。管理者の電子メールエントリ(削除できるかどうかを制御する)については、コントローラーを使用して制御できませんか?
hmthur 2010

2
@mudモデルをサービスレイヤーとリポジトリの2つのレイヤーに分割するとどうなるでしょう...サービスレイヤーはビジネスロジックを担当し、リポジトリはデータレイヤーを担当します...?
ドラゴン

3
@PeterMatisko「モデルはデータのみを運ぶべきです。」「MVC」でMが何を意味するのか理解していない。Vは純粋にプレゼンテーションです。Cは、プレゼンテーションとモデルの間の接着剤です。(実際、「VC」はしばしば一緒にプレゼンテーション層と見なされ、MVVMのようなMVCの人気のあるバリエーション-モデルビュービューモデル-はそれをさらに明確にします。)Mは他のすべてです:すべてのデータロジックアプリケーションの。このレイヤー内でデータとビジネスロジックを分離し、このレイヤーのデータ部分を「モデル」と呼ぶことができますが、それは「MVC」の「M」が参照しているものではありません。
泥沼

1
@PeterMatisko 「ララヴェルでは、人々はすべてをコントローラーまたはモデルに投入します。悪い悪いアーキテクチャーです。」 悪い方法?具体的に。「V」は「ビュー」を意味します。ビューではないものはすべて「M」または「C」で表示されます。 「MVCは十分ではありません。ビジネスロジックとそれをどこに配置するかについて明確に語っていません」 確かにそうです。「M」はアプリケーションのモデルです。つまり、データ、その周りのビジネスロジック、およびプレゼンテーション以外のあらゆるものです。「V」と「C」は、プレゼンテーション層、ユーザー入力および出力です。
泥沼

2
@Mud問題は、laravelが「モデル」を単なるデータキャリアと呼ぶことです。チュートリアルでLaravelがMVCを使用していると言い、「モデル」が非常に特定の目的を持っていることがわかると、ビジネスロジックをどこに配置するかがわからなくなります。そして、唯一の合理的な場所はコントローラーですが、それは良くありません。私はこれを構成しているのではなく、私がよく目にする典型的なlaravelプロジェクト(およびチュートリアル)についてコメントしました。
Peter Matisko

191

要点:
MVCパターンとn層ベースの設計原則を混同していると思います。

MVCアプローチを使用しても、アプリケーションを階層化すべきではありません。
MVCをプレゼンテーション層の拡張のように見れば役立つかもしれません。

非表示コードをMVCパターン内に配置すると、すぐに複雑なデザインになる可能性があります。
したがって、ビジネスロジックを別のビジネスレイヤーに配置することをお勧めします。

これを見てください:多層アーキテクチャに関するウィキペディアの記事

それは言う:

今日、MVCおよび同様のモデルビュープレゼンター(MVP)は、より大きなシステムのプレゼンテーションレイヤーにのみ適用される懸念の分離のデザインパターンです。

とにかく... エンタープライズWebアプリケーションについて話すとき、UIからビジネスロジックレイヤーへの呼び出しは、(プレゼンテーション)コントローラー内に配置する必要があります。

これは、コントローラーが実際に特定のリソースへの呼び出しを処理し、ビジネスロジックを呼び出してデータをクエリし、データ(モデル)を適切なビューにリンクするためです。

泥はあなたにビジネスルールがモデルに入ると言いました。
それも真実ですが、彼は(プレゼンテーション)モデル(MVCの「M」)と層ベースのアプリケーション設計のデータレイヤーモデルを混同しました。
したがって、データベースに関連するビジネスルールをアプリケーションのモデル(データレイヤー)に配置することは有効です。
ただし、これは特定のUIにのみ適用されるため、MVC構造のプレゼンテーションレイヤーのモデルに配置しないでください。

この手法は、ドメイン主導の設計とトランザクションスクリプトベースのアプローチのどちらを使用するかに依存しません。

それを視覚化してみましょう:


プレゼンテーション層:モデル-ビュー-コントローラー


ビジネス層:ドメインロジック-アプリケーションロジック


データレイヤー:データリポジトリ-データアクセスレイヤー


上記のモデルは、MVC、DDD、およびデータベースに依存しないデータレイヤーを使用するアプリケーションがあることを意味します。
これは、大規模なエンタープライズWebアプリケーションを設計するための一般的なアプローチです。

しかし、単純な非DDDビジネスレイヤー(ドメインロジックのないビジネスレイヤー)と、特定のデータベースに直接書き込むシンプルなデータレイヤーを使用するように縮小することもできます。
データレイヤー全体を削除して、ビジネスレイヤーから直接データベースにアクセスすることもできますが、お勧めしません。

それがトリックです...これが役に立てば幸いです...

[注:]現在、アプリケーションには1つ以上の「モデル」があることにも注意する必要があります。通常、アプリケーションの各レイヤーには独自のモデルがあります。プレゼンテーション層のモデルはビュー固有ですが、多くの場合、使用されるコントロールとは無関係です。ビジネスレイヤーは、「ドメインモデル」と呼ばれるモデルを持つこともできます。これは通常、ドメイン主導のアプローチを採用する場合に当てはまります。この「ドメインモデル」には、データとビジネスロジック(プログラムのメインロジック)が含まれており、通常はプレゼンテーションレイヤーから独立しています。プレゼンテーション層は通常、特定の「イベント」(ボタンが押されるなど)でビジネス層を呼び出して、データ層からデータを読み取り、またはデータ層にデータを書き込みます。データレイヤーには、通常、データベースに関連する独自のモデルがある場合もあります。

問題は、これがどのようにMVCコンセプトに適合するかです。

回答->ありません!
まあ-それはちょっとしますが、完全ではありません。
これは、MVCがSmalltalk-80プログラミング言語用に1970年代後半に開発されたアプローチであるためです。当時、GUIやパーソナルコンピュータはごく一般的ではなく、ワールドワイドウェブも発明されていませんでした。今日のプログラミング言語とIDEのほとんどは1990年代に開発されました。当時のコンピューターとユーザーインターフェイスは、1970年代のものとはまったく異なりました。
MVCについて話すときは、そのことを覚えておく必要があります。
Martin FowlerがMVC、MVP、および今日のGUIについて非常に優れた記事を書いています。


10
+1は、mvcアプリとn層アプリの違いを正しくリストします。私が開発するエンタープライズアプリのほとんどはn層で、プレゼンテーションレイヤーとしてのみmvcを使用します。
Retired_User 2013年

1)MVC(プレゼンテーションレイヤー)のビューモデル2)承認済みトランザクション、コアビジネスルールロジック用のいくつかのC#テクノロジー(ビジネスレイヤー)。3)(データアクセスレイヤー)のリポジトリと作業単位モデル、リポジトリをプレゼンテーションレイヤー(上位の層)。基本的に私はビジネスロジックとして追加、削除、更新、およびその組み合わせを信じており、トランザクションの下に保持する必要があります。親切にこれにいくつかの追加の光を広げます。
Mark Macneil Bikeio 2016年

こんにちはRahul、私があなたを正しく理解しているなら、あなたは正しいです。CRUD操作は基本的にビジネストランザクションのアトミックな部分です。個人的には、自分で構築するのではなく、リポジトリとしてHibernateのような強力なORマッパーを使用することを好みます。これは、hibernateがすでに作業単位パターンを内部で実装しているためです。また、私は通常、ビジネストランザクションを個別のビジネスサービスに入れます。
フランク

ビューモデルの場合は、次の例を示します。デュアルリストビューを含むGUIがあるイメージだけです。このデュアルリストビューは、データモデルとしてデュアルリストビューモデルを使用します。このデータモデルは、2つの単純なリストの単なる合成です。したがって、ビューモデルの作成に使用される2つの単純なリストとは異なり、デュアルリストビューモデルはドメインモデルの一部ではないため、プレゼンテーションレイヤーの実装に依存しています。作成するGUIによっては、ビュー固有のモデルをドメインモデルではなくビューにバインドすることが必要になる場合がいくつかあります。
フランク

ビジネスルール/ロジックの部分を説明するのは少し難しいです。データ処理を開始するには、サービスの1つからメソッドを呼び出します。つまり、基本的にトランザクションを開始します。このメソッドにビジネスロジックが含まれている場合、「トランザクションスクリプト」と呼ばれます。それはほとんど再利用できないので、それは通常悪いことです。このメソッドがドメインモデルのビジネスロジックを呼び出すとよいでしょう。つまり、ドメインモデルは、ビジネスロジックを含めることができるように設計する必要があります。このドメイン主導のアプローチは、不完全または間違ったドメインモデルでは機能しません。
フランク

73

私の意見では、ビジネスロジックという用語は正確な定義ではありません。Evansは彼の著書「ドメイン駆動設計」で2種類のビジネスロジックについて語っています。

  • ドメインロジック。
  • アプリケーションロジック。

この分離は、私の意見では、はるかに明確です。また、ビジネスルールにはさまざまな種類があるという認識とともに、すべてが同じ場所にあるわけではないという認識も生まれます。

ドメインロジックは、実際のドメインに対応するロジックです。したがって、会計アプリケーションを作成する場合、ドメインルールは、アカウント、転記、課税などに関するルールになります。アジャイルソフトウェア計画ツールでは、バックログの速度とストーリーポイントに基づいてリリース日を計算するようなルールになります。等

これらの両方のタイプのアプリケーションでは、CSVインポート/エクスポートが関連する可能性がありますが、CSVインポート/エクスポートのルールは実際のドメインとは関係ありません。この種のロジックはアプリケーションロジックです。

ドメインロジックは、最も確実にモデルレイヤーに入ります。このモデルは、DDDのドメイン層にも対応します。

ただし、アプリケーションロジックは必ずしもモデルレイヤーに配置する必要はありません。これは直接コントローラーに配置することも、それらのルールをホストする別のアプリケーションレイヤーを作成することもできます。この場合の最も論理的なものは、実際のアプリケーションによって異なります。


1
これは本当です!ここには、ビューモデルとドメインモデルの2つのモデルがあります。MVCプロジェクトのレイアウトにより、初心者の開発者がコードをビューモデルに詰め込むだけでよいと考えるようになったのは、ほとんど残念なことだと思います。
ジョナサン

1
あなたの答えをより受け入れやすく理解しやすいものにしてください。ありがとう。
2015年

27

A1:ビジネスロジックがModel参加しMVCます。の役割Modelは、データとビジネスロジックを含めることです。Controller一方、ユーザー入力を受け取り、何をすべきかを決定する責任があります。

A2:A Business Ruleはの一部ですBusiness Logic。彼らにはhas a関係があります。Business Logic持っていBusiness Rulesます。

見てくださいWikipedia entry for MVCMVCパターンのフローに言及している概要に移動します。

も見てくださいWikipedia entry for Business Logic。およびBusiness Logicで構成されていると記載されています。Business RulesWorkflow


16

いくつかの回答が指摘しているように、マルチティアアーキテクチャとMVCアーキテクチャにはいくつかの誤解があると思います。

多層アーキテクチャには、アプリケーションを層/層に分割することが含まれます(例:プレゼンテーション、ビジネスロジック、データアクセス)。

MVCは、アプリケーションのプレゼンテーション層のアーキテクチャスタイルです。重要なアプリケーションの場合、ビジネスロジック/ビジネスルール/データアクセスをモデル、ビュー、またはコントローラーに直接配置しないでください。そのためには、ビジネスロジックをプレゼンテーションレイヤーに配置し、コードの再利用と保守性を低下させることになります。

モデルはビジネスロジックを配置するための非常に合理的な選択ですが、より良い/より保守可能なアプローチは、プレゼンテーションレイヤーをビジネスロジックレイヤーから分離してビジネスロジックレイヤーを作成し、必要に応じてモデルからビジネスロジックレイヤーを呼び出すことです。次に、ビジネスロジックレイヤーがデータアクセスレイヤーを呼び出します。

特に、アプリケーションが複数の層を使用して設計されていない場合は、MVCコンポーネントの1つにビジネスロジックとデータアクセスを混在させるコードが見つかることは珍しくありません。ただし、ほとんどのエンタープライズアプリケーションでは、プレゼンテーションレイヤー内にMVCアーキテクチャを備えた多層アーキテクチャが一般的です。


2
問題に関して最良の答え。上位投票する必要があります。最悪の回答は承認済みとしてマークされます。
Peter Matisko

ベストアンサー。間違いなく
salman

これはデータとアプリケーションのサイズに依存しますか?小さなアプリの場合、すべてのロジックが混乱なくモデルに組み込まれると思います。もしそうなら、別のレイヤーに分離し始めるためのサイズのしきい値は何ですか?
mLstudent33

15

これは回答済みの質問ですが、「1セント」を差し上げます。

ビジネスルールはモデルに属します。「モデル」は常に(論理的または物理的に分離されて)構成されます。

  • プレゼンテーションモデル -ビューでの使用に適した一連のクラス(特定のUI /プレゼンテーションに合わせて調整されています)、
  • ドメインモデル - モデルのUIに依存しない部分
  • リポジトリ -「モデル」のストレージ対応部分。

ビジネスルールはドメインモデルに存在し、プレゼンテーションに適した形式で「プレゼンテーション」モデルに公開され、「データレイヤー」で複製(または強制)される場合があります。


5

ビジネスレイヤーをMVCプロジェクトのモデルに配置しても意味がありません。

上司がプレゼンテーション層を別のものに変更することを決定したとしたら、あなたはうんざりするでしょう!ビジネス層は別のアセンブリである必要があります。モデルには、ビューに渡して表示するビジネスレイヤーからのデータが含まれています。次に、たとえば投稿時に、モデルはビジネスレイヤーにあるPersonクラスにバインドし、PersonBusiness.SavePerson(p);を呼び出します。ここで、pはPersonクラスです。これが私がすることです(BusinessErrorクラスはありませんが、BusinessLayerにも入ります):ここに画像の説明を入力してください


この説明を明確にしていただけますか?「モデルには、ビューに渡して表示するビジネスレイヤーからデータが含まれています。」
Anthony Rutledge

2

Q1:

ビジネスロジックは、次の2つのカテゴリで検討できます。

  1. 電子メールアドレスの制御(一意性、制約など)のようなドメインロジック、請求のための製品の価格の取得、または製品オブジェクトに基づくshoppingCartの合計価格の計算。

  2. 学生の登録プロセスの制御など、ビジネスプロセスと呼ばれるより広く複雑なワークフロー(通常、いくつかのステップが含まれ、さまざまなチェックが必要であり、より複雑な制約があります)。

最初のカテゴリはに入りモデル第二 1はに属しコントローラ。これは、2番目のカテゴリのケースが広範なアプリケーションロジックであり、モデルにそれらを配置すると、モデルの抽象化が混在する可能性があるためです(たとえば、これらの決定を1つのモデルクラスに配置する必要があるかどうかは明確ではありません。両方へ!)。

モデルとコントローラーの具体的な違いについては、この回答を参照してください。このリンクで非常に正確な定義を確認し、このリンクでAndroidの優れた例を確認できます。

重要なのは、上記の「マッド」と「フランク」の両方が「ピート」(ビジネスロジックは、ビジネスロジックの種類に応じてモデルまたはコントローラーに配置できる)と同様に真実である可能性があるということです。

最後に、MVCはコンテキストごとに異なることに注意してください。たとえば、Androidアプリケーションでは、Webベースの定義とは異なるいくつかの代替定義が提案されています(たとえば、この投稿を参照してください)。


Q2:

ビジネスロジックはより一般的であり(上記の「デサイクロン」のように)、それらの間には次の関係があります。

ビジネスルール⊂ビジネスロジック


0

サービスレイヤーを導入してみませんか?そうすれば、コントローラーは無駄がなく読みやすくなり、すべてのコントローラー機能は純粋なアクションになります。サービスレイヤー内で必要なだけビジネスロジックを分解できます。コードの再利用性は高いです。モデルとリポジトリへの影響はありません。


-5

モデル= CRUDデータベース操作のコード。

コントローラー=ユーザーのアクションに応答し、組織に固有のビジネスルールに従って、データの取得または削除/更新のユーザー要求をモデルに渡します。これらのビジネスルールは、ヘルパークラスに実装することも、複雑すぎない場合はコントローラーアクションで直接実装することもできます。最後に、コントローラはビ​​ューにそれ自体を更新するように要求し、新しい表示や「更新、ありがとう」などのメッセージをユーザーにフィードバックします。

ビュー=モデルのクエリに基づいて生成されるUI。

ビジネスルールをどこに適用するかについて、厳格なルールはありません。一部の設計ではモデル化されますが、他の設計ではコントローラーに含まれています。しかし、私はそれらをコントローラーと一緒に保つ方が良いと思います。モデルはデータベース接続のみを考慮します。


ビジネスルールをコントローラーに配置し、アクションが多数ある場合、ビジネスルールを何度も複製しますか?いいえ。ヘルパーメソッドまたは何らかのクラスで分離します。その「もの」をモデルが属する場所に置きます。
G.ストイネフ2013

3
MVCはCRUDデータベース操作のアプリケーションパターンではありません(そのように使用できます)。したがって、モデルを「CRUDデータベース操作のコード」にすることはできません。モデルは、データやビジネスルールなど、アプリケーションのエンティティを定義します。コントローラは、ビューとモデルの間の相互作用を調整します。ビューは、モデルを公開するユーザーインターフェイスと、コントローラーによって公開されるモデルで使用可能な操作です。
Jon Davis
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.