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