代码大全-02-创建高质量的代码-06-可以工作的类

内容

  1. 类的基础:抽象数据类型(ADTs)
  2. 良好的类接口
  3. 有关设计和实现的问题
  4. 创建类的原因
  5. 与具体编程语言相关的问题
  6. 超越类:包

Class Foundations: Abstract Data Types(ADTs)

抽象数据类型(ADT,abstract data type)是指一些数据以及对这些数据所进行的操作的集合。

一个ADT可能是一个图形窗体以及所有能影响该窗体的操作;也可以是一个文件以及对这个文件进行的操作;或者是一张保险费率表以及相关操作等。

‘深入一种语言去编程’而不是‘在一种语言上编程’。

Example of the Need for an ADT

Benefits of Using ADTs

可以隐藏实现细节

改动不会影响到整个程序

更容易提高性能

让程序的正确性更显而易见

程序更具有自我说明性

无需在程序内到处传递数据

你可以像在现实世界中那样操作实体,而不用在底层实现上操作它

More Examples of ADTs

把常见的底层数据类型创建为 ADT 并使用这些 ADT ,而不再使用底层数据类型

把像文件这样的常用对象当成 ADT

简单的事物也可以当做 ADT

不要让 ADT 依赖于其存储介质

Handling Multiple Instances of Data with ADTs in Non-Object-Oriented Environments

  • 做法1:每次使用 ADT 服务子程序时都明确地指明实例。在这种情况下没有“当前字体”的概念。你把fontId传给每个用来操作字体的子程序。Font ADT 的服务子程序负责跟踪所有底层的数据,而调用方代码只需使用不同的 fontId 即可区分多份实例。这种方法需要为每个Font子程序都加上一个fontId参数。
  • 做法2:明确地向 ADT 服务子程序提供所要用到的数据。采用这种方法时。
  • 做法3:明确地向 ADT 服务子程序提供所要用到的数据。采用这种方法时。

ADTs and Classes

Class = ADT + 继承 + 多态

Good Class Interfaces

Good Abstraction

类的接口应该展现一致的抽象层次

一定要理解类所实现的抽象是什么

提供成对的服务

把不相关的信息转移到其他类中

尽可能让接口可编程,而不是表达语义

谨防在修改时破坏接口的抽象

不要添加与接口抽象不一致的公用成员

同时考虑抽象性和内聚性

Good Encapsulation

尽可能限制类和成员的可访问性

不要公开暴露成员数据

避免私用的实现细节放入类的接口中

避免使用友元类(friend class)

不要因为一个子程序里仅使用公用子程序,就把它归入公开接口

让阅读代码比编写代码更方便

要格外警惕从语义上破坏封装性

留意过于紧密的耦合关系

Design and Implementation lssues