Verletzt System.out.println
das Demeter-Gesetz?Verstößt System.out.println gegen das Demeter-Gesetz?
Wenn nicht, warum?
Verletzt System.out.println
das Demeter-Gesetz?Verstößt System.out.println gegen das Demeter-Gesetz?
Wenn nicht, warum?
Abhängig von der Ansicht.
LoD: Ja, weil es die Konsole verwendet. Unter LoD können Sie 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
System.out.println()
erfordert die Kenntnis der Struktur des Systems (dass es .out) println() zu erreichen,
für System nicht LoD-F zu brechen wäre es
System.println()
sein müssen
Um die formalen Regeln nach unten mit Beispiel zu brechen, println() (das Verfahren) kann nur Zugang:
(ich weiß, es ist ein umgekehrter Bezug hier als der Code die Methode nennt es sein soll, aber es schwingt tatsächlich in beiden Richtungen.)
Ich würde nicht wirklich sagen, da es Object.toString()
anruft und nicht eng mit irgendeiner Klasse in irgendeiner Weise koppelt; es teilt dem Objekt nur mit, dass es sich in eine Zeichenfolge konvertieren soll.
Edit:
Wenn Sie den Anruf selbst bedeuten, sondern als das, was in dem Aufruf geschieht, dann würde ich sagen, ja es tut, weil es eng Paare Ihr Programm in den System.out
Feld.
Es bricht das Gesetz, da es "mehr als einen Punkt" verwendet, und legt dar, dass es ein anderes Objekt für den println-Aufruf verwendet.
System.out
ist eigentlich ein "globaler Staat", und ja, technisch verstößt es gegen das "Gesetz des Demeter". Aber:
System.out.println(..)
zu verwenden. Verwenden Sie stattdessen einen Logger (log4j, logback, slf4j).Idealerweise sollten Sie Aspects verwenden und den Logger (ein querschnittsübergreifendes Problem) vollständig aus Ihrer Quelldatenbank ausblenden. Dadurch können Sie Logger nach Bedarf austauschen (da sich Geschwindigkeit, Speicher und andere Anforderungen ändern können). –
gut, nicht immer. Sie können allgemeine Informationen, wie z. B. was aufgerufen wird, mit Parametern, Ausführungszeiten usw. protokollieren. Sie können jedoch keine Zwischen-Debug-Meldungen protokollieren. – Bozho
Nr
System.out
ist eine globale Variable.
formal Mehr verlangt das Gesetz von Demeter für Funktionen, dass ein Verfahren m eines Objekts O nur die Methoden der folgenden Arten von Objekte aufrufen kann: [2]
- O selbst
- m-Parameter
- Alle erstellten Objekte/in m instanziiert
- direkte Komponente A-Objekte
- Eine globale Variable, mit dem O, im Rahmen von m < - Dieses
Durch die fünfte Regel können Sie jede Methode der globalen Variablen aufrufen System.out
aus jedem Kontext heraus.
In einer Entwurfsansicht oder in einer Codeansicht? – Mantar
naja da demeter eine reglementierung des ökologischen landbaus in deutschland ist, würde ich nein sagen, weil es nichts damit zu tun hat;) –
War mein erster Gedanke auch, Joe, aber da geht es nicht um Landwirtschaft .. :-) – moritz