1. 程式人生 > >代替 if-else,switch-case 的幾種方法

代替 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++中委託和多型的技術。

好了,上面說了一些方法,希望能對你們有用,另外可能總結得不完全,希望知道其他方式的朋友不吝賜教。謝謝!