解决多个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包之间 ...
随机推荐
- CRISP-DM的应用与理解
本文分享自天翼云开发者社区<CRISP-DM的应用与理解>,作者:吴****嫄 CRISP-DM是一个数据挖掘项目规划的开放标准流程框架模型,主要分为业务理解.数据理解.数据准备.建模.评 ...
- 数据团队必读:智能数据分析文档(DataV Note)五种高效工作模式
数据项目,无论是数据分析.可视化,还是数据科学和机器学习相关的项目,通常都非常复杂,涉及多个组成部分,比如代码.数据.运行环境.SQL脚本以及分析报告等:与此同时,随着AI时代的到来,数据科学领域正经 ...
- mysql连接出现java.sql.sql exception:服务器时区值'''_''''无法识别或表示多个时区
在连接mysql的JDBC的url后面加上服务器的时区:serverTimezone=UTCjdbc:mysql://localhost:3306/geek?useUnicode=true&c ...
- 【效能提升】测试人员提bug,应该提供哪些信息以便排查问题?
背景 我们在运维企业级应用时,会遇到很多Bug. 有时候,测试人员或业务方反馈bug,描述得不够详细,我们基于他的描述很难清晰地了解情况,以解决bug. 一般情况下,我们会跟他询问更多的详情,才能知悉 ...
- Flume - [08] 绝密档案Ⅰ
题记部分 (1)Flume使用场景 线上数据一般主要是落地(存储到磁盘)或者通过socket传输给另一个系统,这种情况下,你很难推动线上应用或服务去修改接口,实现直接向kafka里写数据,这时候你 ...
- 2024CSP-S邮寄
前言 去年被沉重打击到了,不过从此以后心态就好很多了,不会因为什么考试动不动就崩溃了. 考前 一直在认真复习,也停了课,甚至差点错过运动会.从国庆开始听了几天课,消化课件,然后考试.考试的稳定性不高, ...
- Spring Boot 3.0深度实战:从核心特性到生产级调优
一.Spring Boot 3.0核心特性解读 1.1 JDK 17 LTS支持(实测性能提升) 记录类(Record)与Spring Data JPA完美适配 模式匹配简化类型判断 密封类(Seal ...
- 面试题10- II. 青蛙跳台阶问题
地址:https://leetcode-cn.com/problems/qing-wa-tiao-tai-jie-wen-ti-lcof/ <?php /** 一只青蛙一次可以跳上1级台阶,也可 ...
- Linux 通过docker安装nginx,.net core sdk或运行时安装到Linux
1.Linux docker通过yum安装 https://blog.csdn.net/GMingZhou/article/details/94024453 https://qizhanming.co ...
- 【moectf】wp
http 用wsrx打开靶机 根据任务描述 得到moectf{basic_http_knowledge_oen0w64iYZqSeT6BT8c9OgFTV-KNMT6g} Web入门指北 打开pdf文 ...