1.3 设计的宏观面貌
软件设计听起来很高大上,很抽象,一般人闻之变色,但其实,软件设计的过程就是软件开发的过程,也就是从客户需求分析到构建软件系统的过程。设计的产物就是开发的产物,就是代码本身;俗话说得好,代码即设计。
面向对象设计的宏观面貌描述的就是设计的过程。
设计的过程有很多种,比如瀑布模型、原型模型、迭代模型、统一过程模型、极限编程、敏捷开发,等等,这么多的开发理论,读下来可以搞得你晕头转向,这是本书第一次提到它们,也差不多是最后一次,因为不管它们的定义和流程有多少差异,基本都可以归结为以下几个方面。
1.3.1 开发模式:自顶向下和自底向上
方式1:从上往下、步步细化
自顶向下的开发模式是不断地将相对复杂的大问题分解为相对简单的小问题,找出每个问题的关键、重点所在,然后用精确的思维定性、定量地去描述问题,最终完成软件的过程。该模式的核心本质是“不断分解”,直到每个问题都变成比较简单的编程问题。
这是大部分模型采用的正统开发模式,采用这种模式比较稳健,开发的过程很容易控制。
以开发一个网络爬虫获取各大网页的新闻为例,自顶向下的设计过程大致如表1-1所示。
表1-1 自顶向下的设计过程

上面是一个简单问题的自顶向下的分析过程,其实大部分讲软件设计的书都会讲到很多的实例,但本质上都是这样一个不断分解、不断细化的过程。
方式2:从下往上、步步抽象
自底向上的开发模式是先编写出基础程序段,然后再逐步扩大规模、不断补充和升级某些功能,最终构造出软件的过程。该模式的核心本质是“不断归纳”,直到形成稳定的系统。
这是新兴的模型们推荐的灵活的开发模式,采用这种模式比较灵活,系统应对变化的能力相对较强。但由于设计是从最底层开始的,所以如果设计经验不足的话,难以保证总体设计的最佳性。
还是以开发一个网络爬虫为例,自底向上的设计过程如表1-2所示。
表1-2 自底向上的设计过程

这就是一个典型的自底向上的开发过程,本质上就是不断归纳、不断抽象的过程。
实际上在现代设计中,有很多的大型项目都是混合使用自顶向下法和自底向上法的,因为自顶向下可以确定系统大的架构方向,自底向上可以灵活调整系统的实现细节。
1.3.2 开发方式:迭代
不管是采用自顶向下,还是自底向上,如果缺少迭代这种方式,都是万万不行的。注意到上面描述两种模式中的“不断”这个词了吧,“不断”就代表多次重复,就是迭代。迭代若用图来描述则如图1-4所示。

图1-4 迭代
这幅图也代表了软件开发宏观的全貌,从需求到设计,到实现,到测试,到部署运行,再到反馈,再回到新的需求,如此这般,就是现在大家普遍认同的软件设计的通用流程。
1.3.3 开发结果:模块化
虽然现在模块的规模和承载模块的部件都在发生着变化,但是模块化仍然是面向对象设计的核心,也是开发和最终部署的构件。
好了,至此设计宏观的讨论结束,这些步骤切实有效,在后面的章节中,我们将不断地见到它们的身影。