2011-01-01 7 views
8

Verletzt System.out.println das Demeter-Gesetz?Verstößt System.out.println gegen das Demeter-Gesetz?

Wenn nicht, warum?

+0

In einer Entwurfsansicht oder in einer Codeansicht? – Mantar

+4

naja da demeter eine reglementierung des ökologischen landbaus in deutschland ist, würde ich nein sagen, weil es nichts damit zu tun hat;) –

+1

War mein erster Gedanke auch, Joe, aber da geht es nicht um Landwirtschaft .. :-) – moritz

Antwort

2

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:

  1. syste m selbst
  2. println() 's Parameter
  3. irgendwelche Objekte erstellt/innerhalb println instanziiert()
  4. direkte Komponente des Systemobjekts
  5. eine globale Variable, mit dem System, in dem Rahmen println()

(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.)

0

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.

+0

Er meint wahrscheinlich den Anruf selbst. – Esko

+0

Ooooh okay Ich sehe, was du meinst, danke. – Mehrdad

+0

Er meint den Aufruf der System.out.println() -Methode, nicht die Implementierung der Methode :-) – crnlx

0

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.

1

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

  • sollten Sie vermeiden, System.out.println(..) zu verwenden. Verwenden Sie stattdessen einen Logger (log4j, logback, slf4j).
  • Sie sollten sich nicht darauf verlassen (und testen) alles, das für den Zweck der Anmeldung an einer Konsole ist. (Dies betrifft nicht komplexe Protokollierungssysteme, die später die aufgezeichneten Informationen aggregieren.)
+0

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). –

+1

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

0

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]

  1. O selbst
  2. m-Parameter
  3. Alle erstellten Objekte/in m instanziiert
  4. direkte Komponente A-Objekte
  5. Eine globale Variable, mit dem O, im Rahmen von m < - Dieses

- Wikipedia

Durch die fünfte Regel können Sie jede Methode der globalen Variablen aufrufen System.out aus jedem Kontext heraus.