下面摘自http://m.shnenglu.com/woaidongmao/archive/2008/11/03/65897.html
看到他們的在爭(zhēng)論很有意思,我不是很懂。
有利還是有弊呢?
EXT_ASSERT將ASSERT與if結(jié)合在一起
ASSERT在DEBUG程序時(shí)候幫了太多太多忙,不過(guò)在ASSERT判斷傳入?yún)?shù)后,還需要if再按相同條件判斷一遍,不符合規(guī)則return,這樣才是正確的邏輯。但這樣代碼難看,且工作重復(fù)無(wú)趣,又容易出現(xiàn)差漏。
剛弄了個(gè)簡(jiǎn)單EXT_ASSERT宏,按我的理解應(yīng)該可以解決問(wèn)題,但不確定是否有漏洞,發(fā)出來(lái)大家一起瞄瞄。
#define RET_VOID
#define EX_ASSERT(exp, ret) {ASSERT(exp);if(!(exp))return(ret);}
BOOL CXXX::FunXXX(const data* p_data)
{
EXT_ASSERT(p_data, FALSE);//---- 返回BOOL型
}
int CXXX::FunXXX(const data* p_data)
{
EXT_ASSERT(p_data, -1);//---- 返回int型
}
const retdata* CXXX::FunXXX(const data* p_data)
{
EXT_ASSERT(p_data, NULL);//---- 返回NULL指針
}
retdata CXXX::FunXXX(const data* p_data)
{
EXT_ASSERT(p_data, retdata());//---- 返回空對(duì)象
}
void CXXX::FunXXX(const data* p_data)
{
EXT_ASSERT(p_data, RET_VOID);//---- 僅僅return
}
posted on 2008-11-03 23:34 肥仔 閱讀(333) 評(píng)論(7) 編輯 收藏 引用 所屬分類: C++存檔
評(píng)論
# re: EXT_ASSERT將ASSERT與if結(jié)合在一起 回復(fù) 更多評(píng)論
哥們兒,如果你是說(shuō)MFC里的ASSERT的話(看你的類命名風(fēng)格,估計(jì)是吧),在retail build里,ASSERT是完全不會(huì)被放到代碼里的。你這樣用ASSERT,把ASSERT和if條件綁在一起就等于把處理錯(cuò)誤的斷言和正常程序邏輯綁在了一起,不是一個(gè)好的設(shè)計(jì)。如果一定要這么干,也該是綁VERIFY,至少在retail build里VERIFY里的邏輯還會(huì)被執(zhí)行。ASSERT應(yīng)該拿來(lái)斷言程序正常執(zhí)行完全不可能出現(xiàn)的錯(cuò)誤(這些錯(cuò)誤會(huì)在debug build里出現(xiàn)是因?yàn)楫?dāng)前程序還不完善),在正常邏輯中,他們是不應(yīng)該用程序邏輯去handle的錯(cuò)誤,所以一句ASSERT夠了。
# re: EXT_ASSERT將ASSERT與if結(jié)合在一起 回復(fù) 更多評(píng)論
@www.helpsoff.com.cn我在Imperfect C++中看到過(guò)相同的言論。
不過(guò)我的應(yīng)用是,常常用ASSERT檢測(cè)參數(shù)的合法性,ASSERT之后,當(dāng)然還要if一把了,對(duì)于ASSERT和if不要放在一起這種觀點(diǎn),我不是很認(rèn)同,我覺得放在一起很好用的。
另外,在Release下,ASSERT沒了,但是if留下了,這是需要的效果。
# re: EXT_ASSERT將ASSERT與if結(jié)合在一起 回復(fù) 更多評(píng)論
我不會(huì)這么用,斷言的目的去那了。# re: EXT_ASSERT將ASSERT與if結(jié)合在一起 回復(fù) 更多評(píng)論
@肥仔哥們兒,你還是沒理解,ASSERT的不是拿來(lái)干這個(gè)的。你愛怎樣玩就怎樣玩吧,反正自己的代碼自己維護(hù),其他人的意見聽不聽在你。
# re: EXT_ASSERT將ASSERT與if結(jié)合在一起 回復(fù) 更多評(píng)論
@www.helpsoff.com.cn謝謝你的意見,但是不采納。原因有3點(diǎn)經(jīng)歷:
1、ASSERT判斷函數(shù)參數(shù)合法性,調(diào)試時(shí)會(huì)幫了很大的忙;
2、if判段函數(shù)參數(shù)合法性,是健壯性的一部分;
3、ASSERT和if 合在一起,不覺得有任何不妥,且ASSERT不出現(xiàn)在Release中,這正是需要的。
可能涉及到的一個(gè)爭(zhēng)論是,檢測(cè)參數(shù)合法形是調(diào)用者,還是被調(diào)用者的責(zé)任?
C/C++的主流是調(diào)用者保證參數(shù)的合法性,被調(diào)用者不檢測(cè)參數(shù)合法性,這就是為什么認(rèn)為,只要ASSERT,不需要if了。
strcpy(szBuf, NULL)之所以讓一個(gè)程序崩潰也是這個(gè)原因,但是為什么要讓它崩潰?能夠不崩潰,繼續(xù)執(zhí)行豈不是更好嗎?
# re: EXT_ASSERT將ASSERT與if結(jié)合在一起 回復(fù) 更多評(píng)論
1) 沒人否認(rèn)ASSERT的用處;2) 需要if判斷處理的參數(shù)和用ASSERT斷言的不合法參數(shù),不應(yīng)屬于一個(gè)范疇,不應(yīng)該混合在一起處理;
3) 代碼不管怎么寫在沒遇到問(wèn)題前都不會(huì)有什么不妥,自己覺得好就好吧。
你當(dāng)然可以去寫一個(gè)萬(wàn)能的strcpy,但是如何能保證你的strcpy是真正的“萬(wàn)能”的呢?不崩潰繼續(xù)執(zhí)行倒是沒問(wèn)題,但是出問(wèn)題的真正根源在哪里呢,你這樣做不就掩蓋了問(wèn)題嗎?應(yīng)該做的是出現(xiàn)這樣的問(wèn)題時(shí),能有用且有效的指出錯(cuò)誤,而不是做garbage in, garbage out。
設(shè)計(jì)代碼,不去扯那些玩得出花花的設(shè)計(jì)模式,有些很基本很直白的原則,比如說(shuō)“garbage in, garbage out”,比如高內(nèi)聚/低耦合...說(shuō)多了也沒意思,樓主愛怎么玩怎么玩,大家都是這么過(guò)來(lái)的,其中的東西自己去體會(huì)了。
# re: EXT_ASSERT將ASSERT與if結(jié)合在一起 回復(fù) 更多評(píng)論
@www.helpsoff.com.cn程序以外,人生很多地方都需要與別人探討,對(duì)于不合己見者,請(qǐng)不必太在懷,更沒必要帶著情緒和語(yǔ)氣,擺出姿態(tài)。這樣才能贏得更多的合作,我想我的這幾句話還算中肯。