代码大全--第六章--可以工作的类

类是由一组数据和子程序构成的集合,这些数据和子程序共同拥有一组内聚的、明确定义的职责。类也可以只是由一组子程序构成的集合,这些子程序提供一组内聚的服务,哪怕其中并未涉及共用的数据。成为高效程序员的一个关键就在于,当你开发程序任一部分代码时,都能安全地忽视程序中尽可能多的其余部分。而类就是实现这一目标的首要工具。

6.1 类的基础:抽象数据类型(ADTs)

     抽象数据类型是指一些数据以及对这些数据所进行的操作的集合。

使用ADTs的益处:

    1. 可以隐藏实现的细节
    2. 改动不会影响到整个程序
    3. 让接口提供更多的信息
    4. 更容易提高性能
    5. 让程序的正确性更显而易见
    6. 程序更具自我说明性
    7. 无需再程序内到处传递数据
    8. 你可以像在现实世界中那样操作实体,而不用在底层实现上操作它

使用ADTs的指导建议:

  • 把常见的底层数据创建为ADT并使用这些ADT,而不再使用底层数据
  • 把文件这样的常用对象当成ADT
  • 简单的事物也可当作ADT
  • 不要让ADT依赖于其存储介质

6.2 良好的类接口

创建高质量的类,第一步,可能也是最重要的一步,就是创建一个好的接口。

创建类的抽象接口的一些建议:

  1. 类的接口应该展现一致的抽象层次
  2. 一定要理解类所实现的抽象是什么
  3. 提供成对的服务
  4. 把不相关的信息转移到其它类中
  5. 尽可能让接口可编程,而不是表达语义
  6. 谨防在修改是破坏接口的抽象
  7. 不要添加与接口抽象不一致的公用成员
  8. 同时考虑抽象性和内聚性

良好的封装:

  1. 尽可能限制类和成员的可访问性
  2. 不要公开暴露成员数据
  3. 避免把私用的实现细节放入类的接口中
  4. 不要对类的使用者做出任何假设
  5. 避免使用友元类
  6. 不要因为一个子程序里仅使用公用子程序,就把它归入公开接口
  7. 让阅读代码比编写代码更方便
  8. 要格外警惕从语义上破坏封装性
  9. 留意过于紧密的耦合关系

6.3 有关设计和实现的问题

包含(has a):

包含是一个非常简单的概念,它表示一个类含有一个基本数据元素或对象。包含是面向对象编程的主力技术。

  1. 通过包含实现“有一个(has a)”的关系
  2. 在万不得已时通过private继承来实现“有一个”关系
  3. 警惕有超过7个数据成员的类

继承(is a):

  1. 用public继承实现“是一个(is a……)”的关系
  2. 要么使用继承并进行详细的说明,要么就不要用它
  3. 遵循Liskov替换原则(派生类必须能通过基类的接口而被使用,且使用者无需了解两者之间的差异)
  4. 确保只继承需要继承的部分
  5. 不要“覆盖”一个不可覆盖的成员函数(即:派生类中的成员函数不要与基类中不可覆盖的成员函数重名)
  6. 把共用的接口、数据和操作放到继承树中尽可能高的位置
  7. 只有一个实例的类是值得怀疑的
  8. 只有一个派生类的基类也是值得怀疑的
  9. 派生后覆盖了某个子程序。但在其中没做任何操作,这种情况也值得怀疑
  10. 避免让继承体系过深
  11. 尽量使用多态,避免大量的类型检查
  12. 让所有数据都是private(而非protected)

多重继承:

为什么这么多关于继承的规则:

成员函数和数据成员:

构造函数:

6.4 创建类的原因

创建类的合理原因:

  1. 为现实世界中的对象建模
  2. 为抽象对象建模
  3. 降低复杂度
  4. 隔离复杂度
  5. 隐藏实现细节
  6. 限制变动的影响
  7. 隐藏全局数据
  8. 让参数传递更顺畅
  9. 建立中心控制点
  10. 让代码更易于重用
  11. 为程序族做计划
  12. 把相关操作包装到一起
  13. 实现某种特定的重构
    posted @ 2013-09-10 23:40  _freedom_yl  阅读(313)  评论(0编辑  收藏  举报