一. 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();

if else 深度优化的更多相关文章

  1. ASP.NET WebApi 文档Swagger深度优化

    本文版权归博客园和作者吴双本人共同所有,转载和爬虫请注明博客园蜗牛原文地址,cnblogs.com/tdws   写在前面 请原谅我这个标题党,写到了第100篇随笔,说是深度优化,其实也并没有什么深度 ...

  2. MySQL内核深度优化

    版权声明:本文由简怀兵原创文章,转载请注明出处: 文章原文链接:https://www.qcloud.com/community/article/179 来源:腾云阁 https://www.qclo ...

  3. 深度优化LNMP之Nginx [2]

    深度优化LNMP之Nginx [2]   配置Nginx gzip 压缩实现性能优化 1.Nginx gzip压缩功能介绍        Nginx gzuo压缩模块提供了压缩文件内容的功能,用户请求 ...

  4. 深度优化LNMP之Nginx (转)

    深度优化LNMP之Nginx Nginx基本安全优化 1.调整参数隐藏Nginx版本号信息     一般来说,软件的漏洞都和版本有关,因此我们应尽量隐藏或清除Web服务队访问的用户显示各类敏感信息(例 ...

  5. 深度优化LNMP之PHP (转)

    深度优化LNMP之PHP   PHP缓存加速介绍   1.操作码介绍及缓存原理     当客户端请求一个php程序时,服务器的PHP引擎会解析该PHP程序,并将其编译为特定的操作码文件(Operate ...

  6. 腾讯云数据库团队:浅谈如何对MySQL内核进行深度优化

    作者介绍:简怀兵,腾讯云数据库团队高级工程师,负责腾讯云CDB内核及基础设施建设:先后供职于Thomson Reuters和YY等公司,PTimeDB作者,曾获一项发明专利:从事MySQL内核开发工作 ...

  7. 百度APP移动端网络深度优化实践分享(二):网络连接优化篇

    本文由百度技术团队“蔡锐”原创发表于“百度App技术”公众号,原题为<百度App网络深度优化系列<二>连接优化>,感谢原作者的无私分享. 一.前言 在<百度APP移动端网 ...

  8. 百度APP移动端网络深度优化实践分享(一):DNS优化篇

    本文由百度技术团队“蔡锐”原创发表于“百度App技术”公众号,原题为<百度App网络深度优化系列<一>DNS优化>,感谢原作者的无私分享. 一.前言 网络优化是客户端几大技术方 ...

  9. 举个栗子看如何做MySQL 内核深度优化

    本文由云+社区发表 作者介绍:简怀兵,腾讯云数据库高级工程师,负责腾讯云CDB内核及基础设施建设:先后供职于Thomson Reuters和YY等公司,PTimeDB作者,曾获一项发明专利:从事MyS ...

  10. [sql]大型网站MySQL深度优化揭秘

    大型网站MySQL深度优化揭秘 第1章优化的思路和线路 1.1 网站优化的思路    2 1.2 MySQL优化,nginx这样的东西怎么优化? 第2章硬件层面优化 2.1 数据库物理机 2.1.1 ...

随机推荐

  1. 哈工大计算机网络Week2-网络应用数据交换

    目录 网络应用数据交换 P2P应用:原理与文件分发 纯P2P架构 文件分发:客户机/服务器 vs. P2P CS 为什么是这样的?不应该传送和发出难道是并行的??? P2P P2P文件分发典型例子:B ...

  2. Bzoj 3165 [Heoi2013]Segment题解

    3165: [Heoi2013]Segment Time Limit: 40 Sec  Memory Limit: 256 MBSubmit: 668  Solved: 276[Submit][Sta ...

  3. WordPress教程之页面、菜单、媒体库、高级定制

    本系列教程链接: 怎么快速搭建一个WordPress网站 Wordpress教程之初识WordPress Wordpress教程之如何入门WordPress Wordpress教程之如何创建博客内容 ...

  4. 从0系统学Android-2.3使用 Intent 在 Activity 之间穿梭

    2.3 使用 Intent 在 Activity 之间穿梭 在上一节中我们已经学会了如何创建一个 Activity 了.对于一个应用程序来说,肯定不可能只有一个 Activity.下面就来学习多个 A ...

  5. Cocos2d-x 3.x 学习笔记(6):Sprite SpriteFrameCache Texture2D TextureCache

    1. 概述 TextureCache是对Texture2D纹理的缓存,SpriteFrameCache是对SpriteFrame的缓存,每个SpriteFrame是对Texture2D的封装,Spri ...

  6. 【css系列】六种实现元素水平居中方法

    一.前言 居中效果在CSS中很是普通的效果,平时大家所看到的居中效果主要分为三大类:水平居中.垂直居中和水平垂直居中.而其中水平居中相对于后两者来说要简单得多.使用了css3的flexbox的属性轻松 ...

  7. Supalle-Admin-Layout,一个PC端和手机端都合适用的后台页面模板

    Supalle-Admin-Layout主要使用有Vue.Element-UI.layui-icon,Ajax实现采用Fetch(是有这个打算,不过目前是jQuery.). 源码地址:https:// ...

  8. golang 时间转换的问题

    一般在获取到时间字符串,需要将时间字符串格式化为golang的"time.Time"对象的时候,通常有2个函数,分别是. time.Parse(layout, value stri ...

  9. F#周报2019年第30期

    新闻 Fantomas 3.0 宣告.NET Core 3.0预览版7 .NET Core 3.0预览版7中ASP.NET Core与Blazor的升级 Visual Studio 2019版本16. ...

  10. JAVA从零学习 第一天 邮箱ych1102@163.com QQ382993199

    学习编程  听说读写 寻寻渐进   要准备好长期蒙蒙的状态  延迟3个月后明白 机器语言 二级制 1010  1100 0011 汇编语言 助记词表达程序   机器如果执行就需要编译  汇编语言移植性 ...