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