Encapsulation Covers Up Naked Data

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

Инкапсуляция является основным принципом объектно-ориентированного программирования, который делает объекты надежными, сплоченными, доверенными и т. д. Но что такое инкапсуляция на самом деле? Она лишь защищает доступ к закрытым атрибутам извне объекта? Я считаю, что это гораздо больше. Инкапсуляция приводит к отсутствию голых данных на всех уровнях и во всех формах.

Вот что представляет собой голые данные (код на языке C):

Здесь t - это данные, к которым код имеет общий доступ. Кто угодно может их изменить или прочитать.

Почему это плохо? По одной причине: сильная и скрытая связанность.

Код, окружающий t, неизбежно делает множество предположений о данных. Например, обе строки после int t предположили, что температура указана в Фаренгейтах. На данный момент это может быть верно, но это предположение связывает код с данными. Если завтра мы изменяем t на Цельсий, код не узнает об этом изменении. Поэтому я называю эту связанность скрытой.

Если мы изменяем тип t с int на, скажем, double, строка с printf не будет выводить ничего после десятичной точки. Опять же, связанность есть, но она скрыта. Позднее мы просто не сможем найти все места в нашем коде, где мы сделали эти или другие предположения о t.

Это серьезно повлияет на поддерживаемость.

И это не решение, как вы можете себе представить (сейчас в Java).

Похоже на объект, но данные все еще открыты. Любой может получить t из объекта и решить, является ли это Фаренгейтом или Цельсием, есть ли цифры после запятой или нет, и так далее. Это еще не инкапсуляция!

Единственный способ инкапсулировать t - убедиться, что никто не может к нему прикоснуться непосредственно или получить его из объекта. Как мы это делаем? Просто прекратим выставлять данные и начнем выставлять функциональность. Вот как, например:

Мы больше не разрешаем никому получать t. Все, что они могут делать, это преобразовывать температуру в текст. Если и когда мы решим изменить t на Цельсий, мы сделаем это только однажды и в одном месте: в классе Temperature.

Если нам понадобятся другие функции в будущем, например, математические операции или преобразование в Цельсий, мы добавим еще методы в класс Temperature. Но мы никогда не позволим никому трогать или знать о t.

Эта идея близка к “принтерам вместо геттеров”, о которых мы ранее говорили, хотя с более широкой перспективы. Здесь я говорю, что любые элементы данных, которые выходят из объектов, являются голыми и приводят к проблемам с поддержкой.

Вопрос в том, как мы можем работать полностью без голых данных, верно? В конечном итоге нам придется позволить объектам обмениваться данными, не так ли? Да, это верно. Но не полностью. Я объясню это в своем следующем сообщении.

Translated by ChatGPT gpt-3.5-turbo/42 on 2023-12-05 at 21:30

sixnines availability badge   GitHub stars