9.9 增量开发vs高屋建瓴

优质
小牛编辑
130浏览
2023-12-01

我在本章阐述了一种程序开发的方法,我称之为快速建原型及迭代完善。先编写一个能执行基本运算的草案(或原型),然后用几个案例进行测试,发现缺陷并修正之。

尽管此方法很有效,但也会使代码变得没有必要的复杂--因为要处理许多特殊情况,而且不可靠--因为你很难知道是否发现了所有的错误。

一种备案是高屋建瓴,对问题看得深入一点可使变成更加容易。对此案例的深入看法是:一个Time对象其实就是一个基为60的3位数!秒是个位,分钟是“60位”,小时是“3600位”。

当我们编写addTime和increment两个函数,我们实际上是在做以60为基数的加法,所以我们需要进位。

还有一种解决整个问题的备案,即把Time类型转换为double类型,它利用了这样一个事实:计算机已经能够做double型的算术。下面是一个将Time转换为double的函数:

double convertToSeconds (const Time& t) {
    int minutes = t.hour * 60 + t.minute;
    double seconds = minutes * 60 + t.second;
    return seconds;
}

现在我们需要的只是把double转换为Time的方法了:

Time makeTime (double secs) {
    Time time;
    time.hour = int (secs / 3600.0);
    secs -= time.hour * 3600.0;
    time.minute = int (secs / 60.0);
    secs -= time.minute * 60;
    time.second = secs;
    return time;
}

你可能需要想一想,才能相信我所使用的不同基数之间的转换技术是正确的。假设你已经想通了,我们就可以用这些函数来重写addTime:

Time addTime (const Time& t1, const Time& t2) {
    double seconds = convertToSeconds (t1) + convertToSeconds (t2);
    return makeTime (seconds);
}

比之前的版本精简了不少,证明其正确性也更加容易(按常规要假设其调用的函数是正确的)。给大家一个练习:用同样方法重写increment。