Страницы

Поиск по вопросам

пятница, 5 октября 2018 г.

Принцип минимальной информированности, когда можно нарушать?

Вот пример такой композиции в коде, как я понимаю нарушает принцип минимальной информированности (Principle of Least Knowledge) (см. Закон Деметры):
class A:
def method1(self): pass
def method2(self): pass
def method3(self): pass
class B:
def __init__(self): self.a = A
def method1(self): pass
b = B() b.a.method1()
Однако, я заметил, что часто используют такой подход для расширения интерфейса класса.
Пример из джавы и C#:
System.out.println()
Пример из Джанго:
MyModel.objects.create()
Вот и интересно, когда расширять класс таким образом можно считать правильным?


Ответ

Ограничения накладываются согласно здравому смыслу и предметной области.
Я напишу о человеке. Человек, в большинстве случаев, может двигать конечностями, думать головой и делать ещё какие то действия, которые довольно поверхностны. Если вы пишете игру и человеки там - не предмет каких то модификаций, то доступны у них должны быть те же операции, что и в реальной жизни. Стоит иметь в виду, что для мед. оборудования или игр с модификацией людей - доступ может быть намного шире.
Простой пример - человек.рука.двигать()
Что бы ни случилось в реализации, такой код останется валидным и не должен превращаться в человек.ДвигатьРукой() или человек.Двигать(рука)

При этом, люди не умеют контролировать конкретные мышцы в руке, к примеру, а значит, объект должен скрывать собой внутренности реализации.
Т.е. рука.Двигать() но не рука.мышцы[x].двинуть(y, z)

Ещё проще - когда свойство обязательно и неизменно, обосновано предметной областью - можно ссылаться на него, иначе его должен скрывать основной класс.

Комментариев нет:

Отправить комментарий