問題タブ [law-of-demeter]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
javascript - デメテルの法則 - それは本当に友達だけに伝えているのでしょうか?
デメテルの法則に関する記事を読んだのですが、混乱してしまいました。
それは次のようなことを述べています:
これに置き換える必要があります:
後者は最初のものとまったく同じですが、書き方が異なるため、ここで少し混乱しています。どちらの場合も、現在のクラスの直接の友人ではない「幅」に最終的にアクセスしています。
では、なぜ 2 番目の方法が本当に優れているのでしょうか。
pmd - デメテルの法則: 静的プロパティへのアクセス
次のようなコード行があります。
String someString = "something";
if (Foo.SOME_CONSTANT_STRING.equals(someString))
違反の結果:「デメテルの法則(静的プロパティへのアクセス)の潜在的な違反」
ここで推奨されるアプローチは何ですか?
(編集:コード例を変更しました)
oop - golangへの埋め込みはデメテルの法則に違反しますか?
これは、効果的なGOがgolangへの埋め込みについて言わなければならなかったことです
型を埋め込むと、その型のメソッドは外側の型のメソッドになりますが、それらが呼び出されると、メソッドのレシーバーは外側の型ではなく内側の型になります。
Struct User
次のように定義したコードスニペットがありました
そして、などを呼び出します。明らかにデメテルの法則に違反するu.Query("some query here")
ような呼び出しを回避できるように、これを特に行いました。ドキュメントと効果的なgoを読んだ後、最初のアプローチのメリットについても疑問があります。デメテルの法則に違反していますか? はいの場合、どうすれば回避できますか?u.Transaction.Query("query")
java - ゲッターはデメテルの法則に違反していますか?
(メソッドを介して)GameState
を使用する型があったと想像してください。GameContext
process
GameContext には、Player、Shops など、ゲームに不可欠なものが含まれます。
状態は、必要なものにアクセスします。
ステートメントは次のplayer.isAlive()
ように書き換えることができますcontext.getPlayer().isAlive()
。
私の質問
デメテルの法則は、オブジェクトは直接の親戚とのみ相互作用するべきであると述べています。これは原則違反であり、どのように解決されますか?
各状態を動的に処理するには、仮パラメータが可能なすべての状態で受け入れられる必要があります。これにより、オブジェクトに必要なものを厳密に渡すことが難しくなります。これが、各状態が「メイン ソース」から必要なものを取得する理由です。主な情報源は結束力が非常に低いと感じShopState
ます。CombatState
ruby-on-rails - いつデリゲートを使用する必要があり、いつ has_one :through を使用する必要がありますか?
Rails には、モデルでデメテルの法則違反を回避するための 2 つの優れた方法があります。
最初はこれです:
2番目はこれです:
違いはなんですか?一部またはすべてのインスタンスで、あるオプションを他のオプションよりも推奨するものはありますか?
私が検出できる唯一の違いは、delegate
オプションが後者のレコードを取得するために 2 つの SQL クエリを生成するようにbelongs_to :through
見えるのに対し、1 つのクエリでそれを行うように見えることです。
java - 実装の詳細を隠すという点で、他の2つのオブジェクトで構成されるオブジェクトを処理する最良の方法は?
たとえば、タイプ AdminPart と PassengerPart の 2 つのフィールドを含む Car という名前のクラスがあります。
私のコードを使用するクライアント コードの場合、クライアント コードでできることとできないことが必要car.getLicense()
ですcar.getAdminPart().getLicense()
。これはもちろんgetLicense()
、関連する getter を呼び出す Car のように実装されます。セッターも同様。
これに対するベストプラクティスはありますか? 私が見落とした何か?
java - デメテルの法則とは?
ウィキペディアから始めましょう:
より正式には、関数のデメテルの法則では、オブジェクトOのメソッドmは、次の種類のオブジェクトのメソッドのみを呼び出す必要があります。
- 〇そのもの
- m のパラメーター
- m 内で作成/インスタンス化されたオブジェクト
- O の直接コンポーネント オブジェクト
- m のスコープ内で、O からアクセスできるグローバル変数
ルール 1:
ルール 2:
ルール 3:
ルール 4 (@juharr に感謝):
ルール 5:
ルール 5 を手伝ってくれる人はいますか?
そして、デメテルの法則は連鎖が悪いことを暗示していませんか?
これにより、結合度が高くなります。
「聞くな、聞くな」も似たような原理ではないでしょうか。
これで全部ですか?私は何か間違っていますか?どうすればデメテルの法則に従うことができますか?