Can Objects Be Friends?

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

sixnines availability badge   GitHub stars