0

我对封装和数据隐藏的整个术语感到有些困惑。我正在通过重构大师阅读一本书“深入研究设计模式”,当他解释封装是什么时,我认为有些不对劲。

我搜索了一下,发现了一个非常好的解释: https ://stackoverflow.com/a/28614407/11993214 。

他把封装误认为是数据隐藏。从上面的链接阅读答案后,我将其总结为这些定义:

encapsulation- 当我们将使用这些数据的一段代码、数据和方法分开时,我们将它们打包在一起。 data hiding- 是一个我们可以做的一切的地方,我们作为私人做,我们正在实施 getter 和 setter 作为我们可以访问这些数据的唯一地方。

但是当我阅读更多时,我变得更加困惑。他提出了一个话题: Encapsulate what varies。它有两个子类别 - 封装在方法级别和类级别。例如,它说要重新制作:

在此处输入图像描述

进入这个:

在此处输入图像描述

我认为这类似于上面链接中的问题的陈述。

Whatever changes encapsulate it. Protecting anything which is prone to change.

,对此的回答是:

(...) And 2, as noted by CommuSoft, isn't really a definition, it's a rule of thumb. And I will add that it's a rule of thumb about when to use data hiding, not encapsulation

所以现在,我从书中得到了这一部分,基于我给出的这个例子,我认为它更有可能是一个封装案例。但是,如果我的想法正确并且它类似于链接主题的引号,那么基于该答案,此示例代码是关于何时使用数据隐藏的经验法则?所以总结一下......如果我正确理解封装和数据隐藏,我真的很困惑。基于我提供的那些例子,我认为这个例子是封装。这是对的吗?如果是,那么它与引号中提到的主题有何不同?

我期待您的回答,如果整个解释不清楚,请给我反馈,我会尽力做得更好。

4

1 回答 1

3

“封装”的通常定义是将数据(特别是状态)与对其进行操作的方法绑定在一起,而“数据隐藏”是限制对该数据的访问,以便只能通过对其进行操作的方法来访问它.

使用这些定义,封装是数据隐藏的先决条件,因为这是您识别具有直接访问数据特权的方法的方式。其他方式是可以想象的,但这就是它在 OOP 语言中的实现方式。

您所指的作者似乎在更广泛的意义上使用“封装”一词,将逻辑单元和数据绑定在一起,并为该逻辑或数据提供接口,以保护消费者免受底层细节的更改.

我认为这个词的用法还可以,因为:

  • 它表达了与将方法与数据绑定在一起的相同目的;
  • 没有一个词可以很好地表达这个概念。和
  • 在某种接口(不一定是 OOP“接口”)后面将事物绑定到一个单元中的操作是您如何完成“关注点分离”并实现单一职责原则的方式。执行此操作是软件设计的全部内容,因此需要一个词。

在您给出的示例中,税率计算的详细信息通过简单的接口 ( getTaxRate) 提取(封装)到它们自己的单元中。这是对逻辑细节的封装,而不是数据,但它仍然有效。正如作者所说,这样做的原因是因为这些细节很容易改变,所以你不想在代码周围分散或复制它们——将它们收集到一个地方并制作一个允许你改变的界面将来它们不会弄乱所有使用它们的代码。

于 2021-12-24T16:51:20.267 回答