数据抽象和封装的好处

时间:2019-07-19 15:22:44

标签: c++ class oop interface implementation

我有两点要问并得到解决(来自 C ++ Primer ):

  

1:保护类内部免受意外的用户级错误的影响,   可能会破坏对象的状态。

     

2:随着时间的变化,类的实现可能会随着时间的推移而发展   要求或错误报告,而无需更改用户级别   代码。

关于第一点,我现在想到的是cin或其他任何I / O对象,它们的状态可能由于错误的数据而损坏,但是我仍然不知道类内部如何受到保护。第二点对我来说完全不清楚。

3 个答案:

答案 0 :(得分:2)

  1. 该语句在非常笼统的意义上使用“损坏状态”,即成员变量的值偏离了使用它们的方法的期望。考虑一个非公共的成员变量:您在构造函数中进行设置,然后在成员函数中对其进行修改。因此,无论成员变量具有什么值,它都仅由您的代码分配。假设您的代码是正确的,则变量的状态始终是您的代码期望的状态。另一方面,公共成员变量可以通过使用您的类的代码来更改。每次您的代码引用此类变量时,都会冒着寻找别人代码设置的值的风险。在并非所有可能的值都被认为正确的情况下,您的成员函数必须假定公共成员变量中的值无效。

  2. 这是一种说法,如果您决定更改成员变量的含义,将其替换为新的成员变量,或者将其从实现中删除,则只有在变量为私人的。公共成员变量不会为您提供这种保护,因为如果您重命名或删除它们,使用它们的外部代码将停止编译。当您决定更改变量的含义而不重命名时,甚至会发生更糟的情况。在这种情况下,外部代码仍然可以编译,但是您的代码最终将处于损坏状态,如上面的#1中所述。

答案 1 :(得分:1)

每个类(很少有例外)都有一个开放的接口和一个封闭的实现。

这允许在不更改打开界面的情况下更改实现。

因此,更改实现时,该类的用户无需更改其代码。

相对于标准类std::cin,它没有被破坏,则用户输入了错误的数据。内部状态稳定。它只是为用户设置一个错误标志,以通知他们他们做错了什么。

答案 2 :(得分:1)

  1. 重点是对对象的任何访问都必须通过应该以安全方式定义的公共接口(将其视为对对象内部的一种防火墙)。

  2. 这是设计方面。这些对象应具有定义明确的角色(通​​过公共接口公开)。在软件开发过程中,这些角色很少(如果有的话)发生变化。内部实现可能由于各种原因(错误/优化/等)而发生变化,但是只要接口保持不变,该软件就可以继续工作而无需更改其他模块。封装是使软件模块化的一种好方法。