C++ 先決條件

2023-03-20 16:50 更新

通常當(dāng)你寫函數(shù)時會對接收的參數(shù)做了隱含的假設(shè)。如果這些假設(shè)成立,程序沒有問題;如果假設(shè)不成立,你的程序可能就會崩潰了。
為了讓你的程序更為健壯,將你的假設(shè)明確,以程序文檔的方式寫下來或?qū)懘a來進(jìn)行檢查。
比如我們觀察calculateCartesian方法。是否存在對當(dāng)前對象進(jìn)行了假設(shè)呢?沒錯,我們假設(shè)極坐標(biāo)系的標(biāo)志量已經(jīng)設(shè)置了并且mag和theta的值是有效的。如果假設(shè)不成立,那么這個函數(shù)的結(jié)果無意義。
一種做法是對函數(shù)添加注釋說明先決條件以警告他人。

void Complex::calculateCartesian () 
// 先決條件:當(dāng)前對象包含有效的極坐標(biāo)值,其極坐標(biāo)標(biāo)志量已設(shè)定。
// 后置條件:當(dāng)前對象包含有效的笛卡爾坐標(biāo)系和極坐標(biāo)系的值,兩個標(biāo)志量皆已設(shè)置。
{ 
        real = mag * cos (theta); 
        imag = mag * sin (theta); 
        cartesian = true; 
}   

同時,我添加了后置條件,即我們認(rèn)為函數(shù)執(zhí)行完畢后為真的事情。
這些注釋對于閱讀你代碼的人很有用,但更好的辦法是通過代碼來檢查先決條件,并輸出合適的錯誤信息:

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ù)會使程序很快的退出執(zhí)行。返回值是一個錯誤碼以告訴系統(tǒng)(或該程序執(zhí)行者)某些錯誤發(fā)生。
這種錯誤檢測方式很是常見,于是C++提供了一個內(nèi)置函數(shù)來檢查先決條件并打印錯誤信息。如果你包含了assert.h頭文件,你可以使用一個以布爾值或條件表達(dá)式為參數(shù)的assert函數(shù)。只要參數(shù)為真,assert函數(shù)就啥也不做。如果參數(shù)為假,assert打印一個錯誤信息并退出,用法如下:

void Complex::calculateCartesian () 
{ 
        assert (polar); 
        real = mag * cos (theta); 
        imag = mag * sin (theta); 
        cartesian = true; 
        assert (polar && cartesian); 
} 

第一句assert檢查先決條件(事實(shí)上只是一部分先決條件),第二句assert檢查后置條件。
在我的開發(fā)環(huán)境中,當(dāng)一個斷言失敗時會得到以下信息:

Complex.cpp:63: void Complex::calculatePolar(): Assertion ‘cartesian’ failed.   
Abort  

信息中會有許多內(nèi)容可以幫助我跟蹤錯誤,包括文件名和斷言失敗的出錯行,斷言語句的內(nèi)容和所在函數(shù)名。

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

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號