• C# 利用键值对取代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了。

  • 相关阅读:
    网络分析[3] 发布NAServer到ArcGIS for Server(以Server 10.4为例)
    Vuejs环境安装与工程建立【小白Windows向】
    【C语言学习】-05 二维数组、字符串数组、多维数组
    【C语言学习】-04 一维数组、字符数组
    【C语言学习】-03 循环结构
    【C语言学习】-02 分支结构
    【C语言学习】-01 C基础
    ios layoutsubView 何时被调用
    Xcode 断点调试,取消直接进入到汇编语言界面处理
    一步一步实现iOS应用PUSH功能
  • 原文地址:https://www.cnblogs.com/MaFeng0213/p/7487121.html
Copyright © 2020-2023  润新知