- 面向对象分析与设计(第3版)(修订版)
- (美)格雷迪·布奇 罗伯特·A.马克西
- 2103字
- 2021-03-26 19:54:47
1.6 复杂系统的设计
每一种工程方法的实践,无论它是土木工程、机械工程、化学工程、电气工程还是软件工程,都涉及科学和艺术两方面的元素。正如Petroski曾雄辩地指出:“一个新结构的设计概念既包括想象力的跳跃,也包括经验和知识的融合,就像艺术家在他的画布或纸上创作作品一样。当作为艺术家的工程师想出这个设计之后,必须由作为科学家的工程师采用科学方法进行分析,像其他科学家所使用的方法一样”[38]。类似地,Dijkstra说:“程序设计任务是应用抽象的大规模练习,因此既需要正规数学家的能力,也需要称职工程师的态度”[39]。
1.6.1 作为科学和艺术的工程
在设计一个全新的系统时,工程师的角色特别有挑战性。特别是在设计响应式系统和命令控制系统时,常常需要针对一组完全独特的需求编写软件,运行在专门为这个系统配置的目标处理器上。在另一些情况下,如创建框架、研究人工智能的工具或信息管理系统,可能有定义良好的、稳定的目标环境,但是需求可能在一个或多个方面对软件技术形成压力。例如,可能需要创建一个更快的、容量更大的,或功能改进很快的系统。在所有这些情况下,我们都试图利用已经验证过的抽象和机制(用Simon的话说,就是“稳定的中间状态”)作为基础,在此之上构建新的复杂系统。在大量的可复用软件组件库中,软件工程师必须以一种创新的方式来组装这些部分,以满足明确和隐含的需求,就像画家或音乐家必须将他们的介质发挥到极致一样。
1.6.2 设计的含义
在每一种工程实践中,设计都是一种训练有素的方法,我们通过它来创造某个问题的解决方案,从而提供实现需求的途径。在软件工程中,Mostow指出设计的目的是要构建如下的一个系统:
■ 满足给定的(可能是非正式的)功能规格说明;
■ 符合目标介质的限制;
■ 满足隐含和明确的性能及资源使用需求;
■ 满足隐含和明确的关于产品形式方面的设计限制条件;
■ 满足对设计过程本身的限制条件,如时间、费用,或进行设计可用的工具。
Stroustrup指出,“设计的目的是创建一个干净的、相对简单的内部结构,有时候也称为架构……一份设计是设计过程的最终产物”[41]。设计包括在一组竞争的需求之间进行平衡。设计的产品是一些模型,让我们能够阐明我们的结构,当需求冲突时进行折中,总之,为实现提供了一份蓝图。
1.建模的重要性
建模在所有工程实践中都已得到广泛接受,这主要是因为建模引证了分解、抽象和层次结构的原则[42]。设计中的每个模型都描述了被考虑的系统的某个方面。我们尽可能地在老模型的基础上构建新模型,因为我们对那些老模型已经建立起了信心。模型让我们有机会在受控制的条件下失败。我们在预期的情况和特殊的情况下评估每个模型,当它们没能按照我们的期望工作时,我们就修改它们。
我们发现,为了表达一个复杂系统的所有精妙之处,必须使用多种模型。例如,当设计一台个人计算机时,电子工程师必须考虑系统的组件级视图以及线路板的物理布局。这个组件级视图构成了系统设计的逻辑视图,它帮助工程师思考组件间的协作关系。线路板的布局代表了这些组件的物理封装,它受到线路板尺寸、可用电源和组件种类等条件的限制。通过这个视图,工程师可以独立地思考散热和制造等方面的问题。线路板的设计者还必须考虑到在建系统的动态方面和静态方面。因此,电子工程师利用一些图示来展示单个组件之间的静态连接,也用一些时间图来展示这些组件随时间变化的行为。然后,工程师就可以利用示波器和数字分析设备来验证静态模型和动态模型的正确性。
2.软件设计方法学的要素
显然,不存在魔法,没有“银弹”可以万无一失地让软件工程师从需求得到一个复杂系统的实现。实际上,关于复杂系统的设计,不存在所谓的指南手册。正如前面提到的复杂系统的5个属性,设计这样的系统需要增量和迭代的过程。
但是,好的设计方法仍然为开发过程带来了非常必需的实践方法。软件工程界已经发展出几十种不同的设计方法学,可以将这些方法学大致分成三类(参见补充材料“分析和设计方法的分类”)。除去了它们的不同之处,所有这些方法都有一些共同的要素。具体来说,包括下列要素。
■ 表示法:表达每个模型的语言。
■ 过程:导致有序构建系统模型的过程。
■ 工具:消除建模中的枯燥工作并强制实现模型本身的规则的工件,可以揭示错误和不一致性。
一个好的设计方法基于牢固的理论基础,同时又提供艺术创新的自由。
3.面向对象开发的模型
是否存在“最好的”设计方法?对这个问题没有绝对的答案。它实际上只是前面问题的另一种提法:分解一个复杂系统的最佳方法是什么?通过反复实践,我们发现,构建关注问题域中的“事物”的模型具有很大的价值,这形成了我们所谓的面向对象分解。
面向对象分析和设计的方法实现了面向对象分解。通过应用面向对象设计,我们创建出能够灵活适应变化的软件,并体现出表达的经济性。通过明智地分离软件的状态空间,我们对软件正确性的信心提升到了一个新高度。最终,降低了开发复杂软件系统所固有的风险。
本章中,我们举例介绍了利用面向对象分析和设计来掌握开发软件系统相关的复杂性。另外,我们还指出了应用这种方法所带来的一些基本好处。但是,在讨论面向对象设计的表示法和过程之前,我们必须研究面向对象开发所基于的原则,也就是抽象、封装、模块化、层次结构、类型、并发和持久。