2つのコードスニペットがあります。
someObject.getBla1().getBla2().performBlah();
そして2番目のもの:
bla1=someObject.getBla1();
bla2=bla1.getBla2();
bla2.performBlah();
私はいつも最初のものを避けて2番目のものを使うように言われますが、2番目のものはただの痛みだと感じています。
2番目の利点は何ですか?
2つのコードスニペットがあります。
someObject.getBla1().getBla2().performBlah();
そして2番目のもの:
bla1=someObject.getBla1();
bla2=bla1.getBla2();
bla2.performBlah();
私はいつも最初のものを避けて2番目のものを使うように言われますが、2番目のものはただの痛みだと感じています。
2番目の利点は何ですか?
両方の形式を避けてください。デメテルの法則は、次のようなソフトウェアを作成する際の重要なガイドラインです。
各ユニットは、他のユニットについての知識が限られている必要があります。現在のユニットに「密接に」関連しているユニットのみです。
各ユニットは、その友人とのみ話す必要があります。見知らぬ人と話をしないでください。
直接の友達とだけ話してください。
あなたはこの法律に違反しているのは、それが方法を持っているsomeObject
ことを知っているからです。本当にこの種の方法が必要な場合は、外の世界に移動したり、外の世界から隠したりします。bla2
performBlah
someObject
bla1
bla2
someObject.getBla1().getBla2().performBlah()
その後、になりsomeObject.performBlah()
、の内部実装someObject.performBlah
はおそらく委任され、実装を取得するためbla1
に委任さbla2
れます。重要なことは、各オブジェクトがその直接の友達だけを知っていて、より広い世界に手を差し伸べないようにすることです(たとえば、someObject
についてだけ知っているbla1
、についてbla1
だけ知っているbla2
)。
例外などの障害が発生した場合、それが発生した行が表示されるため、最初の例のようにドットチェーンを回避する必要があります。したがって、最初のケースでは、同じ行に多くの呼び出しがあります。このようにすると、どの呼び出しが例外(たとえば、nullポインター例外)をスローしたかを知ることができなくなります。2番目の例では、「クリーン」ではないように見えますが、どの呼び出しが失敗したかが正確にわかるため、実際には失敗を見つけるのが簡単です。
2つ目は、あなたが正確に何をしているのかをより明確に理解するのに役立ちますが、オブジェクトとメソッドが流暢なインターフェースを提供する限り、2つ目は個人的に問題はないと思います。