Verstößt System.out.println gegen das Gesetz von demeter?

8

Verletzt System.out.println das Demeter-Gesetz?

Wenn nicht, warum?

    
Billworth Vandory 01.01.2011, 21:16
quelle

5 Antworten

2

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 erreichen

Damit 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:

  1. System selbst
  2. println () 's Parameter
  3. alle Objekte, die in println ()
  4. erstellt / instanziiert wurden
  5. System direkte Komponentenobjekte
  6. eine globale Variable, auf die das System zugreifen kann, im Bereich von println ()

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

    
Mantar 01.01.2011, 21:36
quelle
1

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

  • Sie sollten vermeiden, System.out.println(..) zu verwenden. Verwenden Sie stattdessen einen Logger (log4j, logback, slf4j).
  • Sie sollten sich nicht darauf verlassen (und testen), was für die Protokollierung an einer Konsole vorgesehen ist. (Dies betrifft nicht komplexe Protokollierungssysteme, die später die protokollierten Informationen zusammenfassen)
Bozho 01.01.2011 21:27
quelle
0

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.

    
Mehrdad 01.01.2011 21:17
quelle
0

Es bricht das Gesetz, da es "mehr als einen Punkt" verwendet, und macht die Tatsache deutlich, dass es ein anderes Objekt für den println-Aufruf verwendet.

    
crnlx 01.01.2011 21:22
quelle
0

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]

     
  1. O selbst
  2.   
  3. ms Parameter
  4.   
  5. Alle Objekte, die in m
  6. erstellt / instanziiert wurden   
  7. Os direkte Komponentenobjekte
  8.   
  9. Eine globale Variable, auf die O zugreifen kann, im Bereich von m & lt; - This one
  10.   

- Wikipedia

Nach der fünften Regel können Sie jede Methode der globalen Variablen System.out von einem beliebigen Kontext aus aufrufen.

    
michaelsnowden 08.10.2015 08:06
quelle

Tags und Links