8

System.out.printlnデメテルの法則に違反しますか?

そうでない場合、なぜですか?

4

5 に答える 5

2

見方次第。

LoD: はい、コンソールを使用するためです。LoD では、アクセスを想定できません。

LoD-F: はい、複数のドットを使用するためです。LoD-F は、どのメソッドの使用においても、オブジェクトのみが自身の内部構造を知っている可能性があると述べています。IE

System.out.println() 

println() に到達するには、システムの構造 (.out があること) の知識が必要です。

システムが LoD-F を壊さないようにするには、次のようにする必要があります。

System.println()

例で正式な規則を分解すると、println() (メソッド) は以下にのみアクセスできます。

  1. システム自体
  2. println() のパラメータ
  3. println() 内で作成/インスタンス化されたオブジェクト
  4. システムの直接コンポーネント オブジェクト
  5. println() のスコープ内で、システムからアクセス可能なグローバル変数

(コードはそれを呼び出すメソッドである必要があるため、ここでは逆参照ですが、実際には両方の方法でスイングします。)

于 2011-01-01T21:36:59.710 に答える
1

System.outは実際には「グローバルな状態」であり、技術的には「デメテルの法則」に違反しています。だが:

  • の使用は避けてくださいSystem.out.println(..)。代わりにロガー(log4j、logback、slf4j)を使用してください。
  • コンソールへのロギングを目的としたものに依存(およびテスト)することは想定されていません。(これは、後でログに記録された情報を集約する複雑なログシステムには関係ありません)
于 2011-01-01T21:27:38.710 に答える
1

いいえ。

System.outグローバル変数です。

より正式には、関数のデメテルの法則は、オブジェクト O のメソッド m が次の種類のオブジェクトのメソッドのみを呼び出すことができることを要求します:[2]

  1. 〇そのもの
  2. m のパラメーター
  3. m 内で作成/インスタンス化されたオブジェクト
  4. O の直接コンポーネント オブジェクト
  5. m <- This oneのスコープ内で、O によってアクセス可能なグローバル変数

--ウィキペディア

System.out5 番目の規則により、任意のコンテキスト内からグローバル変数の任意のメソッドを呼び出すことができます。

于 2015-10-08T08:06:16.947 に答える
0

「複数のドット」を使用しているため、法律に違反し、println呼び出しに別のオブジェクトを使用しているという事実を明らかにします。

于 2011-01-01T21:22:07.853 に答える
0

Object.toString()それは呼び出しを行い、どのクラスとも緊密に結合しないため、実際にはそうではないと思います。オブジェクトにそれ自体を文字列に変換するように指示するだけです。


編集:

System.out呼び出しで何が起こるかではなく、呼び出し自体を意味する場合は、プログラムをフィールドに緊密に結合するため、そうだと思います。

于 2011-01-01T21:17:48.383 に答える