W3Cschool
恭喜您成為首批注冊(cè)用戶
獲得88經(jīng)驗(yàn)值獎(jiǎng)勵(lì)
通常當(dāng)你寫(xiě)函數(shù)時(shí)會(huì)對(duì)接收的參數(shù)做了隱含的假設(shè)。如果這些假設(shè)成立,程序沒(méi)有問(wèn)題;如果假設(shè)不成立,你的程序可能就會(huì)崩潰了。
為了讓你的程序更為健壯,將你的假設(shè)明確,以程序文檔的方式寫(xiě)下來(lái)或?qū)懘a來(lái)進(jìn)行檢查。
比如我們觀察calculateCartesian方法。是否存在對(duì)當(dāng)前對(duì)象進(jìn)行了假設(shè)呢?沒(méi)錯(cuò),我們假設(shè)極坐標(biāo)系的標(biāo)志量已經(jīng)設(shè)置了并且mag和theta的值是有效的。如果假設(shè)不成立,那么這個(gè)函數(shù)的結(jié)果無(wú)意義。
一種做法是對(duì)函數(shù)添加注釋說(shuō)明先決條件以警告他人。
void Complex::calculateCartesian ()
// 先決條件:當(dāng)前對(duì)象包含有效的極坐標(biāo)值,其極坐標(biāo)標(biāo)志量已設(shè)定。
// 后置條件:當(dāng)前對(duì)象包含有效的笛卡爾坐標(biāo)系和極坐標(biāo)系的值,兩個(gè)標(biāo)志量皆已設(shè)置。
{
real = mag * cos (theta);
imag = mag * sin (theta);
cartesian = true;
}
同時(shí),我添加了后置條件,即我們認(rèn)為函數(shù)執(zhí)行完畢后為真的事情。
這些注釋對(duì)于閱讀你代碼的人很有用,但更好的辦法是通過(guò)代碼來(lái)檢查先決條件,并輸出合適的錯(cuò)誤信息:
void Complex::calculateCartesian ()
{
if (polar == false) {
cout << "calculateCartesian failed because the polar representation is invalid" << endl;
exit (1);
}
real = mag * cos (theta);
imag = mag * sin (theta);
cartesian = true;
}
exit函數(shù)會(huì)使程序很快的退出執(zhí)行。返回值是一個(gè)錯(cuò)誤碼以告訴系統(tǒng)(或該程序執(zhí)行者)某些錯(cuò)誤發(fā)生。
這種錯(cuò)誤檢測(cè)方式很是常見(jiàn),于是C++提供了一個(gè)內(nèi)置函數(shù)來(lái)檢查先決條件并打印錯(cuò)誤信息。如果你包含了assert.h頭文件,你可以使用一個(gè)以布爾值或條件表達(dá)式為參數(shù)的assert函數(shù)。只要參數(shù)為真,assert函數(shù)就啥也不做。如果參數(shù)為假,assert打印一個(gè)錯(cuò)誤信息并退出,用法如下:
void Complex::calculateCartesian ()
{
assert (polar);
real = mag * cos (theta);
imag = mag * sin (theta);
cartesian = true;
assert (polar && cartesian);
}
第一句assert檢查先決條件(事實(shí)上只是一部分先決條件),第二句assert檢查后置條件。
在我的開(kāi)發(fā)環(huán)境中,當(dāng)一個(gè)斷言失敗時(shí)會(huì)得到以下信息:
Complex.cpp:63: void Complex::calculatePolar(): Assertion ‘cartesian’ failed.
Abort
信息中會(huì)有許多內(nèi)容可以幫助我跟蹤錯(cuò)誤,包括文件名和斷言失敗的出錯(cuò)行,斷言語(yǔ)句的內(nèi)容和所在函數(shù)名。
Copyright©2021 w3cschool編程獅|閩ICP備15016281號(hào)-3|閩公網(wǎng)安備35020302033924號(hào)
違法和不良信息舉報(bào)電話:173-0602-2364|舉報(bào)郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號(hào)
聯(lián)系方式:
更多建議: