Encapsulation Covers Up Naked Data

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更改为doubleprintf行将不会在小数点后打印任何内容。同样,耦合存在,但它是隐藏的。之后,我们将无法找到我们的代码中所有对t做出这些或其他假设的地方。

这将严重影响可维护性。

而这并不是一个解决方案,你可以想象一下(现在是Java):

它看起来像一个对象,但数据仍然是裸露的。任何人都可以从对象中检索t并决定它是华氏度还是摄氏度,是否有小数点后的数字等等。这还不是封装!

唯一封装t的方法是确保没有人可以直接触碰它,也不能通过从对象中检索它来触碰它。我们该如何做到这一点呢?只需停止暴露数据,开始暴露功能。以下是一个示例:

我们不再允许任何人检索t。他们所能做的只是将温度转换为文本。如果我们决定将t更改为摄氏度,我们将在Temperature类中只进行一次更改,并只在一个地方进行。

如果我们在将来需要其他功能,例如数学运算或转换为摄氏度,我们将在Temperature类中添加更多方法。但我们永远不会让任何人接触或了解t

这个想法与我们之前讨论过的“打印机而不是获取器”非常接近,尽管从更广泛的角度来看。在这里,我要说的是任何逃离对象的数据元素都是“裸露的”,会导致可维护性问题。

问题是我们如何完全不使用裸露的数据来工作,对吗?最终我们必须让对象交换数据,不是吗?是的,这是真的。但不是完全。我将在我的下一篇文章中解释这个问题。

Translated by ChatGPT gpt-3.5-turbo/42 on 2023-12-05 at 21:30

sixnines availability badge   GitHub stars