switch case 大量情況下的代碼優化


業務場景:設備和客戶端按照通訊協議進行通信,設備會有大量的消息送到到客戶端,然后客戶端收到消息並進行解析,根據不同的消息類型進行區分處理。

如果不考慮設計模式,不考慮易擴展性和易維護性,通常我們的代碼會是如下情況:

        /// <summary>
        /// 設備消息送到解析
        /// </summary>
        /// <param name="MsgType"></param>
        private void ExplainData(ushort MsgType)
        {
            switch (MsgType)
            {
                case (ushort)EMMsgType.LogSerialNumSever: //登錄序號
                    //處理當前的業務
                    break;
                case (ushort)EMMsgType.LogResultServer: //登錄結果
                    //處理這里的業務
                    break;
                case (ushort)EMMsgType.ResultPhoneCallMoney://電召費用查詢結果返回
                    if (條件1)
                    {
                        //處理這里的業務
                    }
                    else
                    {
                        //處理這里的業務
                    }
                    if (條件2)
                    {
                        //又處理其他情況
                    }
                    else
                    {
                        //處理這里的業務
                    }
                    break;
            }
        }

如果協議中的設備消息有100種,那我們自然就當前switch里面會包含100個case,每個case之間又會還有相關的業務代碼。

真實代碼片段是這樣的

這個switch里面包含了522行代碼,如果需要修改或增加新的業務功能,需要在522行代碼里面小心的增加已避免對其他case里的代碼造成影響。其維護難度太大了。

如何考慮代碼優化

客戶端接收到消息-》處理消息。我們增加一個消息處理接口類。

    public interface BaseExplainData
    {
        /// <summary>
        /// 數據解析
        /// </summary>
        /// <param name="msgData"></param>
        void ExplainData();

    }

 

 增加實現了消息處理基類的具體實現類

    public class 設置終端參數處理類:BaseExplainData
    {
        public void ExplainData()
        {
            Console.WriteLine("這里是設置終端參數處理類");
            //其他處理
        }
    }

    public class 平台返回心跳處理類 : BaseExplainData
    {
        public void ExplainData()
        {
            Console.WriteLine("這里是平台返回心跳處理類");
            //其他處理
        }
    }

    public class 客服端心跳包處理類 : BaseExplainData
    {
        public void ExplainData()
        {
            Console.WriteLine("這里是客服端心跳包處理類");
            //其他處理
        }
    }

    public class 終端通用應答處理類 : BaseExplainData
    {
        public void ExplainData()
        {
            Console.WriteLine("這里是終端通用應答處理類");
            //其他處理
        }
    }

增加個字典(字典由於有key,所以是高效查找),key是消息類型,對應的保存的是該消息的實例化的消息處理類。

        public Dictionary<EMMsgType, BaseExplainData> dicExplainReceiveData = new Dictionary<EMMsgType, BaseExplainData>
        {
            {EMMsgType.終端通用應答,new 終端通用應答處理類()},
            {EMMsgType.客服端心跳包,new 客服端心跳包處理類()},
            {EMMsgType.平台返回心跳,new 平台返回心跳處理類()},
            {EMMsgType.設置終端參數,new 設置終端參數處理類()},
            //如果以后有增加其他消息處理,就在后面追加
        };

如果后續又增加了其他的消息協議,因為字典里的對象是平行關系,只需要在字典里追加。簡單直接。

最后的處理代碼,設備消息過來,根據消息類型從字典里取出實例化的對象,調用ExplainData處理。

 1         /// <summary>
 2         /// 設備消息送到解析
 3         /// </summary>
 4         /// <param name="MsgType"></param>
 5         private void ExplainData(EMMsgType MsgType)
 6         {
 7             var rst=dicExplainReceiveData[MsgType];
 8             if (rst!=null)
 9             {
10                 rst.ExplainData();
11             }
12         }

如果后續又增加了其他的消息協議,這里完全不用修改。

代碼簡潔清晰,再也不用看switch..case...case...case...^0^

~結束

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM