Frage

Tut System.out.println gegen das Gesetz des Demeter verstoßen?

Wenn nicht, warum?

War es hilfreich?

Lösung

Abhängig von Sicht.

LOD: Ja, weil es die Konsole verwendet. Unter LOD können Sie keinen Zugang übernehmen.

LOD-F: Ja, weil es mehr als einen Punkt verwendet. Der LOD-F gibt an, dass in jeder Methode nur das Objekt die interne Struktur von sich selbst kennt. Dh

System.out.println() 

erfordert Kenntnis der Struktur des Systems (dass es .OUT hat), um Println () zu erreichen.

Damit das System LOD-F nicht brechen müsste, müsste es sein

System.println()

Um die formalen Regeln mit einem Beispiel zu brechen, kann Println () (die Methode) nur zugreifen:

  1. System selbst
  2. Println () -Parameter
  3. Alle Objekte, die in println () erstellt/instanziiert wurden)
  4. Die direkten Komponentenobjekte des Systems
  5. Eine globale Variable, die nach System zugänglich ist, im Bereich von println ()

(Ich weiß, es ist eine umgekehrte Referenz hier, da der Code die Methode sein sollte, die sie aufruft, aber sie schwingt tatsächlich in beide Richtungen.)

Andere Tipps

System.out ist eigentlich ein "globaler Staat" und ja, technisch verstößt es gegen das "Gesetz des Demeter". Aber:

  • Sie sollten es vermeiden, zu verwenden System.out.println(..). Verwenden Sie stattdessen einen Logger (log4j, Logback, SLF4J).
  • Sie sollten sich nicht auf etwas verlassen (und testen), was zum Zwecke der Anmeldung bei einer Konsole dient. (Dies betrifft keine komplexen Protokollierungssysteme, die später die protokollierten Informationen aggregieren.)

Ich würde nicht wirklich sagen, da es anruft Object.toString() und passt in keiner Weise mit irgendeiner Klasse fest; Es fordert nur das Objekt an, sich in eine Zeichenfolge umzuwandeln.


Bearbeiten:

Wenn Sie den Anruf selbst meinen, anstatt das, was im Anruf passiert, würde ich sagen, dass es so ist, weil er Ihr Programm eng an der System.out aufstellen.

Es bricht das Gesetz, da es "mehr als einen Punkt" verwendet und die Tatsache enthüllt, dass es ein anderes Objekt für den Println -Anruf verwendet.

Nein.

System.out ist eine globale Variable.

Formaler fordert das Gesetz von Demeter für Funktionen vor, dass eine Methode m eines Objekts O nur die Methoden der folgenden Arten von Objekten aufrufen darf: [2

  1. O selbst
  2. Ms Parameter
  3. Alle Objekte, die innerhalb m erstellt/instanziiert wurden
  4. O's Direct -Komponenten -Objekte
  5. Eine globale Variable, die nach O im Umfang von m zugänglich ist <- dieser eine

-- Wikipedia

Nach der 5. Regel können Sie jede Methode der globalen Variablen aufrufen System.out Aus einem beliebigen Kontext.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top