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
更改为double
,printf
行将不会在小数点后打印任何内容。同样,耦合存在,但它是隐藏的。之后,我们将无法找到我们的代码中所有对t
做出这些或其他假设的地方。
这将严重影响可维护性。
而这并不是一个解决方案,你可以想象一下(现在是Java):
它看起来像一个对象,但数据仍然是裸露的。任何人都可以从对象中检索t
并决定它是华氏度还是摄氏度,是否有小数点后的数字等等。这还不是封装!
唯一封装t
的方法是确保没有人可以直接触碰它,也不能通过从对象中检索它来触碰它。我们该如何做到这一点呢?只需停止暴露数据,开始暴露功能。以下是一个示例:
我们不再允许任何人检索t
。他们所能做的只是将温度转换为文本。如果我们决定将t
更改为摄氏度,我们将在Temperature
类中只进行一次更改,并只在一个地方进行。
如果我们在将来需要其他功能,例如数学运算或转换为摄氏度,我们将在Temperature
类中添加更多方法。但我们永远不会让任何人接触或了解t
。
这个想法与我们之前讨论过的“打印机而不是获取器”非常接近,尽管从更广泛的角度来看。在这里,我要说的是任何逃离对象的数据元素都是“裸露的”,会导致可维护性问题。
问题是我们如何完全不使用裸露的数据来工作,对吗?最终我们必须让对象交换数据,不是吗?是的,这是真的。但不是完全。我将在我的下一篇文章中解释这个问题。
Translated by ChatGPT gpt-3.5-turbo/42 on 2023-12-05 at 21:30