The Law of Demeter Doesn't Mean One Dot

The following text is a partial translation of the original English article, performed by ChatGPT (gpt-3.5-turbo) and this Jekyll plugin:

Вы, наверное, слышали о тридцатилетнем Законе Деметра (LoD). Недавно меня спросили, что я об этом думаю. И не только, что я думаю, но и как можно сохранить объекты маленькими и соблюдать Закон Деметра. Согласно этому закону, мы не имеем права делать что-то вроде book.pages().last().text(). Вместо этого, мы должны использовать book.textOfLastPage(). Это меня озадачило, потому что я категорически не согласен. Я считаю, что первая конструкция вполне допустима в ООП. Поэтому я провел некоторые исследования, чтобы выяснить, является ли этот закон действительно законом. Что я узнал, так это то, что закон идеален, но его общее понимание в мире ООП просто неправильное (что неудивительно).

Объектно-ориентированное программирование: объективное чувство стиля, К. Либерхерр, И. Холланд и А. Риэль, OOPSLA’88 Процедуры, 1988.

Здесь он был введен. Давайте посмотрим, что он буквально говорит (ищите раздел 3 в этом PDF-документе):

Предположим, это класс Java:

Все четыре вызова четырех разных методов hello() являются допустимыми согласно Закону о законодательной деятельности. Итак, что было бы незаконным, спрашиваю я сам себя? Неудивительно; ответ таков: a.x.hello(). Это было бы незаконным. Прямое обращение к атрибуту из другого объекта и последующий разговор с ним не разрешается законом.

Но мы все равно этого не делаем. Мы говорим о book.pages().last().text(). В этой цепочке вызовов методов мы не обращаемся к каким-либо атрибутам. Мы просим наши объекты создать новые объекты для нас. Что говорит об этом закон? Позвольте мне прочитать и процитировать его:

Другими словами, объект Pages, который возвращает вызов метода book.pages(), является полностью допустимым объектом, который можно использовать. Затем мы можем вызвать метод last() и получить объект Page, а затем вызвать метод text(), и так далее. Это полностью допустимый сценарий, который совсем не нарушает закон, как я и ожидал.

Итак, откуда возникает это общее понимание закона? Почему Wikipedia называет его правилом “одной точки” и говорит, что “объект должен избегать вызова методов объекта-члена, возвращаемого другим методом?” Это абсолютно противоречит тому, что говорит оригинальная статья! Что здесь происходит?

Ответ прост: геттеры.

Большинство разработчиков ООП считают, что большинство методов объекта, возвращающих что-либо, являются геттерами. И геттеры, действительно, ничем не отличаются от прямого доступа к атрибутам объекта. Вот почему Wikipedia фактически говорит “нет прямого доступа к атрибутам, и, поскольку большинство ваших методов - это геттеры, не трогайте их, дураки”.

Это просто грустно видеть.

Так что суть закона Деметра заключается в том, что он не против методической цепочки вообще. Конечно, он против геттеров и прямого доступа к атрибутам. Но кто не против, не так ли?

Translated by ChatGPT gpt-3.5-turbo/42 on 2023-12-15 at 06:36

sixnines availability badge   GitHub stars