官术网_书友最值得收藏!

第3條:確保前置條件與后置條件都能夠得到滿足

修理電子設(shè)備的時候,我們首先要檢查供電是否正常,也就是檢查電流有沒有從電源模塊正確地流入該設(shè)備的電路中。在很多情況下,這項檢查都能幫助我們找出問題。計算機(jī)程序與之類似,很多問題也可以通過對例程的入口點(diǎn)(entry point)與出口(exit)進(jìn)行檢查而得以確定。入口點(diǎn)就是前置條件(precondition),它指的是程序在即將執(zhí)行例程時所具備的狀態(tài),以及傳遞給該例程的輸入值,出口則是后置條件(postcondition),它指的是程序執(zhí)行完例程之后的狀態(tài)及其返回值。如果前置條件得不到滿足,那說明用來設(shè)置這些前置條件的代碼里面有錯誤,若是后置條件得不到滿足,則說明該例程本身有問題。如果兩者都正確,那么應(yīng)該轉(zhuǎn)向其他地方去尋找bug。

我們可以在例程開始的地方、調(diào)用例程的地方或關(guān)鍵算法開始執(zhí)行的地方設(shè)置斷點(diǎn)(參見第30條)。為了判斷前置條件是否得到滿足,我們應(yīng)該仔細(xì)檢查算法的參數(shù),包括傳入的參數(shù)值,調(diào)用方法時所針對的對象,以及可疑代碼所使用的全局狀態(tài)。尤其要注意以下幾點(diǎn):

?找出那些本來不應(yīng)為null,但實(shí)際上卻為null的值。

?調(diào)用數(shù)學(xué)函數(shù)的時候,確保傳入的值位于該函數(shù)的定義域之內(nèi),例如,調(diào)用log函數(shù)時傳入的值應(yīng)該大于0。

?查看對象、結(jié)構(gòu)體與數(shù)組的內(nèi)部細(xì)節(jié),確保其內(nèi)容符合要求。這也可以幫你查出無效的指針。

?檢查變量的取值是否在合理范圍之內(nèi)。如果變量具有6.89851e-308或61007410這樣的可疑取值,那通常表明它還沒有初始化。

?檢查傳給例程的數(shù)據(jù)結(jié)構(gòu)是否正確,例如,map有沒有包含預(yù)期的鍵與值,雙向鏈表(doubly linked list)能不能正確地遍歷。

然后,我們應(yīng)該在例程結(jié)束的地方、調(diào)用完例程的地方或關(guān)鍵算法執(zhí)行完畢的地方設(shè)置斷點(diǎn),以判斷該例程的執(zhí)行效果是否正確:

?計算出來的結(jié)果看上去合理嗎?有沒有處在預(yù)期的范圍之內(nèi)?

?如果結(jié)果合理,而且位于預(yù)期的范圍之內(nèi),那么實(shí)際的值是否正確?我們可以通過手算來演練相應(yīng)的代碼,以驗證計算機(jī)的執(zhí)行結(jié)果是否正確(參見第38條),也可以將執(zhí)行結(jié)果與已知的正確值相對比,或是采用其他工具或方法來進(jìn)行驗算。

?例程的副作用是否符合預(yù)期?可疑代碼所接觸到的其他數(shù)據(jù)是否遭到破壞或擁有了不正確的取值?有些算法在遍歷數(shù)據(jù)結(jié)構(gòu)時,會把一些維護(hù)其工作所用的信息記錄在數(shù)據(jù)結(jié)構(gòu)中,對于這些算法來說,尤其應(yīng)該進(jìn)行這樣的檢查。

?算法所獲得的資源,如文件句柄及鎖,有沒有正確地釋放?

同樣的方法也可以用在更為高層的操作與配置環(huán)境中。例如,如果要驗證SQL語句是否正確地構(gòu)建了某張表格,我們可以查看它所掃描的那些表格及視圖,并且看看它構(gòu)建出來的那張表格是什么樣子。如果要判斷基于文件的處理流程是否正確,我們可以檢查其輸入文件與輸出文件。如果要調(diào)試某個構(gòu)建在Web服務(wù)上面的操作,我們可以檢查其中每項Web服務(wù)的輸入與輸出。如果要排解整個數(shù)據(jù)中心的故障,我們可以檢查其中每個元素所需要的及所提供的機(jī)制是否正確,其中包括網(wǎng)絡(luò)連接、DNS、共享存儲、數(shù)據(jù)庫以及中間件等。在這些情況下,我們都必須親自驗證(verify),而不能想當(dāng)然地接受假設(shè)(assume)。

要點(diǎn)

■ 仔細(xì)檢查例程的前置條件與后置條件。

主站蜘蛛池模板: 项城市| 晋宁县| 庆安县| 鱼台县| 惠东县| 绥滨县| 扶沟县| 伊川县| 西藏| 普定县| 清徐县| 海城市| 枣阳市| 南康市| 方城县| 通山县| 句容市| 迁安市| 北宁市| 康乐县| 阿拉尔市| 黄大仙区| 鲁甸县| 济源市| 泰兴市| 静宁县| 遂溪县| 阿克| 石河子市| 荆州市| 固安县| 达州市| 青冈县| 遂溪县| 城固县| 祁东县| 云浮市| 朝阳市| 三亚市| 玉树县| 宁晋县|