2011-01-01 11 views
8

Czy System.out.println narusza prawo demeter?Czy System.out.println narusza prawo demeter?

Jeśli nie, dlaczego?

+0

W widoku projektu lub w widoku kodu? – Mantar

+4

również, ponieważ demeter jest reglementacją rolnictwa ekologicznego w Niemczech, powiedziałbym, że nie, ponieważ nie ma z tym nic wspólnego;) –

+1

Byłem też moją pierwszą myślą, Joe, ale ponieważ SO nie mówi o rolnictwie .. :-) – moritz

Odpowiedz

2

W zależności od widoku.

LoD: Tak, ponieważ korzysta z konsoli. W ramach LoD nie można uzyskać dostępu.

LoD-F: Tak, ponieważ używa więcej niż jednej kropki. LoD-F stwierdza, że ​​przy użyciu dowolnej metody tylko obiekt może znać wewnętrzną strukturę samego siebie. IE

System.out.println() 

wymaga znajomości struktury systemu (że ma .out), aby osiągnąć println()

Dla systemu nie do złamania LOD-F to musiałoby być

System.println() 

łamać reguł formalnych dół przykład println() (metoda) może tylko dostęp:

  1. syste m sama
  2. println() 's parametry
  3. wszelkie obiekty utworzone/instancja ciągu println()
  4. bezpośredni komponent
  5. systemu obiektów
  6. zmienną globalną, dostępną przez system, w zakresie println()

(wiem, że to odwrócone odniesienie tutaj jako kod powinien być metoda nazywając ją, ale faktycznie huśtawki w obie strony).

0

Powiedziałbym, że nie, ponieważ nazywa się Object.toString() i nie łączy się w żaden sposób z żadną klasą; po prostu mówi obiektowi, aby przekształcił się w ciąg znaków.


Edit:

Jeśli masz na myśli samą rozmowę, a nie to, co dzieje się w rozmowy, wtedy powiedziałbym tak to robi, bo go mocno pary program do pola System.out.

+0

Najprawdopodobniej oznacza to samo połączenie. – Esko

+0

Ooooh okej Widzę, co masz na myśli, dziękuję. – Mehrdad

+0

oznacza on wywołanie metody System.out.println(), a nie implementację metody :-) – crnlx

0

Łamie prawo, ponieważ używa "więcej niż jednej kropki" i ujawnia fakt, że używa innego obiektu do wywołania println.

1

System.out jest w rzeczywistości "stanem globalnym", i tak, technicznie narusza "prawo demeter". Ale:

  • powinieneś unikać używania System.out.println(..). Zamiast tego użyj rejestratora (log4j, logback, slf4j).
  • Nie powinieneś polegać (i testować) czegokolwiek, co jest potrzebne do zalogowania się do konsoli. (nie dotyczy to złożonych systemów rejestrowania, które później agregują rejestrowane informacje)
+0

Idealnie powinieneś używać Aspektów i całkowicie ukryć logger (problem przekrojowy) od swojej bazy źródłowej. Umożliwia to zamianę rejestratorów w razie potrzeby (ponieważ szybkość, pamięć i inne wymagania są podatne na zmiany). –

+1

cóż, nie zawsze. Możesz rejestrować typowe informacje, takie jak to, co jest wywoływane, z parametrami, czasami wykonania itp. Nie można jednak rejestrować pośrednich komunikatów debugowania. – Bozho

0

nr

System.out jest zmienną globalną.

Formalnie, prawo Demetry dla funkcji wymaga metodą m obiektu O może wywołać tylko sposobami z następujących rodzajów obiektów: [2]

  1. O sam
  2. parametrów m
  3. Wszystkie obiekty utworzone/wystąpienia wewnątrz m
  4. bezpośredni składnik O jest obiektów
  5. Globalna zmienna, dostępny przez O, w zakresie m < - To jeden

- Wikipedia

Przez 5. reguły można wywołać dowolną metodę zmiennej globalnej System.out z dowolnego kontekstu.

Powiązane problemy