代替 if-else,switch-case 的幾種方法
if-else,switch-case 是判斷邏輯的語句,只要我們需要分支,就可能要用到這種語句,在 C 的程式設計風格中,更是動則需要這種判斷語句,問題是這種判斷語句如果多了,就會毀壞程式碼的可讀性和維護性,增加了程式碼的“臭味”。那現在的面向物件程式設計時代,我們是否有些方法來代替呢?嗯,是有的,C++語言提供的多型、模版等特性就非常適合於編寫代替 if-else、switch-case 的程式碼。
我們舉一個簡單的例子來說明。一個事件的檢查函式 CheckEvent(int nEvent) 判斷事件的到來,並執行相應的操作。如果使用 if-else 或 switch-case 的話,程式碼如下:
// 使用IF-ELSE的函式
void CheckEvent(int nEvt)
{
if(nEvt == 1)
cout << "1" << endl;
if(nEvt == 2)
cout << "2" << endl;
}
// 呼叫程式碼如下
void main()
{
int nEvent = 1;
CheckEvent(nEvent);
int nEvent = 2;
CheckEvent(nEvent);
}
下面我們用多型來代替之:
// 第一種代替IF-ELSE的方法
class CEvent
{
public:
virtual void Show() = 0;
};
class CEvent1: public CEvent
{
public:
virtual void Show()
{
cout << "1" << endl;
}
};
class CEvent2 : public CEvent
{
public:
virtual void Show()
{
cout << "2" << endl;
}
};
void CheckEventNoIfElse(CEvent *pEvt)
{
pEvt->Show();
}
// 呼叫程式碼如下
void main()
{
// 第一種 多型技術
CEvent1 evt1;
CEvent2 evt2;
CheckEventNoIfElse(&evt1);
CheckEventNoIfElse(&evt2);
}
看到多型的用途了吧,在 CheckEvent 中不用再出現判斷程式碼了。
多型屬於一種動態的方法,我們也可以使用模版技術(一種屬於靜態的方法):
// 第二種代替IF-ELSE的方法
template<class T>
void CheckEventTemplate(T *evt)
{
evt->Show();
}
// 呼叫程式碼如下
void main()
{
// 第二種 模版技術
CEvent1 evt1;
CEvent2 evt2;
CheckEventTemplate(&evt1);
CheckEventTemplate(&evt2);
}
另外,我們也可以使用一些設計模式來代替 if-else switch-case 這種判斷選擇的程式碼,例如 state模式,就是代替switch-case 的一種很好的方法,《敏捷》裡也有提到,可參考之。也可參考本人的《設計模式簡單程式碼之State模式》。實際 State 模式也就是使用了C++中委託和多型的技術。
好了,上面說了一些方法,希望能對你們有用,另外可能總結得不完全,希望知道其他方式的朋友不吝賜教。謝謝!