System.out.println
デメテルの法則に違反しますか?
そうでない場合、なぜですか?
見方次第。
LoD: はい、コンソールを使用するためです。LoD では、アクセスを想定できません。
LoD-F: はい、複数のドットを使用するためです。LoD-F は、どのメソッドの使用においても、オブジェクトのみが自身の内部構造を知っている可能性があると述べています。IE
System.out.println()
println() に到達するには、システムの構造 (.out があること) の知識が必要です。
システムが LoD-F を壊さないようにするには、次のようにする必要があります。
System.println()
例で正式な規則を分解すると、println() (メソッド) は以下にのみアクセスできます。
(コードはそれを呼び出すメソッドである必要があるため、ここでは逆参照ですが、実際には両方の方法でスイングします。)
System.out
は実際には「グローバルな状態」であり、技術的には「デメテルの法則」に違反しています。だが:
System.out.println(..)
。代わりにロガー(log4j、logback、slf4j)を使用してください。いいえ。
System.out
グローバル変数です。
より正式には、関数のデメテルの法則は、オブジェクト O のメソッド m が次の種類のオブジェクトのメソッドのみを呼び出すことができることを要求します:[2]
- 〇そのもの
- m のパラメーター
- m 内で作成/インスタンス化されたオブジェクト
- O の直接コンポーネント オブジェクト
- m <- This oneのスコープ内で、O によってアクセス可能なグローバル変数
--ウィキペディア
System.out
5 番目の規則により、任意のコンテキスト内からグローバル変数の任意のメソッドを呼び出すことができます。
「複数のドット」を使用しているため、法律に違反し、println呼び出しに別のオブジェクトを使用しているという事実を明らかにします。
Object.toString()
それは呼び出しを行い、どのクラスとも緊密に結合しないため、実際にはそうではないと思います。オブジェクトにそれ自体を文字列に変換するように指示するだけです。
編集:
System.out
呼び出しで何が起こるかではなく、呼び出し自体を意味する場合は、プログラムをフィールドに緊密に結合するため、そうだと思います。