摘要:
它们不关调用者的事:将数据成员设为私有的。简单的c语言形式的struct类型只是将一组值聚集在了一起,并不封装或者提供行为,只有在这种struct类型中才可以将所有数据成员都设成公用的。要避免将公用数据和非公用数据混合在一起,因为这几乎总是设计混乱的标志。
信息隐藏是优秀软件工程的关键。应该将所有数据成员都设为私有的,不管是现在,还是可以能发生变化的将来,私有数据都是类用来保持其不变式的最佳方式。
如果类要建模一个抽象,并因而必须维持一个不变式,那么使用公用数据就不好了。拥有公用数据意味着类的部分状态的变化可能是无法控制的、无法预测的、与其他状态异步发生的。这意味着抽象将与使用抽象的所有代码组成无限集合共同承担维持一个或者更多不变式的职责,这是一种显而易见的、根本性的、不可原谅的缺陷。应该断然拒绝这种设计。
保护数据具有公用数据的所有缺点,因为拥有保护数据仍然意味着抽象将与代码的无限集合共同承担着一个或者更多不变式的职责,只不过这里的集合是由当前的派生类和未来的派生类组成的。而且,通过派生一个新类,并用它来获取数据,任何代码都能够像公用数据那样容易地读取和修改保护数据。
在同一个类中混合使用公用和非公用数据成员既容易含混不清,又存在前后矛盾。私有数据表明具有不变式而且希望保持这种不变性,而将其与公用数据混合则意味着无法明确地判断这个类到底要不要成为抽象。
非私有数据成员甚至还不如简单的通道性的get/set函数,后者起码还能进行健壮的版本处理。