4.3 自顶向下设计

最后更新于:2022-04-02 00:27:56

## 4.3 自顶向下设计 采用传统过程式语言进行模块化编程时,主要通过自顶向下方法来进行系统设计。 自顶向下设计也称为逐步求精(stepwise refinement),是将一个系统逐层分解为子系统的设计过程。首先,对整个系统进行概要设计,指明构成系统的顶层子系统有哪些,注意在 此并不给出各个子系统的细节。其次,对每个子系统重复这个设计过程,即再将每个子系统 分解为下一层的子系统。就这样不断细化每个子系统,直至子系统的功能足够简明,可以直 接编码实现为止。 自顶向下设计具有两个特征:第一,要求设计者一开始就对整个系统有清楚的理解,否 则第一步的分解就无法进行;第二,任何子系统在足够细化之前无法开始编码实现,因而必 须等到所有子系统都足够细化,才可能对系统编码实现及测试。 更具体地说,用自顶向下方法编程序时,总是先写主程序,它是由根据系统功能划分而 成的功能子程序组成的。然后再分析每个子程序的需求,如果有必要就继续像主程序一样分 解下去。当划分出来的子程序最终具有非常简单的功能时,就直接编码实现。当所有子程序 都编码实现,整个程序也就实现了。可以相信,由于分解过程总是导致越来越小的程序部件, 最终必然达到“足够简单”的层次,因此不可能无限分解下去。 下面通过一个案例程序来演示自顶向下设计方法。 我们要解决的问题是打印公元某年的年历。要说明一点,为了避免涉及公元历法的一些历史变迁问题,我们对需求做了简化,只要求程序适用于公元 1900 年以后各年份①。相应程 序的规格说明如下: > ① 程序算法实际上是一般的。将基准日期换成格里高利历的开始日(1582 年 10 月 15 日,星期五)后,很 容易扩展本程序的适用年份范围。 ``` 程序:calendar 输入:公元年份 year(1900 以后) 输出:year 年年历 输入与输出的关联:根据 year 可以算出相对于 1900 年 1 月 1 日(星期一)总共过去了多少天,按 7 天循环即可得知 year 年 1 月 1 日是星期几,从而得出全年年历。 ```
';