switch....case 在一定程度上破壞了代碼的整潔性,為了讓代碼更加簡潔,這裡想到使用鍵值對來對switch.....case進行替換 ...
swich....case 條件分支多了之後,會嚴重的破壞程式的美觀性。
比如這個
上述代碼是用於兩個進程之間通信的代碼,由於通信的枚舉特別的多,所以case的分支特別的多。導致了代碼的可讀性,可維護性嚴重下降。經過查找資料和重構,想到了一種可行的在這種情況替代switch...case的方案——————利用鍵值對。
聲明鍵值對對象
針對進程通信的代碼邏輯,構建瞭如下的鍵值對。
Dictionary<EnumMsg, Action<Message>> mMessageReceiver = new Dictionary<EnumMsg, Action<Message>>();
這個鍵值對的鍵是自定義的消息枚舉,值是Action<Message>
的委托。這樣消息枚舉和消息枚舉對應的處理函數就一一對應了。
初始化時註冊消息
在初始化時,將枚舉與相應的Action進行裝載。
private void SubscribeMessageReceiver()
{
mMessageReceiver.Add(EnumMsg.SEND_PANO_PARAM, UpdatePano);
mMessageReceiver.Add(EnumMsg.CMD_PANO_VIEW, ExecutePanoViewCommand);
mMessageReceiver.Add(EnumMsg.CMD_PANO_LENGTH_MEASURE, ExecuteLengthMeasure);
mMessageReceiver.Add(EnumMsg.CMD_PANO_AREA_MEASURE, ExecuteAreaMeasure);
mMessageReceiver.Add(EnumMsg.CMD_PANO_QUICK_PICK, ExecuteQickPickCommand);
}
這樣就把鍵值對對象構建完成。那麼就可以將重構swith...case代碼段了。
修改switch...case代碼段
重構前的switch....case代碼
protected override void DefWndProc(ref Message m)
{
switch (m.Msg)
{
case ((int)API.WM_COPYDATA):
{
switch ((int)m.WParam)
{
case ((int)Procedure.OpenSkyline):
m = OpenSkylineView(m);
break;
case ((int)Procedure.Measureare):
m = Measure(m);
break;
case ((int)Procedure.Measurelength):
m = Measure(m);
break;
}
}
break;
default:
break;
}
base.DefWndProc(ref m);
}
基於鍵值對來查找對應的處理方法的代碼
protected override void DefWndProc(ref Message m)
{
base.DefWndProc(ref m);
if (m.Msg == (int)API.WM_COPYDATA)
{
EnumPanoMsg pEnumPanoMsg = (EnumPanoMsg)m.WParam;
if (mMessageReceiver.Keys.Contains(pEnumPanoMsg))
{
mMessageReceiver[pEnumPanoMsg](m);
}
}
}
根據鍵值對的鍵來進行查找,當需要增加新的case分支的時候,原本的方法需要更改switch....case分支,但是利用鍵值對的方法,只需要編寫新的處理方法,並且在鍵值對中增加新的一對鍵值就可以了。代碼簡潔美觀,沒有一長串令人厭煩的case了。