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