The following text is a partial translation of the original English article, performed by ChatGPT (gpt-3.5-turbo) and this Jekyll plugin:
Как уже обсуждалось ранее, правильная инкапсуляция приводит к полному отсутствию “голых данных”. Однако вопрос остается: как объекты могут взаимодействовать, если они не могут обмениваться данными? В конечном итоге нам придется раскрыть некоторые данные, чтобы позволить другим объектам использовать их, верно? Да, это правда. Однако, я думаю, у меня есть решение, которое сохраняет инкапсуляцию, позволяя объектам взаимодействовать.
Предположим, что это наш объект:
Это представляет собой температуру. Единственное поведение, которое он открывает, это печать температуры в градусах Цельсия. Мы не хотим открывать t
, потому что это приведет к проблеме “голых данных”. Мы хотим сохранить t
в секрете, и это хорошее желание.
Теперь мы хотим иметь возможность печатать температуру в градусах Фаренгейта. Самый очевидный подход - ввести еще один метод toFahrenheitString()
, или добавить логический флаг к объекту, который изменит поведение метода toString()
, верно? Любое из этих решений лучше, чем добавление метода getT()
, но ни одно из них не идеально.
Что, если мы создадим этот декоратор:
Это должно работать просто отлично:
Единственная проблема заключается в том, что код не будет компилироваться на Java, потому что классу TempFahrenheit
не разрешен доступ к приватной переменной t
класса TempCelsius
. И если мы сделаем t
публичной, каждый сможет прочитать ее напрямую, и у нас возникнет проблема с “голыми данными” - серьезное нарушение инкапсуляции.
Однако, если мы разрешим такой доступ только для одного класса, все будет в порядке. Что-то вроде этого (не будет работать на Java, это просто концепция):
Поскольку ключевое слово trust
размещается в классе, который разрешает доступ, у нас не будет проблемы с “голыми данными” - мы всегда будем точно знать, какие объекты обладают информацией о t
. Когда мы что-то меняем в t
, мы точно знаем, где обновлять код.
P.S. После обсуждения этой идеи ниже в комментариях я начал думать, что нам совсем не нужно это ключевое слово trust
. Вместо этого мы должны просто предоставить всем декораторам доступ ко всем приватным атрибутам объекта.
Translated by ChatGPT gpt-3.5-turbo/42 on 2023-12-27 at 10:43