【问题标题】:Data abstraction and encapsulation benefits数据抽象和封装的好处
【发布时间】:2019-11-28 15:00:18
【问题描述】:

我有两点想问清楚(来自C++ Primer):

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

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

首先,我可以想到 cin 或任何其他 I/O 对象,它们的状态可能由于错误数据而损坏,但我仍然不明白 类内部如何保护 .第二点我完全不清楚。

【问题讨论】:

    标签: c++ class oop interface implementation


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

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

    【讨论】:

    • Re: #2: 使用它们的外部代码停止编译 - 这是最好的情况。通常它仍然可以编译,但引入了更微妙的错误。
    【解决方案2】:

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

    这允许在不更改开放接口的情况下更改实现。

    所以当实现改变时,类的用户不需要改变他们的代码。

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

    【讨论】:

      【解决方案3】:
      1. 关键是对对象的任何访问都必须通过应以安全方式定义的公共接口(将其视为对象内部的一种防火墙)。

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

      【讨论】:

        猜你喜欢
        • 2017-11-29
        • 2018-06-29
        • 2012-05-24
        • 2021-07-24
        • 1970-01-01
        • 1970-01-01
        • 2012-02-16
        • 1970-01-01
        • 2011-04-23
        相关资源
        最近更新 更多