面向对象分析与设计(第3版)
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

1.4.1 复杂系统的规范形式

这个例子表明,我们前面对“层次结构”这个术语的使用方式是很宽泛的。大部分有趣的系统不只包含单一的层次结构,相反,我们发现同一个复杂系统中通常表现出许多不同的层次结构。例如,研究飞行器时我们可以将它分解为推进系统、飞行控制系统等。这种分解代表了结构上或“组成部分(part of)”的层次结构。

另外,我们可以按一种完全正交的方式来分解这个系统。例如,涡轮引擎是一种具体的喷气引擎,Pratt and Whitney TF30又是一种具体的涡轮引擎。换言之,喷气引擎代表了所有类型的喷气引擎的共同特性的抽象,涡轮引擎只是一种特殊类型的喷气引擎,它有一些特有的特征,可以和冲压喷气式引擎区分开来。

第二种层次结构代表了“是一种(is a)”的层次结构。根据我们的经验,从这两种观点来看系统都很重要,应该既研究它的“是一种”层次结构,也研究“组成部分”层次结构。我们把这些层次结构分别称为“类结构”和“对象结构”,原因将在下一章中解释[15]

如果读者熟悉对象技术,我们要做一些澄清。在这个例子里,当我们提到类结构和对象结构时,并不是指在编写软件时创建的类和对象。我们指的是更高抽象层的类和对象,它们组成了复杂的系统,如喷气引擎、飞机骨架、不同类型的座位、自动导航子系统等。读者可以回顾前面关于复杂系统属性的讨论,什么是基础组件与观察者有关。

图1-1所示为系统的两个正交的层次结构:它的类结构和它的对象结构。每个层次结构都是分层的,在许多基础类和对象之上构建了许多抽象类和对象。选择哪些类或对象作为基础类或对象,这与要解决的问题有关。深入每个层次,又会看到另一层的复杂性。特别是在对象结构的各个部件中,同一抽象层上的对象之间存在着紧密的协作。

图1-1 复杂系统的关键层次结构

将类结构和对象结构的概念与复杂系统的5种属性(层次结构、相对基础(如多层次的抽象)、分离关注、模式和稳定的中间形式)结合起来,我们发现,基本上所有的复杂系统都具有相同的(规范的)形式,如图1-2所示。我们将系统的类结构和对象结构统称为它的“架构”。

图1-2 复杂系统的规范形式

还要注意的是,类结构和对象结构不是完全独立的,对象结构中的每个对象都代表了某个类的一个具体实例。(在图1-2中,注意类C3、C5、C7和C8和实例03、05、07和08。)正如在图中所看到的,复杂系统中对象的数量通常比类的数量要多很多。通过展示“组成部分”和“是一种”层次关系,我们明确地揭示了被研究系统的冗余性。如果不揭示系统的类结构,我们就不得不将属性方面的知识重复地放到每个部分中。通过类结构,我们在一个地方记录了这些共同的属性。

在同样的类结构中,对象实例化和组织的方式可以采取许多不同的方式。没有一种特定的架构可以真正被认为是“正确的”。这也是使得系统架构具有挑战性的原因——在可能的多种系统组件结构、复杂系统的5种属性及系统用户的需求之中寻找平衡。

经验表明,最成功的复杂软件系统就是在设计中包含了深思熟虑的类结构和对象结构,并具备了前一节所描述的复杂系统的5种属性。为了不让这个重要的结论被忽略掉,让我们说得再直接一些:如果不考虑这些因素,我们就不太可能准时地在预算范围之内交付满足需求的软件系统。