ビジネス オブジェクト - コンテナまたは機能?[閉まっている]
-
22-09-2019 - |
質問
私の職場では、この問題について何度も議論が行われ、健全性のチェックを求めています。質問は次のとおりです。ビジネス オブジェクトはデータ コンテナ (DTO に似たもの) であるべきか、それともそのオブジェクトに対して何らかの機能を実行できるロジックも含まれている必要があります。
例 - 顧客オブジェクトを考えます。これにはおそらくいくつかの共通プロパティ (名前、ID など) が含まれていますが、その顧客オブジェクトには関数 (保存、計算など) も含めるべきでしょうか?
推論の 1 行では、オブジェクトを機能 (単一責任プリンシパル) から分離し、その機能をビジネス ロジック レイヤーまたはオブジェクトに配置すると述べています。
もう 1 つの推論では、「いいえ、顧客オブジェクトがある場合は、Customer.Save を呼び出して完了したいだけです。」ということになります。オブジェクトを使用している場合に、顧客を保存する方法について知る必要があるのはなぜですか?
過去 2 つのプロジェクトではオブジェクトが機能から分離されていましたが、新しいプロジェクトで再び議論が巻き起こりました。どちらがより理にかなっていますか?
編集
これらの結果は私たちの議論と非常によく似ています。どちらかの側に一票を投じるだけで、方向性は完全に変わります。他に 2 セントを追加したい人はいますか?
編集
回答のサンプルが少ないにもかかわらず、大多数はビジネス オブジェクトの機能は単純である限り許容されますが、永続性は別のクラス/レイヤーに配置するのが最適であると考えているようです。これを試してみます。皆様のご意見ありがとうございます...
解決
オブジェクトは状態と行動一緒にしています。オブジェクトは、すべての手段によって、賢明な行動(例えば、自分の誕生日からの人のための計算、年齢、または請求書の合計税を)持っている場合は、それを追加します。以上のDTOよりも何もないビジネス・オブジェクトは、「貧血ドメインモデル」と呼ばれます。私はそれが設計要件はないと思う。
永続性行動の特別な種類です。私は「賢明な」呼んでいることは、ビジネスの動作です。ビジネス・オブジェクトには、それが永続的だということを知っている必要はありません。私は、DAOが企業行動から永続別々に保つことができると言うだろう。私は「賢明な」カテゴリで「保存」置かないでください。
他のヒント
ビジネスオブジェクト 持てる ビジネス機能.
永続化はビジネス機能ではありません 、ただし技術的な実装です。
長い話を短くすると:
- 保存/更新/削除/検索など - 永続化レイヤー内のビジネス オブジェクトから遠ざけてください。
- CalculateSalary、ApplyDiscount などはビジネス関連のメソッドであり、次のことが可能です。
- ビジネスオブジェクトのメソッド (つまり、BO はエンティティの自己完結型表現です) または;
- 個別のサービス 特定の機能を実装します (そのため、BO は DTO のように動作します)。
ポイント2については。
アプローチ 2.1 では BO が肥大化する傾向があることを言及しておく必要があります。 SRPに違反する. 。2.2 ではさらに多くのメンテナンスが導入されています 複雑.
私は通常 バランス 2.1 と 2.2 の間で、データに関連する些細なことを Business Objects に組み込み、もう少し複雑なシナリオ用のサービスを作成します (コードが 4 行を超える場合はサービスにします)。
これにより、ビジネス オブジェクトのパラダイムが変化し、代わりにデータ転送オブジェクトが増えます。
しかし、これによりプロジェクトの開発、テスト、保守が容易になります。
プラットフォームや言語に関係なく、答えは同じです。この質問の鍵は、オブジェクトが次のようなことができるべきかどうかです。 自律的 または、特定の動作がより多くのオブジェクト間で分散される方が良いかどうか 焦点を絞った責任.
クラスごとに答えは異なる場合があります。最終的に、それに基づいてクラスを配置できるスペクトルが得られます。 責任の密度.
(Level of responsibility for behavior)
Autonomy - - - - - - - - - - - - - - - - - - - Dependence
High
C - <<GOD object>> <<Spaghetti code>>
l -
a -
s -
s -
-
s -
i -
z -
e - <<Template>> <<Framework>>
low
すべての動作をクラスに実行させるか、できる限り多くの動作をクラスに実行させることを好むとします。このグラフの左側から始めて、クラスをより自律的にすると、より汎用的にするために継続的にリファクタリングしない限り、クラスのサイズは大きくなります。これにより、 テンプレート. 。リファクタリングが行われない場合、クラスはさらに「神のようななぜなら、必要な動作がある場合、そのためのメソッドがあるからです。フィールドとメソッドの数は増加し、すぐに管理できなくなり、避けられなくなります。このクラスはすでに多くのことを行っているため、プログラマーは、それをバラバラにしてゴルディアスの結び目を切断しようとするよりも、むしろ怪物性を追加することを好みます。
グラフの右側には、他のクラスに大きく依存するクラスがあります。依存関係のレベルは高いが、個々のクラスが小さい場合、それは問題の兆候です。 フレームワーク;各クラスはあまり機能せず、何らかの機能を達成するには多くの依存クラスが必要です。一方、依存性の高いクラスに大量のコードが含まれている場合は、そのクラスがコードでいっぱいであることを示しています。 スパゲッティ.
この質問の鍵は、グラフ上のどこがより快適だと感じるかを判断することです。いずれにせよ、何らかの組織原則が適用されない限り、個々のクラスは最終的にグラフ上に分散することになります。これが、次の結果を達成する方法です。 テンプレート または フレームワーク.
ここまで書いてきましたが、クラスの規模と組織化の度合いには相関関係があると言えます。ロバート C.Martin (または「Uncle Bob」) は、次の非常に詳細な論文で、パッケージの依存関係に関する同様の分野を取り上げています。 設計原則と設計パターン. J依存 26 ページのグラフの背後にあるアイデアを実装し、補足するものです。 静的解析ツール のような チェックスタイル そして PMD.
私はビジネスが「ハンドル」自分自身に、システム内の他の場所でその負担を配置する必要がありますする方法を知っているオブジェクトのためにそれがより理にかなっていると思います。あなたの例では、最も論理的な場所は、「保存」の顧客データがCustomerオブジェクトに、私には、だろう方法で対処する。
私は、データベースは、「データ・コンテナ」であると考えているので、私は「ビジネスオブジェクト」に賛成ですので、これは、ダイレクトアクセスからデータコンテナを保護し、約標準の「ビジネスルール」を施行し、より高いレベルであることであってもよく、そのデータにアクセスする方法/操作
私たちは何年もロッキーLhotkaのCSLAのフレームワークを使用し、それが設計されている方法を愛してきました。そのフレームワークではすべての機能は、オブジェクトに含まれています。私はロジックをsepartingの値を見ることができますが、私たちはこの理念から、いつでもすぐに離れて切り替えないと思う。
ビジネス・オブジェクトは、データと、そのオブジェクトによってモデル化されたビジネスエンティティの関連する行動をカプセル化であるべきです。このように考えて:オブジェクト指向プログラミングの主要な教義の一つは、そのデータ上のデータと関連した行動をカプセル化です。
持続性は、モデル化されたオブジェクトの動作ではありません。ビジネス・オブジェクトは永続ignornantある場合、私はよりスムーズな開発進行を見つけます。ビジネスオブジェクトは、具体的に根本的な配管に縛られていない場合は、新しいコードをテストし、新しいコードやユニットの開発は、より迅速に、より滑らかに起こります。私はそれらの側面を模擬し、私のユニットテストは、より迅速に実行されるデータベース等、を取得するためにフープを介して移動することを忘れることができるからである(あなたが自動化されたテストの数千を持っている場合は大きなプラスを、各ビルドと実行)とI私は道、これらの側面(データベース接続などにより、ああ、あなたは、多くの場合、リモートでオフラインで作業したり、場合(理由は、データベース接続の問題の大失敗のテストを持っていないと、常にデータベースにアクセスすることはできませんとため)あまりストレスをすべきである必要があります他の場所でテストすること!)。
私はちょうどCustomer.Save
を呼び出すようにし、それを行うことがしたい顧客のオブジェクトを持っている場合は、推論の他の行は、ありません、と言います。なぜ私は、オブジェクトを消費していた場合に顧客を保存する方法について知っておく必要がありますか?
Customer
がSave
メソッドを持っていることを知ることは、顧客のオブジェクトを保存する方法を知って、すでにあります。あなたは、あなたのビジネス・オブジェクトでそのロジックを埋め込むことによって、問題を回避していません。代わりに、あなたはよりしっかりとあなたのコードベースを作っ連結され、したがって、困難維持し、テストしてきました。他の誰かにオブジェクトを永続化の責任をオフにプッシュします。
ビジネスは、明らかに、サービス層にあるドメイン間でのビジネス・ロジックの動的に独自のビジネス・ロジックをcoutainする必要があり、それらが命名されているように、オブジェクトます。
は反対側で、BOは、データコンテナ(?DTO)組成物および方法であってもよいです。 BOは純粋functionnalがされているという意味しますか?それはBOとDTOの間のすべての変換を避けることができます。
MVCアーキテクチャでは、
私たちは、モデルは、ビジネス・オブジェクトが含まれていることを言うことができます。