转载请注明原创出处,谢谢!java
阿里JAVA开发手册已经发表有很长时间了,值得认真研究思考推广程序员
- 阿里官方的Java代码规范标准,这份开发手册不只规范了一些开发细节,也提出了不少工程开发的哲学,值得好好阅读。
- 可谓一应俱全,几乎平常Java开发中方方面面都有所涉及。
- 每一条都是前人踩过的坑,经过血的教训总结出来的。
- 能公布出来真是造福所有Java开发者。
- 开发手册详细列举如何开发更加高效,更加容错,更加有协做性,力求知其然,更知其否则,结合正反例,提升代码质量。好比,异常日志处理时的各类不规范行为;集合转换的各类坑;建立线程池出现的等待队列OOM等。
的确阿里JAVA开发手册值得咱们好好阅读和思考,每一条都是前人踩过的坑,经过血的教训总结出来的。因此今天就其中一点本身的思考理解进行分享。算法
看完这条,我的以为主要是圈复杂度,因为代码是人写的,而且须要人来进行维护,若是足够的复杂的话,那么编写出现错误的可能性都很大,而且维护理解起来难度也很是高,以及后期若是须要扩展原本就很复杂再加一个很简单的功能都变得很困难(相信你们必定都有这样的经历)。markdown
圈复杂度(Cyclomatic complexity)是一种代码复杂度的衡量标准。
在软件测试的概念里,圈复杂度用来衡量一个模块断定结构的复杂程度,数量上表现为独立线性路径条数,即合理的预防错误所需测试的最少路径条数。圈复杂度大说明程序代码可能质量低且难于测试和维护,根据经验,程序的可能错误和高的圈复杂度有着很大关系。ide
看看上面阿里JAVA开发手册里面提到的,若是非得使用if()...else if()...else...方式表达逻辑,【强制】避免后续代码维护困难,请匆超过3层。若是超过3层的if-else的逻辑判断代码可使用卫语句、策略模式、状态模式等来实现。测试
其实在我看来,使用卫语句、策略模式、状态模式就是来下降圈复杂度,让代码更加简单,这样不论是编写代码人员以及维护人员均可以很是方便了解到本质意思。优化
虽然阿里JAVA开发手册提到的是if()...else if()...else...方式表达逻辑,延伸下,关于屡次嵌套循环等道理也同样,须要考虑优化的。ui
如上图,其实看起来就是一颗树结构,相对来讲其实比较复杂了,优化的思路其实就是把树结构变成顺序结构便可,那样条理就清晰了,整体思路是这样的,下面看看使用卫语句、策略模式、状态模式怎么达到的。spa
卫语句?卫语句就是把复杂的条件表达式拆分红多个条件表达式,好比一个很复杂的表达式,嵌套了好几层的if - then-else语句,转换为多个if语句,实现它的逻辑,这多条的if语句就是卫语句。线程
其中卫语句示例以下:
public void today() { if (isBusy()) { System.out.println("change time."); return; } if (isFree()) { System.out.println("go to travel."); return; } System.out.println("stay at home to learn Alibaba Java Coding Guidelines."); return; }复制代码
其实这个比较简单,每个if对应叶子节点的一条路径(每一个if基本就return了)。
概述:使用这个模式来将一组算法封装成一系列对象。经过传递这些对象能够灵活的改变程序的功能。
策略模式比较有名的就是诸葛亮的三个锦囊妙计提及,如图:
诸葛亮为何要这么麻烦,作三个锦囊?他彻底能够只作一个锦囊,将这三个妙计都写在它上面。可他没有这么作,而是正确的运用了策略模式作了三个锦囊。这样作的好处十分明显:诸葛亮一个锦囊写一个妙计,他的思路十分清晰,不会三个计策相互混乱。而赵云看妙计的时候也十分方便,何时看哪一个妙计,使用十分方便,若是三个妙计混在一块儿,他就没这么方便了。
在JDK中java.util.Comparator#compare()就是使用的策略模式,好比咱们常常对商品进行排序,条件有不少啊,按照商品浏览量、价格、更新时间、【价格、时间】、【浏览量、更新时间】(进行升序、降序操做)其实这个也是上面那颗树,须要作的就是每次取其中一条叶子节点。不少时候这些判断都是写在一个公用的方法里面,进行大量的判断以后写排序,而JDK怎么作的呢?把变化的比较判断拿出来,其实判断树中每一个叶子结点就是一种策略,想象咱们平时怎么作的呢? 都是把Comparator#compare()写好(可能有不少实现Comparator接口的排序算法)每次咱们调用的时候选择其中一种便可。
与卫语句不一样的是,卫语句把每个if对应叶子节点的一条路径。而策略模式是因此叶子都在实现Comparator接口了,具体开始用那个是调用的直接用(因此不会像卫语句那样看见不少if了)
概述:当一个对象的内在状态改变时容许改变其行为,这个对象看起来像是改变了其类。主要解决的是对象的行为依赖于它的状态(属性),而且能够根据它的状态改变而改变它的相关行为。
因为状态模式是封装了转换规则,因此通常树的深度最少须要2层以及上,我的理解的感受就是一个流程了,好比*水低于0度是冰的状态--> 大于0度又变成液态--> 100度又变成沸腾的状态
状态模式与策略模式很像,策略模式是外驱动,而状态模式是内驱动。本质也是把判断树里面只取其中一条叶子的路径。
状态模式有一个明显的缺点:状态模式对"开闭原则"的支持并不太好,对于能够切换状态的状态模式,增长新的状态类须要修改那些负责状态转换的源代码,不然没法切换到新增状态,并且修改某个状态类的行为也需修改对应类的源代码。
老婆给当程序员的老公打电话:下班顺路买十个包子,若是看到卖西瓜的,买一个。当晚老公手捧一个包子进了家门…老婆怒道:你怎么只买一个包子?!老公甚恐,喃喃道:由于我真看到卖西瓜的了。”
若是使用策略模式就简单了,2条信息,1:买十个包子。2:买一个西瓜,没有就算了。
虽然是个笑话,可是顺序的就是比判断的要简单。
汇总:本质就是把较深的判断树,使用的时候,就是把判断树结构变成顺序结构便可,就是给出每一个叶子的路径而不须要看起来是一颗复杂的树结构。
这是阿里JAVA开发手册其中一条明细,为何呢,结果是啥,怎么出乎意料啦??期待你的留言和分析!!!
上面的一些分析都是我的本身的理解和思考,若是发现有不对的但愿留言指出,谢谢!!!
若是读完以为有收获的话,欢迎点赞加关注。
查阅历史文章,欢迎关注我的公众号!!!