System.out.println нарушает закон Деметры?
Есть ли System.out.println
нарушать закон Деметры?
Если нет, то почему?
5 ответов
В зависимости от вида.
LoD: Да, потому что он использует консоль. Под LoD вы не можете получить доступ.
LoD-F: Да, потому что он использует более одной точки. LoD-F утверждает, что при любом использовании метода только объект может знать внутреннюю структуру самого себя. IE
System.out.println()
требует знания структуры системы (что она имеет.out), чтобы достичь println (),
Чтобы система не сломала LoD-F, это должно быть
System.println()
Чтобы разбить формальные правила на примере, println () (метод) может получить доступ только к:
- сама система
- Параметры println ()
- любые объекты, созданные / созданные в println ()
- прямые компоненты системы
- глобальная переменная, доступная для системы, в области println ()
(Я знаю, это обратная ссылка, так как код должен быть методом, вызывающим его, но на самом деле он колеблется в обоих направлениях.)
System.out
на самом деле это "глобальное государство", и да, технически это нарушает "закон Деметры". Но:
- вам следует избегать использования
System.out.println(..)
, Вместо этого используйте регистратор (log4j, logback, slf4j). - Вы не должны полагаться (и тестировать) на то, что предназначено для входа на консоль. (это не относится к сложным системам регистрации, которые позже объединяют зарегистрированную информацию)
Нет.
System.out
это глобальная переменная.
Более формально, закон Деметры для функций требует, чтобы метод m объекта O мог вызывать только методы следующих типов объектов:[2]
- О себе
- параметры м
- Любые объекты, созданные / созданные в течение м
- Прямые составляющие объекты О
- Глобальная переменная, доступная O, в объеме m <- эта
По 5-му правилу вы можете вызывать любой метод глобальной переменной System.out
из любого контекста.
Я бы сказал, не очень, так как он называет Object.toString()
и никак не связан с каким-либо классом; он просто говорит объекту преобразовать себя в строку.
Редактировать:
Если вы имеете в виду сам вызов, а не то, что происходит в вызове, то я бы сказал, что да, потому что он тесно связывает вашу программу с System.out
поле.
Он нарушает закон, так как использует "более одной точки" и раскрывает тот факт, что он использует другой объект для вызова println.