對class成員函數(shù)而言,特別是public成員函數(shù),在函數(shù)的入口處往往會有一大段if()語句進(jìn)行參數(shù)有效性檢查,(對應(yīng)該的,對private成員函數(shù),我更喜歡用assert)。除此之外,class對象也經(jīng)常會擁有一定的狀態(tài),并某幾個狀態(tài)之間進(jìn)行不斷的切換,而class的成員函數(shù)也往往只會在對象牌某種狀態(tài)下調(diào)用才是有效的,因此對這樣的類函數(shù),除參數(shù)檢查外,狀態(tài)檢查也是必要的。
比如對錄音機Recorder這樣一個類而言,至少會有幾個狀態(tài):數(shù)據(jù)加載Loading,數(shù)據(jù)保存Saving,數(shù)據(jù)加載完畢Loaded,數(shù)據(jù)錄制Recording,數(shù)據(jù)播放Playing等等,這些狀態(tài)往往是互斥的(但并不總是這樣),對Play()函數(shù),必須Loaded=true,對Save函數(shù),必須Recording=false
狀態(tài)檢測的必要性在于:代碼的擴大(復(fù)雜化),新人參與的維護(hù)及狀態(tài)的更迭隨時有可能在出人意料的情況下調(diào)用到某些函數(shù),這些函數(shù)可能在大多數(shù)情況下在這里調(diào)用是有意義的,但在某些極端的情況下卻可能造成數(shù)據(jù)破壞,因此在各函數(shù)入口處執(zhí)行完善的狀態(tài)檢測是很有意義的。
針對各種狀態(tài)可以維護(hù)一個對應(yīng)的bool值,但寫一個enum附帶一個status數(shù)組可能更容易維護(hù):
enum
{
stLoaded, //數(shù)據(jù)加載完畢
stRecording, //數(shù)據(jù)錄制中
stReplaying, //數(shù)據(jù)回放中
stSize //狀態(tài)數(shù)組的大小
};
bool m_aStatus[stSize];
OK,這時可以在構(gòu)造函數(shù)中執(zhí)行std::fill(m_aStatus, m_aStatus+stSize, false);對所有的狀態(tài)進(jìn)行初始化,特別是:你隨后可以任意地增減這個enum中狀態(tài)變量的數(shù)目或改動其名稱,同時均不需要擔(dān)心狀態(tài)變量初始化問題