System.out.println нарушает закон Деметры? - PullRequest
8 голосов
/ 02 января 2011

Нарушает ли System.out.println закон Деметры?

Если нет, то почему?

Ответы [ 5 ]

2 голосов
/ 02 января 2011

В зависимости от вида.

LoD: Да, потому что он использует консоль.Под LoD вы не можете получить доступ.

LoD-F: Да, потому что он использует более одной точки.LoD-F утверждает, что при любом использовании метода только объект может знать внутреннюю структуру самого себя.IE

System.out.println() 

требует знания структуры системы (что у него есть .out) для достижения println (),

Чтобы система не сломала LoD-F, это должно быть

System.println()

Чтобы разбить формальные правила на примере, println () (метод) может получить доступ только к:

  1. самой системе
  2. println ()параметры
  3. любые объекты, созданные / созданные в println ()
  4. объекты прямых компонентов системы
  5. глобальная переменная, доступная для системы, в области println ()

(Я знаю, это обратная ссылка, так как код должен быть методом, вызывающим его, но на самом деле он качается в обе стороны.)

1 голос
/ 02 января 2011

System.out на самом деле является «глобальным состоянием», и да, технически это нарушает «закон деметры». Но:

  • вам следует избегать использования System.out.println(..). Вместо этого используйте регистратор (log4j, logback, slf4j).
  • Вы не должны полагаться (и тестировать) на то, что предназначено для входа на консоль. (это не относится к сложным системам ведения журналов, которые впоследствии объединяют зарегистрированную информацию)
0 голосов
/ 08 октября 2015

номер

System.out - глобальная переменная.

Более формально, закон Деметры для функций требует, чтобы метод m объекта O может вызывать только методы следующих Объекты: [2]

  1. О себе
  2. параметры м
  3. Любые объекты, созданные / созданные в пределах m
  4. Объекты прямого компонента O
  5. Глобальная переменная, доступная для O, в объеме m <- This * </strong>

- Википедия

По пятому правилу вы можете вызывать любой метод глобальной переменной System.out из любого контекста.

0 голосов
/ 02 января 2011

Он нарушает закон, так как использует «более одной точки» и раскрывает тот факт, что использует другой объект для вызова println.

0 голосов
/ 02 января 2011

Я бы сказал, что нет, поскольку он вызывает Object.toString() и никак не связан с каким-либо классом; он просто говорит объекту преобразовать себя в строку.


Edit:

Если вы имеете в виду сам вызов, а не то, что происходит в вызове, то я бы сказал, что да, это так, потому что он тесно связывает вашу программу с полем System.out.

...