编程思想 | 自顶向下,逐步求精

什么是自顶向下,逐步求精?

采用传统过程式语言进行模块化编程时,主要通过自顶向下方法来进行系统设计。 自顶向下设计也称为逐步求精(stepwise refinement),是将一个系统逐层分解为子系统的设计过程。首先,对整个系统进行概要设计,指明构成系统的顶层子系统有哪些,注意在 此并不给出各个子系统的细节。其次,对每个子系统重复这个设计过程,即再将每个子系统 分解为下一层的子系统。就这样不断细化每个子系统,直至子系统的功能足够简明,可以直接编码实现为止。

自顶向下设计具有两个特征:第一,要求设计者一开始就对整个系统有清楚的理解,否 则第一步的分解就无法进行;第二,任何子系统在足够细化之前无法开始编码实现,因而必 须等到所有子系统都足够细化,才可能对系统编码实现及测试。

更具体地说,用自顶向下方法编程序时,总是先写主程序,它是由根据系统功能划分而 成的功能子程序组成的。然后再分析每个子程序的需求,如果有必要就继续像主程序一样分解下去。当划分出来的子程序最终具有非常简单的功能时,就直接编码实现。当所有子程序 都编码实现,整个程序也就实现了。可以相信,由于分解过程总是导致越来越小的程序部件, 最终必然达到“足够简单”的层次,因此不可能无限分解下去。

举个例子

假如我们现在要为洗衣机厂家开发程序,观察我们身边的洗衣机,可以大致写出下面的程序框架:

  1. 选择洗衣模式: 对应水位, 注水时间
  2. 注水,水位计计水位
  3. 浸泡,计时器计时
  4. 电机转动,左 3 次, 右 3 次
  5. 排水,水位计计水位
  6. 电机转动(脱水)
  7. 结束, 关闭电源

可以看到有一些共性的部分,比如转动电机,计时器计时。这时候,我们采用逐步求精的思想,先在主代码中写出函数,再逐步实现他们。

READ 用户模式 
REPEAT 
    注水
UNTIL 水位 = 注水要求 
timer.setTimeout(20)
REPEAT
    浸泡
UNTIL timer.timeout()
timer.setTimeout(20)
WHILE (!timer.timeout()) 
rotate(1, 0.1, 1)
rotate(1, 0.1, 0)
ENDWHILE
WHILE (水位 != 0) 
排水 
ENDWHILE
timer.setTimeout(20) 
WHILE (!timer.timeout()) 
rotate(1, 10, 1)
ENDWHILE 
关闭电源

其中 rotate(strength, time, direction) 指示了滚筒的转动,而 timer 则负责计时。

在设计其他软件的时候也是同样的思路,先写出主体的框架,不必关注具体细节。然后再根据总体思路,实现各个具体的函数,减少了思维难度和记忆量,也减少了错误的发生,因此为软件工程界所推崇。

你可能感兴趣的:(编程思想 | 自顶向下,逐步求精)