阿里JAVA开发手册零度的思考理解(一)

转载请注明原创出处,谢谢!

缘由

阿里JAVA开发手册已经发表有很长时间了,值得认真研究思考推广

  • 阿里官方的Java代码规范标准,这份开发手册不仅规范了一些开发细节,也提出了很多工程开发的哲学,值得好好阅读。
  • 可谓包罗万象,几乎日常Java开发中方方面面都有所涉及。
  • 每一条都是前人踩过的坑,通过血的教训总结出来的。
  • 能公布出来真是造福全部Java开发者。
  • 开发手册详细列举如何开发更加高效,更加容错,更加有协作性,力求知其然,更知其不然,结合正反例,提高代码质量。比如,异常日志处理时的各种不规范行为;集合转换的各种坑;创建线程池出现的等待队列OOM等。

的确阿里JAVA开发手册值得我们好好阅读和思考,每一条都是前人踩过的坑,通过血的教训总结出来的。所以今天就其中一点自己的思考理解进行分享。

看完这条,个人觉得主要是圈复杂度,由于代码是人写的,并且需要人来进行维护,如果足够的复杂的话,那么编写出现错误的可能性都很大,并且维护理解起来难度也非常高,以及后期如果需要扩展本来就很复杂再加一个很简单的功能都变得很困难(相信大家一定都有这样的经历)。

圈复杂度

圈复杂度(Cyclomatic complexity)是一种代码复杂度的衡量标准。
在软件测试的概念里,圈复杂度用来衡量一个模块判定结构的复杂程度,数量上表现为独立线性路径条数,即合理的预防错误所需测试的最少路径条数。圈复杂度大说明程序代码可能质量低且难于测试和维护,根据经验,程序的可能错误和高的圈复杂度有着很大关系。

看看上面阿里JAVA开发手册里面提到的,如果非得使用if()...else if()...else...方式表达逻辑,【强制】避免后续代码维护困难,请匆超过3层。如果超过3层的if-else的逻辑判断代码可以使用卫语句、策略模式、状态模式等来实现。

其实在我看来,使用卫语句、策略模式、状态模式就是来降低圈复杂度,让代码更加简单,这样不管是编写代码人员以及维护人员都可以非常方便了解到本质意思。

虽然阿里JAVA开发手册提到的是if()...else if()...else...方式表达逻辑,延伸下,关于多次嵌套循环等道理也一样,需要考虑优化的。

思路分析

如上图,其实看起来就是一颗树结构,相对来说其实比较复杂了,优化的思路其实就是把树结构变成顺序结构即可,那样条理就清晰了,总体思路是这样的,下面看看使用卫语句、策略模式、状态模式怎么达到的。

卫语句

卫语句?卫语句就是把复杂的条件表达式拆分成多个条件表达式,比如一个很复杂的表达式,嵌套了好几层的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了)

状态模式

概述:当一个对象的内在状态改变时允许改变其行为,这个对象看起来像是改变了其类。主要解决的是对象的行为依赖于它的状态(属性),并且可以根据它的状态改变而改变它的相关行为。

  1. 封装了转换规则。
  2. 枚举可能的状态,在枚举状态之前需要确定状态种类。
  3. 将所有与某个状态有关的行为放到一个类中,并且可以方便地增加新的状态,只需要改变对象状态即可改变对象的行为。
  4. 允许状态转换逻辑与状态对象合成一体,而不是某一个巨大的条件语句块。
  5. 可以让多个环境对象共享一个状态对象,从而减少系统中对象的个数。

由于状态模式是封装了转换规则,所以一般树的深度最少需要2层以及上,个人理解的感觉就是一个流程了,比如*水低于0度是冰的状态--> 大于0度又变成液态--> 100度又变成沸腾的状态

状态模式与策略模式很像,策略模式是外驱动,而状态模式是内驱动。本质也是把判断树里面只取其中一条叶子的路径。

状态模式有一个明显的缺点:状态模式对"开闭原则"的支持并不太好,对于可以切换状态的状态模式,增加新的状态类需要修改那些负责状态转换的源代码,否则无法切换到新增状态,而且修改某个状态类的行为也需修改对应类的源代码。

程序员笑话

老婆给当程序员的老公打电话:下班顺路买十个包子,如果看到卖西瓜的,买一个。当晚老公手捧一个包子进了家门…老婆怒道:你怎么只买一个包子?!老公甚恐,喃喃道:因为我真看到卖西瓜的了。”

如果使用策略模式就简单了,2条信息,1:买十个包子。2:买一个西瓜,没有就算了。
虽然是个笑话,但是顺序的就是比判断的要简单。

总结

  • 圈复杂度概念
  • 卫语句
  • 策略模式
  • 状态模式

汇总:本质就是把较深的判断树,使用的时候,就是把判断树结构变成顺序结构即可,就是给出每个叶子的路径而不需要看起来是一颗复杂的树结构。

思考

这是阿里JAVA开发手册其中一条明细,为什么呢,结果是啥,怎么出乎意料啦??期待你的留言和分析!!!



上面的一些分析都是个人自己的理解和思考,如果发现有不对的希望留言指出,谢谢!!!
如果读完觉得有收获的话,欢迎点赞加关注。



查阅更多历史,欢迎关注个人公众号!!!

时间: 2025-01-19 20:38:48

阿里JAVA开发手册零度的思考理解(一)的相关文章

110期:阿里Java开发手册发布,年度精选资料限时免费下载

本期头条   AliSQL开源Sequence Engine:单调递增的唯一值,是在持久化数据库系统中常见的需求,无论是单节点中的业务主键,还是分布式系统中的全局唯一值,亦或是多系统中的幂等控制,并通过引擎的设计方法,尽可能的兼容其他数据库的使用方法,简化获取序列值复杂度.点我查看,让情人节更有范 •[Java编码规范]<阿里巴巴Java开发手册(正式版)>发布! • 开年大礼!阿里珍贵技术资料限时免费下载 •[在线峰会]2017红包背后的技术秘密 • 视频技术大讲堂开讲啦:赶快报名!   技

【Java编码规范】《阿里巴巴Java开发手册》终极版更新,在线代码检测及IDE插件发布

        -------------- 2017.10.14更新 -------------- <阿里巴巴Java开发手册(终极版)>正式发布,这是史上内容最全.修正最为彻底的一个版本,并且增加了单元测试规约内容,这也是阿里官方对外发布的最后一个PDF版本,值得收藏.   <阿里巴巴Java开发手册>是阿里内部Java工程师所遵循的开发规范,涵盖编程规约.单元测试规约.异常日志规约.MySQL规约.工程规约.安全规约等,这是近万名阿里Java技术精英的经验总结,并经历了多次大

阿里正式发布《Java开发手册》终极版!

本文讲的是阿里正式发布<Java开发手册>终极版!,别人都说我们是码农,但我们知道,自己是个艺术家.也许我们不过多在意自己的外表和穿着,但我们不羁的外表下,骨子里追求着代码的美.质量的美.而代码规约其实就是一个对美的定义. <阿里巴巴Java开发手册>系统性地从编程.数据库.异常日志.工程结构.安全.单元测试六大方面,总结出优秀Java开发者必备的技术素养.时值手册发布一周年之际,阿里官方对外正式公开<阿里巴巴Java开发手册>终!极!版!!! 该版本将是阿里官方对外释

千呼万唤始出来—阿里正式发布《Java开发手册》终极版!

摘要: 本文讲的是阿里正式发布<Java开发手册>终极版!,别人都说我们是码农,但我们知道,自己是个艺术家.也许我们不过多在意自己的外表和穿着,但我们不羁的外表下,骨子里追求着代码的美.质量的美.而代码规约其实就是一个对美的定义. 经过阿里开发工程师的不断完善,改进.<JAVA开发手册>终极版终于发布了! 前言 <阿里巴巴Java开发手册>是阿里巴巴集团技术团队的集体智慧结晶和经验总结,经历了多次大规模一线实战的检验及不断的完善,系统化地整理成册,反馈给广大开发者.现代

白话阿里巴巴Java开发手册(编程规约)

最近,阿里巴巴发布了<阿里巴巴Java开发手册>,总结了阿里人多年一线实战中积累的研发流程规范,这些流程规范在一定程度上能够保证最终的项目交付质量,通过限制开发人员的编程风格.实现方式来避免研发人员在实践中容易犯的错误,同样的问题大家使用同样的模式解决,便于后期维护和扩展,确保最终在大规模协作的项目中达成既定目标. 无独有偶,笔者去年在公司里负责升级和制定研发流程.设计模板.设计标准.代码标准等规范,并在实际工作中进行了应用和推广,收效颇丰,也总结了适合支付平台的技术规范,由于阿里巴巴Java

阿里巴巴Java开发手册快速学习

Java作为一门名副其实的工业级语言,语法友好,学习简单,大规模的应用给代码质量的管控带来了困难,特别是团队开发中,开发过程中的规范会直接影响最终项目的稳定性. 善医者"未有形而除之",提高工程健壮性最好的方式是在代码出现问题之前就排除掉,不给Bug出现的机会.一份好的开发规范就可以起到这样的作用,大大减少产品上线后的问题.  <阿里巴巴Java开发手册>是阿里巴巴的内部编码规范,阿里官方的Java代码规范标准, 手册以Java应用开发为维度,分为编程规约.异常日志规约.M

阿里巴巴 Java 开发手册之编程规约(一)-------我的经验

阿里巴巴 Java 开发手册 一.编程规约 (一) 命名规约 1.[强制] 代码中的命名均不能以下划线或美元符号开始,也不能以下划线或美元符号结束.(代码规范,易读) 反例: name / __name / $Object / name / name$ / Object$ 2.[强制] 代码中的命名严禁使用拼音与英文混合的方式,更不允许直接使用中文的方式. 说明:正确的英文拼写和语法可以让阅读者易于理解,避免歧义.注意,即使纯拼音命名方式 也要避免采用.(代码规范,易读) 反例: DaZhePr

【资料】翘首期盼247天!《阿里巴巴Java开发手册》扫描插件详情介绍

引言:自从2月9日<阿里巴巴Java开发手册>面向业界公布以来,大家一直期待着静态化扫描工具的问世,在<手册>终极版发布时,我们曾经承诺将在2017杭州云栖大会上进行规约插件的全球发布.如今信守承诺,我们如约而至.   经过247天的研发,阿里巴巴于10月14日上午9:00在杭州云栖大会<研发效能峰会>上,正式发布<阿里巴巴Java开发手册>扫描插件.阿里巴巴高年级同学毕玄.玄难.索尼.叶渡,淘宝代码第一人多隆.代码规约作者孤尽携手<手册>项目组

阿里巴巴 JAVA 开发手册

阿里巴巴 JAVA 开发手册 1.0.0 阿里巴巴集团技术部 2016.12.7 首次向 Java 业界公开 一. 编程规约(一) 命名规约1. [强制]所有编程相关命名均不能以下划线或美元符号开始,也不能以下划线或美元符号结束.反例: _name / __name / $Object / name_ / name$ / Object$2. [强制]所有编程相关的命名严禁使用拼音与英文混合的方式,更不允许直接使用中文的方式.说明: 正确的英文拼写和语法可以让阅读者易于理解,避免歧义.注意, 即使