System.out.printlnはデメテルの法則に違反していますか?
-
14-10-2019 - |
質問
します System.out.println
デメテルの法則に違反しますか?
そうでない場合、なぜですか?
解決
表示に応じて。
LOD:はい、コンソールを使用しているためです。 LODでは、アクセスを想定することはできません。
LOD-F:はい、複数のドットを使用しているためです。 LOD-Fは、任意の方法で使用すると、オブジェクトのみがそれ自体の内部構造を知っている可能性があると述べています。すなわち
System.out.println()
println()に到達するには、システムの構造(.outがある)の知識が必要です。
システムがlod-fを破らないためには
System.println()
正式なルールを例で分割するために、println()(メソッド)はアクセスするだけです。
- システム自体
- println()のパラメーター
- println()内に作成/インスタンス化されたオブジェクト
- システムの直接コンポーネントオブジェクト
- println()の範囲で、システムがアクセスできるグローバル変数
(コードはそれを呼び出す方法である必要があるため、ここでは逆の参照ですが、実際には両方の方法を揺らします。)
他のヒント
System.out
実際には「グローバルな状態」であり、はい、技術的には「デメテルの法則」に違反しています。だが:
- 使用しないでください
System.out.println(..)
. 。代わりに、Logger(log4j、logback、slf4j)を使用します。 - コンソールへのログを目的としたものは何でも依存(およびテスト)することになっていません。 (これは、後で記録された情報を集計する複雑なロギングシステムに関するものではありません)
それが電話するので、私はそうではないと言います Object.toString()
クラスとはいかなる方法でもしっかりと結合しません。それは、自分自身を文字列に変換するようにオブジェクトに指示するだけです。
編集:
コールで起こることではなく、コール自体を意味する場合、それはあなたのプログラムをしっかりと結合しているので、そうすると言います System.out
分野。
「複数のドット」を使用しているため、法律を破り、printlnコールに別のオブジェクトを使用しているという事実を公開します。
いいえ。
System.out
グローバル変数です。
より正式には、関数のデメテルの法則では、オブジェクトoの方法mが次の種類のオブジェクトの方法のみを呼び出すことができます。[2
- oそれ自体
- mのパラメーター
- m内に作成/インスタンス化されたオブジェクト
- Oの直接コンポーネントオブジェクト
- Mの範囲内でOがアクセスできるグローバル変数 < - これ
-- ウィキペディア
5番目のルールでは、グローバル変数の任意の方法を呼び出すことができます System.out
任意のコンテキスト内から。