問題背景
假如有一組狀態變量sta_1, sta_2, sta_3, ..., sta_m,分別表示一個系統的所有狀態值sta_const_1, sta_const_2, sta_const_3,...,sta_const_m。
約束:
- 其中任一時刻系統只能原子的處於其中的任一個狀態常量值,不會發生兩個狀態同時並存的情況。
- 每個週期更新一次狀態變量。
傳統方法
包裝到switch...case語句中或者是if-elseif-else中,這樣下來,真個程序看上去既冗長也比較礙眼。 如果碰上完美型人格的人,這段代碼能一直困擾着他/她。
void set_sta(const sys_state& cur_state)
{
switch (cur_state)
{
case sta_const_0:
sta_1 = false;
sta_2 = false;
sta_3 = false;
...
sta_m = false;
break;
case sta_const_1:
sta_1 = true; // this state is active, rest state are inactive
sta_2 = false;
sta_3 = false;
...
sta_m = false;
break;
case sta_const_2:
sta_1 = false;
sta_2 = true; // this state is active, rest state are inactive
sta_3 = false;
...
sta_m = false;
break;
case sta_const_3:
sta_1 = false;
sta_2 = false;
sta_3 = true; // this state is active, rest state are inactive
...
sta_m = false;
break;
case sta_const_m:
sta_1 = false;
sta_2 = false;
sta_3 = false;
...
sta_m = true; // this state is active, rest state are inactive
break;
default: /// this is a case easily ignored
// error logic
break;
}
}
優化方法
通過觀察狀態變量值的變化與系統狀態之間的邏輯關係,可以發現只有和系統狀態一致的那個狀態變量是true,其他的都爲false。 換種說法是,一個狀態變量的值只取決於該系統的狀態是否等於該狀態變量所指示的狀態。所以,可以把這個發現轉換成狀態變量的邏輯運算結果,從而使代碼的邏輯得到極大簡化,不僅少敲很多代碼,而且也不容易出錯,更重要的是後期的維護和擴展也更方便。請看如下代碼:
void set_sta(const sys_state& cur_state)
{
sta_1 = (sta_const_1 == cur_state);
sta_2 = (sta_const_2 == cur_state);
sta_3 = (sta_const_3 == cur_state);
...
sta_m = (sta_const_m == cur_state);
}
其它應用
在多頁面的應用中,有時會根據某個狀態值,來切換頁面的顯示,來決定隱藏哪些頁或顯示哪一頁。對於這個場景,該優化的方法也是非常適用的。該方法能將頁面的切換邏輯變得格外簡單,賞心悅目。
原創文章,樂於分享。歡迎轉載,註明出處!
--------------------------------------------------------------------------------
Love your code, then love your life.