解决多个if-else的方案
参考链接:
遇到大量if记住下面的口诀:
互斥条件表驱动
嵌套条件校验链
短路条件早return
零散条件可组合
解释:
- 互斥条件,表示几个条件之间是冲突的,不可能同时达成的。比如说一个数字,它不可能同时是4和2。在这种情况下用表驱动就非常合适,表驱动的核心是key-handler,拿某个key去对应某个handler,只要条件符合key,那么就执行对应的handler。
- 嵌套条件,表示几个条件是必须同时达成的,比如,只有在手机号码格式正确的情况下才执行某个操作,格式正确就包括必须是字符串、长度为11位、所有位都是数字这些条件,那么就可以使用校验链,比如通过描述的校验链:"string&size:11&numchar:0,*"。能用的形式很多,你可以直接使用&&逻辑运算符拼接条件,也可以把规则写成Validator。
- 短路条件,表示只要某个条件满足了,那么就不用再继续下面的任何操作了。比如传进来的参数是null、参数如果为0,就不会有其他操作等情况,都可以聚合这些条件,在一开始的时候就判断并且直接返回,或者程序在中间会产生一些可以直接判断为不需要继续往下操作的条件,那么同样是直接在当场就return。
- 零散条件,是指存在以上三种任意组合的条件形式,那么就可以通过组合这些解决方案。例如,遇到null,直接短路返回,然后之后的代码使用表驱动来区分互斥条件,在达成某个互斥条件的时候,通过校验链来验证嵌套条件等。
(99+ 封私信 / 84 条消息) 优化代码中大量的 if/else ,你有什么方案? - 知乎 (zhihu.com)
彻底消灭if-else,你需要这8种方案! - 知乎 (zhihu.com)
表驱动方法学习:
《编写高质量代码改善C程序的157个建议》表驱动
《责任链模式学习》
C#设计模式(21)——责任链模式 - Learning hard - 博客园 (cnblogs.com)
表驱动法——核心就是条件要是互斥的,一种条件对应一种方法,然后通过键值的方式去通过条件(key)查到对应的方法(value)并执行。
static void Main(string[]args)
{
Console.WriteLine(GetChineseWeekInTable(Week.Friday));
}
static string GetChineseWeekInTable(Week week)
{
string[]chineseWeek={"星期一","星期二","星期三","星期四","星期五",
"星期六","星期日"};
return chineseWeek[(int)week];
}
复杂一点的,这是一种按照索引值驱动的表驱动法。枚举元素所代表的整型值,很容易和字符串数组索引组合起来了,用两行语句就可以完美地替代原先的GetChineseWeek方法。但是,这种方法有局限性,完成的功能也很有效,如果将需求换成:星期一Mike打扫卫生、星期二Rose清理衣柜、星期三Mike和Rose没事可以吵吵架、星期四Rose要去Shopping……也就是说需求由静态属性变成了动态行为,那么事情就变得复杂了。
遇上这种情况,我们可能会想到使用多态,在这里仍然使用表驱动法并加上一点反射来实现这类动态的行为,代码如下所示:
static void Main(string[]args)
{
SampleClass sample=new SampleClass();
var addMethod=typeof(SampleClass).GetMethod(ActionInTable(Week.Monday));
addMethod.Invoke(sample,null);
}
static string ActionInTable(Week week)
{
string[]methods={"Cleaning","CleanCloset","Quarrel","Shopping",Temp","Temp","Temp"};
return methods[(int)week];
}
class SampleClass
{
public void Cleaning()
{
Console.WriteLine("打扫");
}
public void CleanCloset()
{
Console.WriteLine("清理衣柜");
}
public void Quarrel()
{
Console.WriteLine("吵架");
}
public void Shopping()
{
Console.WriteLine("购物");
}
}
解决多个if-else的方案的更多相关文章
- echarts解决一些大屏图形配置方案汇总
本文主要记录使用echarts解决各种大屏图形配置方案. 1.说在前面 去年经常使用echarts解决一些可视化大屏项目,一直想记录下使用经验,便于日后快速实现.正好最近在整理文档,顺道一起记录在博客 ...
- php面试题二--解决网站大流量高并发方案(从url到硬盘来解决高并发方案总结)
php面试题二--解决网站大流量高并发方案(从url到硬盘来解决高并发方案总结) 一.总结 从外到内解决网站大流量高并发问题---从提交一个url开始(从用户按下搜索栏回车键开始) url最开始会到d ...
- (转)解决Win7/8硬盘占用高方案汇总
写在前面 在Windows7时代,很少人会抱怨硬盘占用率高的问题.但是到了Windows7/8.1时,硬盘占用率成为一个扰人的问题.硬盘占用率经常100%会导致系统卡.慢,而且也很伤硬 ...
- SSO解决session共享的几种方案
之前做项目遇到了这个sso系统,当时只是理解了一部分,今天偶尔发现一篇文章,觉得写的不错,增加了sso知识: 单点登录在现在的系统架构中广泛存在,他将多个子系统的认证体系打通,实现了一个入口多处使用, ...
- 解决socket负载均衡集群方案和代码实现
有一段时间,在考虑下socket 之间集群 可以在Nginx 下可以 但是不同服务器之间怎么通讯呢 后来自己也想可不可以用什么东西或者中间件来通讯 ,后来在百度之下 发现果然就是按照我所想的 ,在网上 ...
- popupWindow设置后完美解决返回键响应无效的方案以及popupWindow背景透明方案
// 点击其他地方消失 viewPuwAddNew.setOnTouchListener(new OnTouchListener() { @Override public boolean onTouc ...
- IE6-IE9兼容性问题列表及解决办法:锁表头的JQuery方案和非JQuery方案(不支持IE6,7,8)
鉴于从IE8开始,IE不再支持css的expression了,所以以前依靠它完成锁表头的代码就全部失效了,面对新的浏览器,一切又要重新来过了. 现在所能找到的对于锁表头的方案主要有两种路子:一种是使用 ...
- 解决Mysql中文乱码问题的方案
MySQL会出现中文乱码的原因不外乎下列几点: 1.server本身设定问题,例如还停留在latin12.table的语系设定问题(包含character与collation)3.客户端程式(例如ph ...
- 解决Eclipse Maven插件的最佳方案
最近在尝试使用GAE,要求项目必须使用Maven,于是下载了Maven3.1.1配置了环境变量.但是在为Eclipse EE安装Maven插件的时候遇到了问题. 官网的建议是: 在Eclipse EE ...
- spring maven项目解决依赖jar包版本冲突方案
引入:http://blog.csdn.net/sanzhongguren/article/details/71191290 在spring reference中提到一个解决spring jar包之间 ...
随机推荐
- Project Euler 457 题解
初等数论小题目 求 \[n^2-3n-1\equiv 0\pmod {p^2} \] 配方,得到: \[(2n-3)^2\equiv 13 \pmod {p^2} \] 根据亨泽尔引理,只需得到 \( ...
- Flink内存解释
一.JobManager内存 JobManager 是 Flink 集群的控制单元. 它由三种不同的组件组成:ResourceManager.Dispatcher 和每个正在运行作业的 JobMast ...
- Amis配置
一.穿梭器 { "type": "transfer-picker", "name": "parentMenuId", & ...
- ABB机械手维修37001电机开启接触器错误
当ABB机器人报告37001电机开启接触器错误时,这往往意味着电机上电的接触器在执行动作时遇到了障碍.具体而言,该错误通常与位于控制柜内左下角的接触器相关,其中K42和K43负责控制电机的开启操作.深 ...
- 小米10至尊纪念版—官方稳定版一键 TWRE刷入+面具ROOT
1.解锁BL http://www.miui.com/unlock/index.html 2.备份+关机(虽然不会清理数据,但是小心为上) 3.音量下+开机进入fastboot模式 4.解压压缩包,运 ...
- 傻妞教程——对接PagerMaid-Pyro
PagerMaid-Pyro 是一个开源的 TG 人形自走 Bot 方案,功能强大而丰富,可以帮助你打造专属的便利功能. 为什么叫人形机器人? TG 官方是有 Bot Api 的,但是这个 Api 需 ...
- HTTPS 与 HTTP 的区别在哪?
HTTP与HTTPS作为互联网数据传输的核心协议,其通信机制与安全特性深刻影响着现代网络应用的可靠性与用户体验.本文将解析两者的通信流程.安全机制及核心差异. 一.HTTP的通信机制 先来看看HTTP ...
- docker下安装Harbor
安装docker-compose # 安装docker-compose curl -L https://github.com/docker/compose/releases/download/1.18 ...
- 一个生成随机颜色的js函数
function getRandomColor(){ let rgb = []; for(let i=0;i<3;++i){ let color = Math.floor(Math.random ...
- 通用C++ Makefile
点击查看代码 ///////////////////////////////////////////// CC = g++ CFLAGS=-Wall -O2 TARGET = main SRCS := ...