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无法访问类TempCelsius中的私有变量t。如果我们将t设为公共变量,任何人都可以直接读取它,这将导致“裸露数据”问题,严重违反封装性原则。

然而,如果我们只允许一个类访问该变量,那么一切都会解决。类似于这样(在Java中无法工作;这只是一个概念):

由于将trust关键字放置在允许访问的类中,我们不会遇到“裸数据”问题—我们始终会准确地知道哪些对象拥有关于t的知识。当我们更改关于t的任何内容时,我们知道在哪里更新代码。

附言:在下面的评论中讨论了这个想法后,我开始思考我们根本不需要那个 trust 关键字。相反,我们应该让所有装饰器都能访问对象的所有私有属性。

Translated by ChatGPT gpt-3.5-turbo/42 on 2023-12-27 at 10:43

sixnines availability badge   GitHub stars