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了。

最新文章

  1. python操作mysql总结
  2. (斐波那契总结)Write a method to generate the nth Fibonacci number (CC150 8.1)
  3. 不可或缺 Windows Native (11) - C++: hello c++, C++ 与 C语言的区别小介
  4. Android Retrofit网络请求Service,@Path、@Query、@QueryMap、@FieldMap (转)
  5. Leetcode 400. Nth digits
  6. XIII Open Cup named after E.V. Pankratiev. GP of Azov Sea
  7. WCF 断点不会命中
  8. jquery限制div字符长度,超出部分已“…”显示
  9. OC动态特性
  10. 【Android 界面效果40】Android4.0-Fragment框架实现方式剖析(一)
  11. [React Native] Build a Separator UI component
  12. 原创 Reflector 8.1 反激活
  13. Cognos开发报表如何隐藏列
  14. 狗屎的asp.net core 果然发生了重大的变更
  15. springcloud(七):配置中心svn示例和refresh
  16. Japanese Learning - 五十音图
  17. 【Java学习笔记之十三】初探Java面向对象的过程及代码实现
  18. jQuery 操作input select,checkbox
  19. day08 python之函数初识
  20. 关于win10安装javaJDK时遇到的问题

热门文章

  1. java数据结构和算法01(数组的简单使用)
  2. 基于springboot搭建的web系统架构
  3. BFPRT算法
  4. 关于ios的光标和键盘回弹问题
  5. CASE 表达式
  6. Kafka 消费者相关配置
  7. 第3章 简单的C程序设计——顺序程序设计
  8. C# 中的Async 和 Await 的用法详解
  9. 使用JDBC连接操作数据库
  10. 强化学习(四)用蒙特卡罗法(MC)求解