有很多if-else,该如何优化?
2017-09-18 12:57
232 查看
有很多if-else,该如何优化?
javajbkzty 2016年01月20日提问 · 2016年01月20日更新
关注 15 关注
收藏 4 收藏,8.8k 浏览
问题对人有帮助,内容完整,我也想知道答案
0
问题没有实际价值,缺少关键内容,没有改进余地
这是我重构之后的代码:各位大神看看呢,我一直在纠结设计模式..要疯==
2016年01月20日提问
2 评论
邀请回答
编辑
你没见过我们的if else,拿出来吓死你!!!
— 蒲柳隐逸 · 2016年01月20日
switch 也是一种解决方案的,不错
— 程序猿小何 · 2016年01月27日
提交评论
×评论支持部分 Markdown 语法:
**bold**
_italic_
[link](http://example.com)
> 引用
`code`
- 列表。
同时,被你 @ 的用户也会收到通知
默认排序时间排序
10个回答
答案对人有帮助,有参考价值3
答案没帮助,是错误的答案,答非所问
已采纳
在if 不满足条件时直接return掉,就不用写else了,这样可以减少if的深度
对于你的例子了,如下:
if (!tokenCheck.equals(token)) { obj.setStatus(); obj.setMsg(); return obj; } if (!isContinue) { obj.setStatus(); obj.setMsg(); return obj; } if (action == 20) { // TODO } else if (action == 30) { // TODO }
这样会让代码好看一点.
如果你纠结设计模式的话,可以把“调用系统通知”和"调用短信接口"抽象成策略,实现共同的接口;
每个策略提供一个accept方法用于判断是否接受传入的actionId,如果accept通过,就可调用该策略的execute方法。
List<Strategy> strategys = new ArrayList<>(); strategys.add(new SystemNoticeStrategy()); strategys.add(new MessageStrategy()); for (Strategy stragety : stragetys) { if (strategy.accept(actionId)) { strategy.execute(); break; } }
这个的缺点是要遍历list,其实性能开销并不会太大。
也可以把这些strategys放到map里,然后直接根据actionId从map中取出并执行。
这是一种实现思路,可能还会有更好的方式。
2016年01月20日更新
1 评论
赞赏
编辑
牧曦之晨785
声望
答案对人有帮助,有参考价值
2
答案没帮助,是错误的答案,答非所问
这点if else优化个毛线 企业应用那种炒鸡复杂的逻辑都是要跑工作流的 轮不到你业务开发操心
你优化完业务错了就好玩了
唯一一点看着很不爽的 就是你用了一堆println 老老实实找个log4j来用好嘛
复杂一点的应用可以往外甩异常,然后通用的功能,比如鉴权之类,放到拦截器里做,不要放业务里,这样能简洁一点,然而你如果业务就这么复杂优化什么呢
设计模式不是为了模式而模式的,等你哪天上了spring,mybatis这些,想不模式都难
如果再装一点B呢,提示文字要弄到配置里去,或者用i18n来做,每个引用的地方只放对应的id,要不以后改一句话找死你
2016年01月20日更新
评论
赞赏
编辑
murmur2.2k
声望
答案对人有帮助,有参考价值
1
答案没帮助,是错误的答案,答非所问
推荐看 《重构:改善既有代码的设计》这本神书,可以解决代码设计上的很多问题,不仅仅是深层的if-else。
虽然有点答非所问的嫌疑,但冒死也要提交回答!
2016年01月27日回答
1 评论
赞赏
编辑
xuwenzhi960
声望
答案对人有帮助,有参考价值
1
答案没帮助,是错误的答案,答非所问
如果是我的话 我会写一个Map池,存进map里,直接从Map里取
2016年02月05日回答
评论
赞赏
编辑
Marken99
声望
答案对人有帮助,有参考价值
0
答案没帮助,是错误的答案,答非所问
嵌套的 if 可以通过细化成方法来优化
比如你这里
if (tokenCheck.equals(token)) { doWork(...); } else { ... } void doWork(...) { if (isContinue) { ... } else { .... } }
以此类推
2016年01月20日回答
3 评论
赞赏
编辑
有明24.4k
声望
答案对人有帮助,有参考价值
0
答案没帮助,是错误的答案,答非所问
你这里应该是说的判断actionId的if太多了吧。
如果每个if后面跟的业务逻辑很复杂你可以用多态来代替if
但是你这里似乎不是很复杂,也没什么大问题
2016年01月20日回答
2 评论
赞赏
编辑
Wizzzze6
声望
答案对人有帮助,有参考价值
0
答案没帮助,是错误的答案,答非所问
if-eles 和 switch 在本质上没啥区别,如果条件特别多的话有两种方法细分
一种是先分大段,再分小段,比如
int n = id / 50; switch (n) { case 0: do0_49(id); break; case 1: do50_100(id); break; // .... }
另一种方法就是建表,把所有 id 对应的东西都放在表中,比如 HashTable。
如果是完全连续(或者少数不连接)的情况,就用数组或者 List 解决了。
你的这个问题中,键是 int,值是 String(保存消息文本) 就好,在其它更复杂的情况下,可以保存对象(比如 Listener 对象,或者 Command 对象之类的)
2016年01月20日回答
1 评论
赞赏
编辑
边城25.8k
声望
答案对人有帮助,有参考价值
0
答案没帮助,是错误的答案,答非所问
像这种情况,最常见的,也是效率较高的就是做查找表,或者Hash表
即:
建一个表:
Map ActionMap = new HashMap<Integer, String>(){ { put(20, "ddd"); put(40, "line1\nline2"); } };
然后再直接索引输出:
System.out.println(ActoinMap.get(id));
2016年01月27日回答
评论
赞赏
编辑
相关文章推荐
- switch...case 和 if...else效率比较和优化
- 如何实现JSTL if else if else 的jsp标签
- 如何在代码中减少if else语句的使用
- if else 如何排序业务分支
- 如何在JSP页面中使用JSTL标签实现if和if-else判断,判断条件使用<%=value%>
- 如何在JSP页面中使用JSTL标签实现if和if-else判断
- R中如何用ifelse进行数据分组
- if else语句的优化
- java中过多if-else分支语句的优化方案
- 循环语句中的if else 结构里面如何使用break语句?
- switch...case 和 if...else效率比较和优化
- MySQL 如何利用一条语句实现类似于if-else条件语句的判断
- 过多if-else分支的优化
- 优化时序之补全if else
- 如何在JSP页面中使用JSTL标签实现if-else判断
- 如何通过反射来代替N多的if...else
- If Else 优化之道
- 一个优化if-else的例子
- switch...case 和 if...else效率比较和优化
- 如何通过反射来代替N多的if...else