9.9 增量开发vs高屋建瓴
优质
小牛编辑
135浏览
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。