博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
关于消除超长的case列表的一个思路
阅读量:7026 次
发布时间:2019-06-28

本文共 1762 字,大约阅读时间需要 5 分钟。

  最近项目里面涉及和低层通信的一个模块,因为需要定义通信协议,然后一大堆指令,定义一个枚举的话就能看到几十上百的数据项,匹配操作的时候,那么问题来了,尼玛,这么多的case看着就头晕,就有了一个想法:怎么想办法把这长长的case列表给砍掉。

  咨询了几个技术好友,结果都不怎么如意。有个哥们跟我说,可以考虑使用反射,我开始有点蒙,后来他说是通过枚举字串反射为类实例再进行处理就好了。然后我确实明白了,但是,为了一个case表就要为何那么多类么?瞬间整个人都不好了。

  自己想了想,忽然想到了MFC里面有个消息映射,不就是用来处理消息和消息处理函数的关系的么?而且那就是一个超级长的case列表。既然有想法了就去试了试,因为基础不够好,在使用委托的时候,把事件和委托的关系弄的不清不楚的,而且在给消息映射的结构类的委托成员赋值的时候提示说必须使用静态成员,蒙了半天,最后还是克服了里面的困难,搞定了,代码如下:

1   public enum Commands2     {3         One = 0,4         Two,5         Three6     }
1  public class MessageMapping2     {3         public Commands Command { get; set; }4         public Action
Func { get; set; }5 }
1  public class DemoTest 2     { 3  4         private int Value = 0; 5  6         public void Execute(Commands command,object obj) 7         { 8             foreach (MessageMapping item in MessageMap) 9             {10                 if (item.Command == command)11                 { 12                     item.Func(new byte[1],obj);13                 }14             }15         }16 17         private MessageMapping[] MessageMap = new MessageMapping[] {18             new MessageMapping(){Command = Commands.One,Func = CommandDemo}};19 20         private static void CommandDemo(byte[] datas, object obj)21         {22             DemoTest model = obj as DemoTest;23             model.Value = 20;24             Console.WriteLine(model.Value);25         }26     };

然后是测试用的客户端代码:

1  static void Main(string[] args)2         {3             DemoTest demo = new DemoTest();4             demo.Execute(Commands.One, demo);5             Console.ReadKey();6         }

结果是:

这样一来,只需要在类里面维护一个消息映射结构的数组,然后添加相应的处理函数就可以了。增减数据项,对应的修改数组里面的数组元素就可以了。没有了那超长的恶心的case列表,代码也舒爽了很多。

人比较菜,欢迎大家拍砖

转载于:https://www.cnblogs.com/36hours/p/4610514.html

你可能感兴趣的文章
word转HTML在layuiadmin中锚点调转问题
查看>>
代码整洁之道——3、对象和数据结构
查看>>
HTML5
查看>>
[转] Express 4 中的变化
查看>>
润乾在东方通tongweb5.0上部署手册
查看>>
怎样制作爽心的 dashboard ?
查看>>
MySQL查询语句练习题(50题版)
查看>>
Docker 安装
查看>>
多数据库数据导入
查看>>
[AVR]高压并行编程---基础知识
查看>>
inl文件介绍
查看>>
js中的var a = new A;与var a = new A()的区别
查看>>
前端坑--表单篇
查看>>
P2P原理基础
查看>>
完成登录功能,用session记住用户名
查看>>
DBCP和C3P0使用--未完善
查看>>
JS常用方法(获取Class、获取元素样式、事件监听、cookie、ajax等)
查看>>
BZOJ 1084 最大子矩阵
查看>>
2018杭电多校第三场1007(凸包,极角排序)
查看>>
django中orm的简单操作
查看>>