C++ 增量開(kāi)發(fā)vs高屋建瓴

2023-03-20 15:59 更新

我在本章闡述了一種程序開(kāi)發(fā)的方法,我稱之為快速建原型及迭代完善。先編寫(xiě)一個(gè)能執(zhí)行基本運(yùn)算的草案(或原型),然后用幾個(gè)案例進(jìn)行測(cè)試,發(fā)現(xiàn)缺陷并修正之。

盡管此方法很有效,但也會(huì)使代碼變得沒(méi)有必要的復(fù)雜--因?yàn)橐幚碓S多特殊情況,而且不可靠--因?yàn)槟愫茈y知道是否發(fā)現(xiàn)了所有的錯(cuò)誤。

一種備案是高屋建瓴,對(duì)問(wèn)題看得深入一點(diǎn)可使變成更加容易。對(duì)此案例的深入看法是:一個(gè)Time對(duì)象其實(shí)就是一個(gè)基為60的3位數(shù)!秒是個(gè)位,分鐘是“60位”,小時(shí)是“3600位”。

當(dāng)我們編寫(xiě)addTime和increment兩個(gè)函數(shù),我們實(shí)際上是在做以60為基數(shù)的加法,所以我們需要進(jìn)位。

還有一種解決整個(gè)問(wèn)題的備案,即把Time類型轉(zhuǎn)換為double類型,它利用了這樣一個(gè)事實(shí):計(jì)算機(jī)已經(jīng)能夠做double型的算術(shù)。下面是一個(gè)將Time轉(zhuǎn)換為double的函數(shù):

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

現(xiàn)在我們需要的只是把double轉(zhuǎn)換為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;
}

你可能需要想一想,才能相信我所使用的不同基數(shù)之間的轉(zhuǎn)換技術(shù)是正確的。假設(shè)你已經(jīng)想通了,我們就可以用這些函數(shù)來(lái)重寫(xiě)addTime:

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

比之前的版本精簡(jiǎn)了不少,證明其正確性也更加容易(按常規(guī)要假設(shè)其調(diào)用的函數(shù)是正確的)。給大家一個(gè)練習(xí):用同樣方法重寫(xiě)increment。

以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)