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