- - PR -
美しい設計方法について
投稿者 | 投稿内容 |
---|---|
|
投稿日時: 2008-07-26 01:37
ビジネスロジックからデータアクセスオブジェクト呼び出しの引数についてですが
どのような引数の型が適切でしょうか。 前提: ビジネスロジック → DBコネクション・セッション取得 コミット・ロールバック制御を行うクラス データアクセスオブジェクト → SQL文作成・実行 目的: インターフェイスの設計 [ メッセージ編集済み 編集者: taka 編集日時 2008-07-26 01:38 ] |
|
投稿日時: 2008-07-26 03:08
takaさん、こんにちは。
丁度、Eric Evansの Domain-Driven Designの p.99-101を読んでいた所で、Value Objectが良いのではないかと思いました。 しかし、ビジネスロジックの前提は私の理解とは異なるので、takaさんの期待するものとは違うかも知れませんね。 |
|
投稿日時: 2008-07-26 03:28
Kissingerさん
ご回答ありがとうございます。 わかりづらい質問申し訳ありません。 下記のサイト引用:*********************************************************** モデルは、システムの中でビジネスロジックを担当する、いわばシステムの本体部分にあたります。 http://www.atmarkit.co.jp/fjava/javafaq/j2ee/j2e07.html ***************************************************************************** MVCモデルのモデルの部分をさらに分割し ビジネスロジック サービスロジック(先ほどビジネスロジックと言ったもの) データアクセスロジック としています。 余計わかりづらくなったかも・・・ Domain-Driven Design今、検索しました。 ぜひ呼んでみたいと思いましたが翻訳でてないんですね・・・(英語を倦厭してはいけないのはわかっているのですが) Value Objectが良いとのことですが実際、実装する際、複数の引数を渡す場合があると思いますが その場合map、list、配列もしくはbeanクラスどのような型がよいのでしょうか。 |
|
投稿日時: 2008-07-26 12:12
例えばStrutsのActionFormなどのフレームワーク固有のオブジェクトを、
ビジネスロジックへの引数として渡すのだけはあり得ません。 これは、非WEB層(バッチなど)でも利用したい場合に、 ActionForm依存が発生する為です。 でなければ、ぶっちゃけ何でもいいと思いますが、私はBean派ですね。 IDEでフィールドを書いてgetter/setterの自動生成で直ぐ作れるうえ、 コード補完という恩恵が受けられます。 Mapのような型で、投げるSQLがselect * from...みたいなSQLだと、 DBのカラムを追加してJSPを修正すれば、 リロードせずに動作確認できるというメリットもあります。 |
|
投稿日時: 2008-07-26 13:01
これは、Aggregatesでしょうか。
どれを使っても実現できるでしょうが、『美しい設計』というなら配列は没ですね。 配列は単純ですが、変更できてしまうし。 あと、Map, Listを使うなら、専用の物がいいと思います。 Beanの場合も setterなしで。(そんなん Beanと呼びたくはない..?) 実装には setterがあってもいいですが、インターフェースの引数に登場してくるものは setter非公開が必要でしょうね。 # ぉお。MVCでしたか。3層アーキテクチャだと思っていた。 |
|
投稿日時: 2008-07-26 13:09
あっ、かつのりさんも、こんにちは。
takaさんの質問は「ビジネスロジックへの引数」ではなくて、「ビジネスロジックからデータアクセスオブジェクト呼び出しの引数について」のようですよ。 でも、ビジネスロジックへの引数で ActionFormを渡さないのは私も同感です。 |
|
投稿日時: 2008-07-26 13:38
微妙に勘違いですね・・・。
|
|
投稿日時: 2008-07-28 19:05
Kissingerさん
かつのりさん ご回答ありがとうございます。 setter無しというのは以下のようなクラスを利用するということでしょうか。 (例外処理は省いております) public class GetMap { private Map map; public GetMap( Map input) { map = input; } public Object get(String key) { return map.get( key); } } |