Verletzt System.out.println
das Demeter-Gesetz?
Wenn nicht, warum?
Abhängig von der Ansicht.
LoD: Ja, weil es die Konsole benutzt. Unter LoD kann man keinen Zugriff annehmen.
LoD-F: Ja, weil es mehr als einen Punkt verwendet. Die LoD-F besagt, dass bei jeder Methodenverwendung nur das Objekt die interne Struktur seiner selbst kennen kann. IE
%Vor%erfordert Kenntnisse über die Struktur des Systems (dass es .out hat), um println (),
zu erreichenDamit das System LoD-F nicht bricht, müsste es
sein %Vor%Um die formalen Regeln mit Beispiel zu brechen, darf println () (die Methode) nur auf Folgendes zugreifen:
(Ich weiß, es ist eine umgekehrte Referenz hier, da der Code die Methode sein sollte, die es aufruft, aber es schwingt tatsächlich in beide Richtungen.)
System.out
ist eigentlich ein "globaler Staat", und ja, technisch verstößt es gegen das "Demeter-Gesetz". Aber:
System.out.println(..)
zu verwenden. Verwenden Sie stattdessen einen Logger (log4j, logback, slf4j). Ich würde es nicht wirklich sagen, da es Object.toString()
aufruft und sich in keiner Weise eng mit irgendeiner Klasse verbindet; es teilt dem Objekt nur mit, dass es sich in eine Zeichenkette umwandeln soll.
Bearbeiten:
Wenn Sie den Anruf selbst meinen und nicht, was im Anruf passiert, dann würde ich ja sagen, weil er Ihr Programm fest mit dem System.out
-Feld verbindet.
Nein.
System.out
ist eine globale Variable.
Formaler macht das Demeter-Gesetz für Funktionen eine Methode erforderlich m eines Objekts O darf nur die Methoden der folgenden Arten aufrufen Objekte: [2]
- O selbst
- ms Parameter
- Alle Objekte, die in m
erstellt / instanziiert wurden- Os direkte Komponentenobjekte
- Eine globale Variable, auf die O zugreifen kann, im Bereich von m & lt; - This one
Nach der fünften Regel können Sie jede Methode der globalen Variablen System.out
von einem beliebigen Kontext aus aufrufen.
Tags und Links java law-of-demeter