2016-12-12 6 views
0

現実世界の法則(私のアプリケーションとも呼ばれます)をよりよく理解しようとしていますが、私はチェーンの辞任時に得られる理由と利点についていくつか混乱しています。責任。Demeterの法則 - 現実世界の問題

ここでは、使用を検討している例があります。今、私はいくつかの企業データ、元にアクセスする必要がある関係

Enquiry -> assignedTo -> Room Rooms -> assignedTo -> Building Building -> assignedTo -> Company

を持つクラスがあります。会社名、私はInquiryにアクセスできます。だから私の現在の流れは: enquiry.getManager().getRoom().getBuilding().getCompany().getName() - かなり長いですね。

私はのLoDに従うならば、それはenquiry.getHostingCompanyName()に変更されるべきだと思うが、それは私が room.getHostingCompanyName()building.getHostingCompanyName()先行を作成する必要があるように思われ、その結果として、それは非常に壊れやすいだろうとよりもはるかに多くの変更が必要になります以前のアプローチではリファクタリングになります。

これに関するアドバイスはありますか?あるいは、私の前提は完全に間違っていて、別のやり方で行うべきでしょうか?

答えて

3

オブジェクトは使用していませんが、データ構造のみです。代わりの

new Human().eat(new Cake()); 

実際のオブジェクトは、内部構造を表示/非カプセル化、およびドメイン固有のAPIを公開する必要があり

new Human().getStomach().getContent().insert(new Cake()); 

: あなたのような何かを書きます。私にとっては部屋に会社が含まれているのはちょっと変だ。

私の意見では、部屋は会社を知らなくてはなりません。代わりに会社の部屋から部屋の参照を取得する必要があります。

あなたのオブジェクト構造はデータベースによって駆動されているようですが、それは良くありません。

リッチドメインシステムに適用した場合、上記のすべてが意味を持ちますが、些細なCRUDではそうではありません。 CRUDシステムでは、データ構造がより良く機能します。

0

the Law of Demeter(またはthe Principle of Least Knowledge)の実世界の問題は、このようなものになる:

ああDRATを、ちょうど実現した建物は、常にただ一つの会社に割り当てられていません。このクラスのインタフェースを変更する必要があります。それは大きな変化です。まあ、このクラスの友人を切り上げて、それらを変更する...一体なぜ101のエラーを引き起こしていますか? 1人のクラスには何人の友達が必要ですか?

Demeterの法則はカプセル化に関するものです。それはあなたがあまり聞くことのないカプセル化の一種です。通常、カプセル化はオブジェクト内のものについてです。ここでは、オブジェクトそのものに関する知識です。

あなたのオブジェクトには他の世界を扱う少数の友人がいるので、そのオブジェクトは公開されていても実際にカプセル化されている必要はありません。これは、外界からのオブジェクトがそれらの友人を通してオブジェクトに到達する場合、真ではありません。これであなたのオブジェクトはどんなオブジェクトでも知ることができました。これは修正する必要があります。オブジェクトは友人の背後に隠れる。人気がないことを望んでいません。彼らはいくつかの親しい友人のために少し仕事をしたい。彼らはカプセル化したい。

これは、このカプセル化を破っていることを友人の友人に依頼する必要がある場合にその理由です。あなたはあなたのために何かをし、彼らの友人が誰であるか心配しないようにあなたの友人に伝えるべきです。あなたは十分な友人がいる。

あなたが自分の必要とするものを得るためにクラスに到達する必要があると分かった場合、あなたが到達しようとしているクラスを知らなくても済むような仕事が残されています。仕事をして、すべてのことにとても親しみを止めてください。

さらに詳しい情報が必要な場合は、これについて実際に書いたbeforeです。

関連する問題