一. if else表达式过于复杂

if ((condition1 && condition2 ) || ((condition2 || condition3) && condition4)) {
}

问题解决:分解条件表达式,分解成多个独立的函数,为分解的新函进行良好的命名,从而更清楚表达自己意图。

if (date.before(SUMMER_START) || date.after(SUMMER_END)) {

}

// 优化后
if (notSummer(date)) { }

二. if else 嵌套过深

public void workOrRest {
if (isWorkDay()) {
System.out.println("sad,is work day!!!");
} else {
if (isWorkTime()) {
System.out.println("shit,is work time!!!");
} else {
rest();
System.out.println("happy happy happy!!!");
}
}
}

解决办法:通过卫语句,有时候条件式可能出现在嵌套n次才能真正执行,其他分支只是简单报错返回的情况,对于这种情况,应该单独检查报错返回的分支,当条件为真时立即返回,这样的单独检查就是卫语句(guard clauses).卫语句可以把我们的视线从异常处理中解放出来,集中精力到正常处理的代码中。

public void workOrRest {
if (isWorkDay()) {
System.out.println("sad,is work day!!!");
return;
} if (isWorkTime()) {
System.out.println("shit,is work time!!!");
return;
} rest();
System.out.println("happy happy happy!!!");
}

三. if else过多

if (houseName.equals("Targaryen")) {
...
System.out.println("Blood and fire");
} else if (houseName.equals("Baratheon")) {
...
System.out.println("Ours is the Fury");
} else if (houseName.equals("Stark")) {
...
System.out.println("Winter is coming");
} else if (houseName.equals("Lannister")) {
...
System.out.println("Hear Me Roar");
} else if (houseName.equals("Arryn")) {
...
System.out.println("as High as Honor");
} else if (houseName.equals("Tyrell")) {
...
System.out.println("Growing Strong");
} else if (houseName.equals("Tully")) {
...
System.out.println("Family, Duty, Honor");
} else if (houseName.equals("Martell")) {
...
System.out.println("Unbent, Unbowed, Unbroken");
} else if (houseName.equals("Greyjoy")) {
...
System.out.println("We Do Not Sow");
} else {
...
System.out.println("world peace");
}

问题解决:利用策略or状态模式,消除业务判断,各之类分别关注自己的实现,大大降低了系统各部分之间的依赖。利用Map缓存分支状态信息。基本可以达到对修改封闭,对扩展开放。

<property name="thronesMap">
<map>
<entry key="Targaryen"><bean class="game.of.thrones.TargaryenStrategy"/></entry>
<entry key="Baratheon"><bean class="game.of.thrones.BaratheonStrategy"/></entry>
<entry key="Stark"><bean class="game.of.thrones.StarkStrategy"/></entry>
<entry key="Lannister"><bean class="game.of.thrones.LannisterStrategy"/></entry>
<entry key="Arryn"><bean class="game.of.thrones.ArrynStrategy"/></entry>
<entry key="Tyrell"><bean class="game.of.thrones.TyrellStrategy"/></entry>
<entry key="Tully"><bean class="game.of.thrones.TullyStrategy"/></entry>
<entry key="Martell"><bean class="game.of.thrones.MartellStrategy"/></entry>
<entry key="Greyjoy"><bean class="game.of.thrones.GreyjoyStrategy"/></entry>
<entry key="Default"><bean class="game.of.thrones.DefaultStrategy"/></entry>
</map>
</property> public interface GameOfThronesStrategyService {
/**
* 具体实现处理
*/
void mainTitle();
} thronesMap.get(houseName).mainTitle();

最新文章

  1. php读取大文件
  2. Source Insight 常用设置和快捷键大全
  3. mysql +ibatis
  4. git 和 github 关系?
  5. 求解最大正方形面积 — leetcode 221. Maximal Square
  6. 使用Eclipse自带Web Service插件(Axis1.4)生成Web Service服务端/客户端
  7. MySQL数据库能够用随意ip连接訪问的方法
  8. 关于Android的一些理解
  9. 《Programming WPF》翻译 第8章 4.关键帧动画
  10. HTML5 Storage API
  11. SQLite模糊查找(like)
  12. 关于java和c++中的i++
  13. 在阿里云上搭建 Spark 实验平台
  14. npm run dev 出错的解决办法
  15. java工作流引擎证照库类型的流程设计 实现方案与演示案例
  16. TF.VARIABLE、TF.GET_VARIABLE、TF.VARIABLE_SCOPE以及TF.NAME_SCOPE关系
  17. 数据类型 varchar 和 uniqueidentifier 在 add 运算符中不兼容
  18. Day2 列表,元组,字典,集合
  19. Python tuple
  20. HDU 4627 The Unsolvable Problem 杭电多校联赛第三场1009 数学题

热门文章

  1. Java项目案例之---开灯(面向对象复习)
  2. Char.Js 学习使用
  3. Bzoj 2733: [HNOI2012]永无乡 数组Splay+启发式合并
  4. C/C++指针函数和函数指针
  5. Kotlin学习快速入门(1)——基本数据类型以及String常用方法使用
  6. Java中返回值定义为int类型的 方法return 1返回的是int还是Integer&amp;&amp;finally中return问题
  7. Python中文本文件读写操作的编码问题
  8. 牛客第三场 J LRU management
  9. css清除select默认的样式
  10. Linux系统管理----磁盘管理与文件系统