1 类的领域
一个标准的面向对象的系统包含的类通常来自于四个主要的领域:应用领域、商业领域、结构领域和基础领域。在每个领域中都有几组类。
1.1 基础领域
基础领域中所包含的类具有非常广泛的使用范围,基础领域有三组类:基础性的、结构性的、语义性的。每组类都有一些类的实例:
基础类包括integer,Boolean,char等,这些类是是最基本的,多数语言都将它们作为内置的简单数据类型。
结构类可以实现一些数据结构,包括stack,list,set等。
语义类包括data,time,angle,point,line等。
一个基础性的类可以构造于其它基础性的类之上。
1.2 结构领域
结构领域包含三组类:机器间通信类、数据库操作类和人机接口界面类。
机器间通信类包括 port和host类
数据库操作类包括transaction类
人机界面类包括window和button等类
1.3 商业领域
商业领域局限于单一工业领域,如银行、电力等,商业领域包含三组类:属性性、角色类和关系类。
属性类描述了商业领域世界里事物的属性,如银行业的中帐户类。
角色类是商业行为中事物扮演的角色所演变而来,如银行业中的客户类。
关系类是从商业领域各种事物之间的相互关系演变而来的,如帐户所属关系。
此领域中的类的适用性变得比较狭窄,它们可能仅仅只对某个公司适用。
1.4 应用领域
应用领域中的类只能被一个单独的应用系统所使用。它包括两组类:事件识别类和事件管理类。
事件识别类是事件监控者,检测环境中特定事件的发生。
事件管理类当一个给定类型的事件发生时执行适当的商业策略。
1.5 领域类的来源
保证可重用软件的能力是面向对象设计的必要条件,但来自不同领域的类具有不同的可重复使用级别。处于最低级别领域的类具有最大的可重复使用能力,处于最高级别领域类却具有最小的可重复使用能力。
2 依赖度
2.1 依赖度的定义
假设C的直接类引用集包含了类C1、C2、…、Cn。那么C的间接类引用集就是C的直接类引用集和C1、C2、…、Cn的间接类引用集的并集。这个定义是递归的,通过说明对基础领域中每个类的类引用都是空值来终止这种递归。
类C直接引用另一个类D的方式有以下几种:
C继承D,C中能一个D类的属性,C的方法有类D的参数,C的方法中有一个类D的局部变量等。
一个类的直接依赖度是指这个类的直接类引用集的大小。
一个类的间接依赖度的大小是指这个类的间接类引用集的大小。
2.2 依赖度的使用
依赖度为我们提供了一种衡量类的复杂程序的方法。因此高级别领域的类具有较高的间接依赖度,处于低级别的类则具有较低的间接依赖度。
出现一个并非希望得到的间接依赖度即意味着类的设计中存在问题。例如在一个低级别的领域中一个类具有很高的依赖度,这个类的内聚就存在问题。而一个高级别的领域的类具有很低的依赖度,说明这个类也比较糟糕,它是由简单的基本类型创建的。
2.3 Demeter规则
有人称之谓最少知识原则,通常是以如下语言描述的:
对类C而言,在其所有定义的方法中,所有消息的目的地是下面形式之一:
1 类C自身,调用this,self等上的方法
2通过方法参数传入的对象
3 类C自身的成员对象
4 在方法中创建的其它对象
5 通过全局变量引用的一个对象
Demeter规则有强弱之分,两者只在第3条有差异,强规则只允许使用类C中定义的成员变量,而弱规则还允许使用继承自基类的成员。
这个规则之所以有用是因为它一个给定类对其它类的任意调用。强规则严格限制超过封装边界的继承。可以简化系统的可维护性和可扩展性。
3 类的内聚性
一个低级内聚的类具有一组并不属于一个整体的特性,一个高内聚的类具有一组可以通过类来实现的抽象类型的特性。
可以通过观察使用类变量的方法中出现重叠的强度,如果重叠越多则内聚越强。然而这种方法需要人为去观察类的实现,而且此方法也不够稳定。
通过下面不够成熟的三种内聚特性,我们可以避免实现较差的内聚。
3.1 混合属性内聚
混合属性内聚的类具有一些属性,对类的某些对象来说这些特征是未被定义的。
混合属性内聚通常指出一个非正确的类层次结构。例如对于经理也是雇员而言,但经理有额外分成,如果让经理和雇员使用一个类的话,则雇员需要多出来一个额外分成的属性,而这个属性普通雇员不会使用,即使使用也需要置为0。较好的方法是分离为两个派生类,一个子类拥有此属性,另一子类没有。
3.2 混合领域型内聚
如果类A在不涉及任何类B概念的前提下可以得到充分的定义,那么对于类B是A的非本征类。
如果类B捕获了A中固有的一些特性,则B是A的本征类。
一个混合领域型内聚的类包含一个元素,而这个元素是其它领域的非本征类的直接引用集。
比如让实数类支持三角运算、货币转换等操作。
当你设计给定领域的类时,如果需要将高级别领域的类引入到你正在设计的类中,则需要小心谨慎。
另一种判断两个类是否是同一领域的方法是假设在不涉及另一类的前提下,是否可以创建一个类。
3.3 混合角色型内聚
一个混合角色型内聚的类C包含这样一个元素,这个元素对C是非本征的,但其是同一领域其它类的依附集。
比如person类中含有一个成员,保存了一个人拥有多少个dog。这样做使得person类在不包含狗的应用场景中无法被重用。