- - PR -
ビジネスロジックについて
投稿者 | 投稿内容 | ||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2005-07-05 21:38
私は今javaの勉強をしているのですが、
度々人に言われるビジネスロジックというのが、 よく分かりません。 一応、教わった時は、 ビジネスロジック層とプレゼンテーション層はプログラムを分け、 データベース操作をするものは、 ビジネスロジック層であり、 データベースを接続したり、どのデータベースと接続するのか?を選択するのが、 プレゼンテーション層と教えてもらいました。 その時は、一応は納得出来ましたが、 いざ作業を行おうとすると、これはビジネスロジック層に入れるべきなのか? とよく迷います。 http://www.stackasterisk.jp/tech/java/mvc01_01.jsp 上記のような所を読んで勉強しているのですが、 実際javaのプログラムにするとどうなるのか?よく分かりません。 今は、なんでもビジネスロジック層に入るような状態です。 上記のホームページで書かれてある、 「まずModelですが、これはビジネスロジックを書く部分で、しかも特定の実行環境に依存しない部分ですから、JavaBeansに担当させるのがよいでしょう。javax.servlet.httpパッケージのクラス(HttpSessionやHttpServletRequestなど)が混入してきたら多くの場合切り分けがうまくいっていません。その場合Controllerにその処理を移動させるべきケースが多いかと思います。 」 と書いてあるのですが、ここが一番良く分かりません。 混入した場合、切り分けがうまくいかないというのは、何故なのでしょうか? 他にもcontrollerは、servletという考えを持っているのですが、合っていますでしょうか? ビジネスロジック層とプレゼンテーション層の意味と、 何故この二つはしっかりと分けないといけないのか? 誰か教えていただけませんでしょうか? このホームページが分かりやすいというのでも何でも良いので、よろしくお願いします。 | ||||||||||||||||
|
投稿日時: 2005-07-05 23:39
多層アーキテクチャと、各レイヤの役割を意識するのは非常に重要ですね。
これは私の認識とは違います。 ・データベース操作は、インテグレーション層等といわれるレイヤで行う ・ビジネスロジック層は例えば金額の計算等の業務処理を行う部分 ・プレゼンテーション層は、ユーザインターフェース(WebであればHTMLを生成する等)を担う と思っています。
HttpSessionやHttpServletRequestは、Servlet APIで定義・提供されるオブジェクトです ので、それを使用している範囲を可能な限り狭くしてやるほうが良いという意味と思います。 一般的に特定のAPIに依存する部分は少なければ少ないほど良いです。
いわゆる、MVCモデル2においては、ControllerはServletですね。
レイヤを責任を明確にして、実装する場所を規定することにあると思います。 つまり、上述したように ・プレゼンテーション層は、ユーザインターフェースに専念する ・ビジネスロジック層は、業務処理に専念する という風に明確に責任を分けることで、例えばHTML以外のユーザインターフェースを 使用する事になった場合、ビジネスロジック層を再利用できます。 また、ユーザインターフェースと業務処理を別の開発者が分担して開発したりすることもできますね。 これらが混在すると、このようなメリットを享受できません。 また、ユーザインターフェースは変更が入りやすい部分でもありますが、 ユーザインターフェースと業務処理が混在していると、単に画面表示を変えたいだけなのに、 業務処理に影響してしまったりします。 人間は考える範囲が狭ければ狭いほど、集中して作業でき、ミスも減りますので、 できるだけ役割毎に明確に分離し、同時に考えなければならない範囲を狭めてやるのは 基本だと思います。 | ||||||||||||||||
|
投稿日時: 2005-07-05 23:41
はじめまして
引用レスです
これはMVCでいうとControlerの部分の役割かとおもいます。 プレゼンテーション層はシステムのI/O部分を担う役割 でありInuputがControler,OutPutがViewに相当するのかとおもいます。 ただ、Controlerの役割はこれが本質ではないかとおもいます (データベース接続は基本的に同じ処理ですし、リクエストに応じてDB接続先も変更するケースは少ないかとおもいます)
処理の本質はI/Oをいかに確定するかにかかっているとおもいます。 JAVAでいうとメソッド単位が最小ですが、ここのI/OとHTTPリクエスト・レスポンス とのI/Oとはその性質上確定までに時系列的に差異が生じます。 そのために切り分けが必要なのかとおもいます。 これはオブジェクト指向うんぬんでなく構造化プログラミングの基本かとおもいます。 答えになっていますか? | ||||||||||||||||
|
投稿日時: 2005-07-06 11:04
こんにちわ。
こういうのって「概念」なんで、なんやかんや言われて 学習するよりは、やってみて体で覚えた方が手っ取り 早いというか理解しやすくなりますよ。 何度も作ってみて、感じがわかってきたら、「ああ、前 言ってたことはこういう感じだったのか」とわかる時が あると思います。 一般的に言われているMVCなんてのも、今や3層ではおさ まらず、先に言われている通り、DB操作はまた別の層だ とか人によっても「美学」が違ってきますからね。
これも実際何度も作ってみれば、なぜ切り分けがうまく行かないか 実感できると思いますよ。 そもそも、HttpRequestやHttpResponseなどは特定のレイヤに依存する オブジェクト達ですから、それがビジネスロジックに関与してくると移 植性がグンと下がります。 HttpRequestなどはControlerであるServletの中だけで処理を完結すべき だとは思いますよ。 | ||||||||||||||||
|
投稿日時: 2005-07-06 12:04
unibon です。こんにちわ。
「これ」とは具体的にはどれでしょうか? なお、Model や View は相対的な概念なので、凝った View の仕組みを作ろうとすれば、その View をさらに Model と View に分ける必要があります。簡素な JSP で作るだけなら Model と View に分けるのは容易ですが、たとえばページ替え(項目番号 1〜20, 21〜40, ... でページ番号を p.1, p.2, ... に分けるなど)の仕組みの View を作ろうとすれば、現在のページ番号を Model として持つ必要があります。 | ||||||||||||||||
|
投稿日時: 2005-07-09 23:15
いろいろとありがとうございます。
正直、難しいというのが今の現状です。 (今日、javaの本を買ってきました) 読んでもまだ理解出来ない箇所がいろいろとあります。 それで、また質問になるのですが、 例えば、私は今、javaの勉強をしつつ、プログラムの勉強の為に、 PHPで掲示板を作ったりしているのですが、 この掲示板でも、ビジネスロジック層やプレゼンテーション層という考えがあるのでしょうか? みなさんの書き込みを見ると、 私なりに、 表示画面の送信ボタンを押した時に、 POSTでデータを送ったりする箇所が、コントロール層? 掲示板の内容のデータを処理するのが、ビジネスロジック層? 最後にHTMLを返すのが、プレゼンテーション層? だと思っているのですが、 このような分け方で合っているのでしょうか? あるいは、掲示板ではこういう分け方が出来ないのでしょうか? よろしくお願いします。 | ||||||||||||||||
|
投稿日時: 2005-07-09 23:58
各レイヤの意味・責任範囲を考えるとわかりやすいのではないでしょうか。
プレゼンテーション層:ユーザとのインタラクションを担当し、 ユーザ操作をビジネスロジック層に伝達、 ビジネスロジック層の結果等をユーザに提示(表示など) ビジネスロジック層:アプリケーションが提供するサービスの ロジックを知識として持っていて、 意味的な操作を論理的な(プログラムとしての)操作に変換、 実行してその結果を返すことができる。 データ層:アプリケーションが利用するデータを保持する。 こんなふうに理解してます。 これをベースに、個別の実現ごとに中間層を設けたり 役割範囲を少し移動させたりしてます。 掲示板の例で言えば、POSTはユーザ操作を受け付けて ビジネスロジック層に伝えるので、プレゼンテーション層。 データ処理や結果をHTMLに変換するのはビジネスロジック層かな。 MVCだと、POST、HTML変換の部分はView、データ処理はControllerかなぁ entity,boundary,controllerというパターンも調べてみると 理解が進むかもしれません。 | ||||||||||||||||
|
投稿日時: 2005-07-10 02:41
現在はphpの勉強の為に掲示板を作成していて、
また少し迷ったので、書かして頂きます。 (javaの本も少しづつ読んでいる状態です) 本当に初歩的でスミマセン。 javaではなくてphpなのですが、 一応ファイルを、 3つ作って、 ビジネスロジック層用ファイル プレゼンテーション層用ファイル 共通の変数を置くファイルを現在作っています。 まず、何処かのHTMLのボタンを押すと、 プレゼンテーション層のファイルが動き、掲示板が表示されます。 そこで、データ登録をするための管理人専用のページに飛ぶプログラムを作成をしました。 管理人のパスワードを入れるテキストボックスがあり、 そして、送信ボタンがあり、送信ボタンを押すと、認証プログラムが動きます。 簡単に書くと、下記のような感じです。 --------------------- <?php if(checkUser($_SERVER["PHP_AUTH_USER"],$_SERVER["PHP_AUTH_PW"],"password","password")==false){ include("エラー.html"); exit(); } return true; ?> --------------------- checkUserが基本認証を行っている独自の関数です。 認証失敗したら、エラーのhtmlを表示します。 こうした時、$_SERVER["PHP_AUTH_USER"]の箇所で、 データが受け取れるのですが、 これは、今までのみなさんのアドバイスだと、 プレゼンテーション層の処理(値の受け渡し)?になると思い、 checkUserの独自関数が、ビジネスロジック層となるのですが、 これを作成した時に、 $_SERVER["PHP_AUTH_USER"]をプレゼンテーション層に置くのか?が凄く迷っています。 $_SERVER["PHP_AUTH_USER"]だけで値が取れるにも関わらず、 このような短いプログラムもプレゼンテーション層を置かないといけないのか? と感じてしまいます。 プレゼンテーション層に書こうとすると、 適当な値に入れて、 value = $_SERVER["PHP_AUTH_USER"] checkUser(value,・・・ このような感じでただ値を渡しているだけの状態になってしまいます。 これが意味のある事なのかな?と感じてしまいます。 (今は全部ビジネスロジック層に入っている状態です) 私が完璧に分かっていないので、質問が少し分かりにくいかもしれませんが、 この事に関してアドバイス頂けたら光栄です。 よろしくお願いします。 |