MVCデザインのどこにビジネスロジックを配置しますか?


44

データフォームを介してデータベースにレコードを追加する簡単なMVC Javaアプリケーションを作成しました。

私のアプリはデータを収集し、検証して保存します。これは、データがさまざまなユーザーからオンラインで調達されているためです。データは本質的にほとんど数値です。

データベース(SQLサーバー)に格納されている数値データで、計算を実行して結果を表示するアプリを作成します。ユーザーは計算の実行方法に関心がないため、カプセル化する必要があります。ユーザーは、単純な計算データ(たとえば、A列データからB列データをC列データで除算したもの)のみを表示できる必要があります。同じストアドプロシージャを記述する方法は知っていますが、3層アプリが必要です。

データベースにレコードとして入れて、計算を実行して処理したデータが必要です。元のデータは影響を受けないまま、計算後の新しいデータは新しいエンティティレコードとしてデータベースに保存する必要があります。

このバックグラウンド計算用のコードはどこに書くべきですか?ルールとビジネスロジックなので、新しいJavaBeansファイルに入れる必要がありますか?


回答:


83

ビジネスロジックは中に置かれるべきモデル、そして私たちは脂肪を目指すべきであるモデルとスキニーのコントローラ

開始点として、コントローラーロジックから開始する必要があります。例:updateの場合、コントローラーは、モデルに変更を配信するメソッド/サービスにコードを送信する必要があります。

モデルでは、アプリケーションのビジネスルールまたは計算を検証できるヘルパー/サービスクラスを簡単に作成できます。

概念的な要約

  • コントローラーはアプリケーションロジック用です。アプリケーションが所属する「知識の領域」と対話する方法に固有のロジック。

  • このモデルは、アプリケーションに依存しないロジック用です。このロジックは、それが属する「知識の領域」のすべての可能なアプリケーションで有効でなければなりません。

  • したがって、すべてのビジネスルールをモデルに配置することは論理的です。


3
素晴らしく明確で簡潔な答え
.-- hanzolo

@Yusubovは、あなたが私のアプリケーションロジックとビジネスロジックの違いを説明することができるしてください
モハマド

1
@Moh、要するに、これらはアプリケーションのテクノロジーの層を説明するのに役立つ話題の言葉です。ビジネスロジックは、基本的に機能仕様に応じたシステムのルールです。たとえば、タイプBのオブジェクトAには属性CとDが必要ですが、Eは必要ありません。アプリケーションロジックは、JavaサーブレットとOJBを使用してOracleデータベースに永続化するような技術仕様です。
ELユスボフ

ですが、あなたはこれらの単語について詳しく説明してください:The most common mistakes are to implement application logic operations inside the controller or the view(presentation) layer.[ php-html.net/tutorials/model-view-controller-in-php ]
REVO

1
私が正しいと理解した場合、言及された記事は「アプリケーションロジック」を「ビジネスロジック」と呼びます。したがって、ビジネスロジックを参照するものはすべて、コントローラーまたはビューに配置しないでください。
ELユスボフ

20

いつものように、それはプロジェクトの複雑さに依存します。

ドメインモデルの複雑さが比較的小さい単純なアプリケーションでは、モデルにロジックを入れて1日で呼び出すことができます。

ただし、複雑なモデルと多数のビジネスルールを使用する自明でないアプリケーションの場合は、物事をもう少し分離する方が適切です。

モデルに複数のモデルを含むビジネスロジックを配置すると、それらのモデル間に密結合が生じます。アプリケーションが成長し続けるにつれて、これらのモデルはになりgod modelsすぎて、あまりにも多くを知るようになります。そして、これはすぐにテストと保守が難しい大きな混乱に変わります。そのため、この場合、ロジックを別のレイヤーに配置することが有益です。

抽象化を決定するときは、常にアプリの複雑さと目的を考慮し、過剰なエンジニアリングを避けてください。些細な/小さなアプリケーションの場合、必要以上のレイヤーを導入すると、レイヤーを減らす代わりに複雑さが増します。

Robert Martin(Uncle Bob)には、このテーマに関する優れたブログ投稿があります:The Clean Architecture。


質問はMVCに固有のものでした。ビジネスロジックは常にモデル内にある必要があります。コントローラーは単なるアダプターです。
jgauffin

6
MVCは、業界で最も過負荷な用語の1つです。本を保証するので、私はこの用語の癖にはなりたくない。ただ、MVCを使用しても、モデルにすべてのロジックを配置する必要があることを意味するわけではありません。
ハカンDeryal

1
Steve Burbeck(Smalltalkチーム)の定義から:The controller interprets the mouse and keyboard inputs from the user, commanding the model and/or the view to change as appropriate。それはアダプターの定義です。
jgauffin

4
モデルにすべてのロジックを配置すると、メンテナンス不能な混乱の何千行にもなります。行ったことがある。ユーティリティクラスとサービスレイヤーを持つことは罪ではありません。
asthasr

jgauffinが得ていたのは、MVCに固有の質問だということです。我々はMVCの視点のみMVCの観点からシステムを表示することに同意する場合は、[はい、ビジネスロジックのすべてが「モデル」に属するが、「モデル」も包含する「ユーティリティクラス」を含む複数のクラスとレイヤーを、 「サービス層」。別の言い方をすれば、サービスレイヤーがコントローラーまたはビューの一部であるとは言いません。したがって、最適なのはモデルです。
-DavidS

5

モデル内にビジネスロジックを配置すると、最適な方法に聞こえるかもしれません。コントローラーは、リモートWebアプリから呼び出しを受信します。MVC Webサービスのコントローラーは呼び出しを受け取り、実行をBLのメソッドにリダイレクトします。現在、ビジネスロジックは「モデル」に含めることができますが、「ビジネスロジック」など、他のフォルダーに配置することもできます。そのため、ビジネスロジックをどこに配置するかについての厳格なルールはありません。

MVC 3.0で構築されたWebサービスを使用しており、ビジネスロジックのコンテナーはMVC MODELです。


同意する。モデルが他のビジネスロジッククラスの影響を受けるデータ構造である場合、より柔軟なアプリケーションが得られます。簡単な例として、属性を使用した検証に対するASP.NETのアプローチの大きな失敗だと思います。Required属性でPersonのFirstNameプロパティに注釈を付けた場合、FirstNameを必要としない管理ビューを作成するとどうなりますか?ビジネスロジックレイヤーはモデルを使用し、モデルに適したアクションを決定する必要があります。
xr280xr
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.