前不久看到一文章,說(shuō)用assert的時(shí)候不要把非法情形和錯(cuò)誤情形混淆了,錯(cuò)誤始終是要處理的.
然后我review自己最近寫(xiě)的代碼,愣是沒(méi)有弄明白什么是非法什么是錯(cuò)誤,難道錯(cuò)誤不是非法么,非法不是錯(cuò)誤么?
我本身用assert是相當(dāng)頻繁和隨意的,但是經(jīng)過(guò)這么一看,反而覺(jué)得原來(lái)那些assert的代碼都要改成錯(cuò)誤處理了...
花非花,霧非霧.
經(jīng)過(guò)思考與實(shí)踐,最終確定了規(guī)則.
非法情形,大部分你覺(jué)得有問(wèn)題的地方,需要約束的地方,都可以認(rèn)為可能存在非法情形.比如指針有效性,字符串長(zhǎng)度,數(shù)值范圍等等.更抽象的說(shuō),非法情形存在于動(dòng)作開(kāi)始執(zhí)行前的狀態(tài)中.
相對(duì)之,錯(cuò)誤就是動(dòng)作執(zhí)行之后的結(jié)果,錯(cuò)誤是針對(duì)執(zhí)行結(jié)果的.
詳細(xì)而言,當(dāng)調(diào)用一個(gè)函數(shù),進(jìn)入函數(shù)體的時(shí)候,就進(jìn)入了一個(gè)非法情形出現(xiàn)點(diǎn),在這里,在執(zhí)行任何具體的計(jì)算和動(dòng)作之前,面對(duì)參數(shù)還有其他狀態(tài),你嗅到的任何東西都可以說(shuō)是非法情形.然后函數(shù)開(kāi)始執(zhí)行,這里面所出現(xiàn)的任何(大多數(shù))失敗都是一種錯(cuò)誤,需要進(jìn)行處理.
需要著重強(qiáng)調(diào)的是,函數(shù)的執(zhí)行結(jié)果(返回值)絕對(duì)是一種錯(cuò)誤(如果返回值是那個(gè)意思的話(huà)),而不是非法狀態(tài).(考慮一種計(jì)算函數(shù),它的返回結(jié)果限制在某個(gè)范圍內(nèi),這是非法狀態(tài)還是錯(cuò)誤呢?我認(rèn)為還是錯(cuò)誤,雖然有些像非法狀態(tài),要進(jìn)行更嚴(yán)格的處理和提示).
我極度強(qiáng)調(diào)在函數(shù)執(zhí)行前確認(rèn)非法狀態(tài),而不是當(dāng)成錯(cuò)誤處理(通常這種處理都是默默的,不透明的,不像assert那樣囂張-_-|||).因?yàn)槲覀儗?xiě)函數(shù)(接口)的目的,是希望能被正確的調(diào)用,而不是胡亂(導(dǎo)致局部或者整體狀態(tài)混亂)的使用(為此我們居然要將assert寫(xiě)成錯(cuò)誤處理的形式,以容忍各種白癡的調(diào)用行為).
但是有一些情形,在不得以的情況下,比如一個(gè)函數(shù),要assert某個(gè)指針是有效的,然后才能執(zhí)行某些動(dòng)作,但是隨后的執(zhí)行狀況是,極度可能在那個(gè)指針無(wú)效的時(shí)候卻仍然不可避免的調(diào)用該函數(shù),那么你就把a(bǔ)ssert簡(jiǎn)單的用if替換掉就是了,沒(méi)什么難的.但是,第一次寫(xiě)下那個(gè)函數(shù)的時(shí)候,嚇你一跳的assert永遠(yuǎn)是不二的選擇,如果你直接就用了if之類(lèi)的錯(cuò)誤處理,后面出什么狀況就不是那么顯眼了.
正確的濫用assert吧,至少我是這么做的.
posted on 2006-07-15 18:35
LOGOS 閱讀(2833)
評(píng)論(9) 編輯 收藏 引用