ThinkChat🤖让你学习和工作更高效,注册即送10W Token,即刻开启你的AI之旅 广告
我在本章阐述了一种程序开发的方法,我称之为**快速建原型及迭代完善**。先编写一个能执行基本运算的草案(或原型),然后用几个案例进行测试,发现缺陷并修正之。 尽管此方法很有效,但也会使代码变得没有必要的复杂--因为要处理许多特殊情况,而且不可靠--因为你很难知道是否发现了所有的错误。 一种备案是高屋建瓴,对问题看得深入一点可使变成更加容易。对此案例的深入看法是:一个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。