“自顶向下,逐步求精”---编程思想方法介绍

引言

有时候我们会看到一个复杂的功能需要用程序实现,这时候我们就会犯难:“这要如何用代码实现呢?”


其实,程序员的一个基本功是,能够将复杂的问题分解开来。


简介

很多问题我们无法一步到位,这时候就要走一步再走一步,将复杂的问题分成简单的问题,将一个复杂的功能的实现分为自上而下的解构过程,将所谓的“黑箱”分崩离析,逐步细化为它所要实现的一个个简单功能集合,并一点点地将简单功能实现,再组合,最后实现我们所要实现的复杂功能,这便是我理解的“自顶向下,逐步求精”。
“自顶向下,逐步求精”---编程思想方法介绍_第1张图片
*图片源自百度图片

这种方法若是深入人心,编起程来也能做到心中有数,熟练地掌握这一方法需要我们有足够的观察力来分解问题,足够的逻辑能力将分解的功能组合,对顺序,循环,选择这三种基本结构的足够理解。


一个简单的例子

接下来我会以洗衣机的实现为例,并适当使用伪代码,直观地展示自顶向下,逐步求精的思想方法。
“自顶向下,逐步求精”---编程思想方法介绍_第2张图片

洗衣机,顾名思义就是可以完成洗衣功能的机器。而怎么样才是一次洗衣呢,可想而知,注水,洗涤,漂洗,脱水可以组成一次完整的洗衣过程。
1)注水:用户需要选择水量,并注入对应水量。
2)洗涤:通过底部转盘旋转,直筒摇动使衣物与筒壁摩擦以达到洗涤的目的。
3)漂洗:放水,将桶中的水顺管排出,再次注水淹没衣物,通过底部转盘旋转,将衣物中残余洗涤剂洗出,再次排水。
4)脱水:滚筒高速旋转,通过离心作用将衣物中残留水分甩出。

将功能结构到这里,我们会很容易发现一些细节问题,并再次完善整个洗衣过程。

  • 如何在达到既定水量的时候停止注水?
    通过传感器反馈的数据作为指标,当水到达一定高度触发传感器时就停止注水。

  • 转盘和直筒要如何旋转和摇动才能达到最好的洗涤效果?
    待测试。

  • 如何检测漂洗得干不干净?不干净的话要怎么办?
    每次漂洗过后通过传感器检测排出的水的ph值,若达到指标(即漂洗干净)就停止注水排水的过程,若未达到指标(即漂洗不干净),则重复漂洗过程。

  • 要是水管无法排水怎么办?
    若在漂洗过程中通过传感器检测到的水位一直不下降,则中断洗衣过程并发出警报提醒用户。

  • 要脱水到什么时候?
    直到水管中水流极少是即可。

通过以上的问答过程,我们可以不断地“自顶向下,逐步求精”。并最终拟出如下的伪代码。

begin
input 水量 
water_in_switch(openif(现水量>=输入水量)
water_in_switch(close)
end if
while(time_counter为4的倍数)
    if(电机正在左转)
    motor_run(rightelse(电机正在右转)
    motor_run(leftend if
    if(time_counter()>=一定时间)
    结束循环
motor_run(stop)
water_out_switch(open)
if(水量不变即水无法排出)
water_out_switch(close)
发出警报声
halt
else
继续程序
end if
repeat
    if(水流极小)
    water_out_switch(close)
    water_in_switch(openif(现水量>=输入水量)
    water_in_switch(close)
    end if
    water_out_switch(open)
    if(水量不变即水无法排出)
    water_out_switch(close)
    发出警报声
    halt
    else
    继续程序
    end if
until(水的ph值达到干净标准)
do
motor_run(left)
until(水流极小)
then 
发出警报
halt

整个过程下来我们可以轻易地找出各个小步骤的可以改进的地方并不断对程序加以改进,这里可以很清楚地体现出“自顶向下,逐步求精”方法的妙处。

你可能感兴趣的:(“自顶向下,逐步求精”---编程思想方法介绍)