例如:在class mutators中使用assert()是不錯的做法嗎?
void Date::month(unsigned int inMonth) {
assert(inMonth <= 12);
_month = inMonth;
}
如果這不是好的做法,什麼是去了解這個正確的方法是什麼?
例如:在class mutators中使用assert()是不錯的做法嗎?
void Date::month(unsigned int inMonth) {
assert(inMonth <= 12);
_month = inMonth;
}
如果這不是好的做法,什麼是去了解這個正確的方法是什麼?
您不應該使用assert來確保公共成員函數的參數有效。原因是你的班級的客戶無法以任何有意義的方式對失敗的斷言做出反應(事實上斷言從發佈版本中刪除也無濟於事)。作爲一個經驗法則,assert只能用於嚴格控制的事情(例如,私有方法的參數)。
在這種情況下,你最好拋出一個異常std::invalid_argument:
void Date::month(unsigned int month)
{
if(month == 0 || month > 12)
{
throw std::invalid_argument("a month must be in the [1-12] range");
}
_month = month;
}
是的。
這是正確的方法。
雖然我叫它setMonth()
而不是month()
還銘記裸即assert()
進行預處理成沒有在發佈版本。所以如果你想要的東西也可以在發佈版本中使用,那麼你可以編寫自己的斷言或者進行適當的運行時檢查。
沒問題,只要在應用程序中出現意外輸入,就可以斷言。 此外,由於您不想設置無效的月份值,因此拋出異常類似ArgumentException的異常。
另一種方式,也使代碼更易讀將定義爲一個月枚舉類型:
enum e_Month {
e_Month_January,
e_Month_February,
e_Month_March,
// etc..
e_Month_December
};
現在你的任務就變成了:
void Date::month(e_Month inMonth) { _month = inMonth; }
大多數編譯器會導致錯誤分配另一鍵入enum,這樣你就可以獲得編譯時安全性,它總是在範圍內。
同意了,但一個'斷言()'在一個公共的方法可能是,如果'throw'導致性能問題更好(認爲'矢量::操作符[]')。但是'assert()'不應該**用於驗證外部數據,比如通過文件,套接字,鍵盤等輸入(至少不在生產代碼中) – rtlgrmpf 2012-08-31 12:15:48