Вот пример такой композиции в коде, как я понимаю нарушает принцип минимальной информированности (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)
Ещё проще - когда свойство обязательно и неизменно, обосновано предметной областью - можно ссылаться на него, иначе его должен скрывать основной класс.
Комментариев нет:
Отправить комментарий