本文带大家简单理解阿里巴巴Java开发手册中的规约内容以及P3C项目,可以帮助开发者扫描出所有潜在的代码隐患。在中间也聊了一些对于不同语言设计的理解,如何去看待语言的设计,其实是我们去学习一个语言的核心。
演讲嘉宾简介:
澳明,阿里巴巴高级开发工程师。
以下内容根据演讲嘉宾视频分享以及PPT整理而成。
本次的分享主要围绕以下三个方面:
一、手册简介
二、聊聊语言
三、P3C项目
一、手册简介
下面主要从三个方面介绍阿里巴巴为什么需要这个Java开发手册。第一个方面,其实是协作效率的问题。众所周知,秦朝统一时期,推出了“车同轨,书同文”的法令,事实上,这个法令背后的目的是让整个国家人民做事的方式进行统一。那么在现在,比如对于一个公司而言,一些规范的不一致可能会导致很多问题,不仅仅是个人与个人之间,甚至让部门与部门之间会出现不必要的沟通损耗和沟通壁垒。
第二个方面其实是在系统质量方面。在阿里巴巴,这种不规范编码导致的线上故障非常非常多,在整个线上故障的比率也非常高。所以,阿里巴巴希望能够统一整个集团的编码规范,进而能够提升整体的系统质量。
第三个方面,工匠精神。阿里巴巴希望工程师们具备一个工匠精神。即希望工程师非常非常认真的对待编码过程及编码产物。因为无论怎么样设计Java开发手册,它所包含的条目始终是有限的,是一个死的东西,更多的希望大家能够体会的是Java开发手册背后的思想,因为背后的思想其实是可以举一反三,灵活运用的。阿里巴巴希望工程师们可以具备这样一种工匠精神,能够不断的认真打磨好自己的代码。
![7f08302bcf2087324e6c54c87633b70ba281c1e8](https://i-blog.csdnimg.cn/blog_migrate/5ce1a229660a9e7dc6056eac26fce842.png)
目前,Java开发手册分为七大部分,下图中的七大部分在日常的开发中是非常通用的。大家可以依据这七条规约,逐步逐步的从第一条规约低阶往高阶去进展。与大家平时开发项目一样,比如说,在最开始编码时,可以参考编程规约;然后我们在编程过程中,考虑异常场景时,那么可以考虑异常日志规约;在写单元测试时,可以参考单元测试规约;比如说,在整体的架构设计完毕并且代码开发完毕之后,对于其非功能性需求,比如安全方面的问题,可以参考安全规约;那么在与数据库进行交互时,可以参考MySQL数据库规约;有的时候,在整个一个大的公司内部,希望大家的工程结果能够统一,这样的话大家在阅读别人的代码,或者说复用别人的代码的时候会非常的直观和方便,这时候可以参考工程规约;最后一个设计规约,指在设计软件,设计程序和设计架构时可以参照一些规约。
![9ea65369d5edf5537e75e1022901ecd65cf2a6f0](https://i-blog.csdnimg.cn/blog_migrate/314e089649c9352b32f29cf2c9d33379.png)
尽管我们的Java开发手册页数不是很多,之所以称之为手册,是希望大家方便阅读,可以当做枕边书,业余时间翻一翻。手册中除了一些制定的规约内容,还提到了很多工程师会遇到的问题场景。这些问题场景中有一部分也结合了阿里巴巴近年来的真实案例,目的是让大家能够更好的理解规约,更重要的是理解规约背后的所体现的思想。这本Java开发手册虽然不厚,但是相信对于刚入门学习Java的同学,可以尝试阅读并体会,肯定会对大家有所帮助,并在编程规范的形成上有很大提高。
二、聊聊语言
1.面向对象语言与面向过程语言的区别
大家应该知道Java是面向对象的语言,也叫做OOP。那么面向对象语言和面向过程的语言有什么区别呢?在实现某个动作时,无论是使用面向对象语言或者面向过程的语言都可以实现,那么为什么说面向过程比较直观,比较方便呢?下面来简单举例说明。首先确定需求,比如说想开一个门,在面向过程的程序设计里,很有可能是一个Open行为或者叫Open函数的一个动作的实现,然后Open依赖的数据结构是Door对象,那么这个开门的动作就非常简单,直接Open the door。在面向对象的程序中,直接将对象Door设计出来,然后在赋予对象一些行为,如Open。
Open the door,这是面向过程的代码,可以认为Door其实是一个数据结构,我们可以很方便的再添加面向过程的代码,如添加新函数,比如Close the door。那么在面向对象的代码中,更多的是在不同的数据结构中,实现Open这一功能。简而言之,面向对象的语言更希望把操作的行为附加在不同的抽象类之上。
下图中摘抄了我们的一本书,《代码整洁之道》中的一段话“面向过程的代码便于在不改动既有数据结构的前提下添加函数,面向对象代码便于不改动既有函数的前提下添加类。反之,过程式代码难以添加新数据结构,面向对象代码难以添加新函数,因为必须修改所有类。对于面向对象比较南的事情,对于面向过程的代码比较容易,反之亦然。”
![6c1826f86c2ce32b4ce52a11d7d5a822bd7eaed8](https://i-blog.csdnimg.cn/blog_migrate/ab7c77c72ec9e0263f23294fbdb9cdde.png)
2.异常行为
我们相信大多数开发者都可以写出能够正常运行的代码,这是大家非常非常擅长做的事情。但是并不是所有的开发者都能够把异常处理的非常非常好。因为大家喜欢写按既定的流程能够正确执行的程序,但往往忽略了很多异常的情况。下面带大家从Java语言方面尝试理解一下它是如何对于异常行为进行抽象和设计的。举个简单例子,从旅游坐飞机说起,正常的流程应该是坐飞机起飞,那么想象一下中途有哪些异常场景出现。第一种情况,机场被恐怖份子袭击发生爆炸,虽然机率非常低,但也有可能发生。这种情况相当于发生非常严重的错误,对应在平时开发过程中,其实是系统级别的异常,比如磁盘坏掉,机器宕掉,网络断掉。第二种,假设机场是OK的,但是在去机场的路上,突然之间道路出现拥堵的情况,本来30分钟的路程,额外增加了1个小时的时间,所以必须换成其他交通工具赶到机场。这种相当于编程时异常,这类异常是可以有一些补救的措施的,如刚刚的场景中换成其他交通工具,从而继续让程序表现出我们理想的行为。系统异常与之不同的是,系统异常场景中开发者是没有补救方法的,几乎是无能为力的。第三种情况,假设顺利到达机场,但是护照被拒签无法登机,与上面几种异常不同的是,这种护照被拒签是可以被预测到的,大家都知道是有这种可能的,这种异常场景叫做预检时场景。最后一种,在登机口准备登机时扫描器发生故障,虽然这种异常也算作突发异常,但是是可以登机的。因为这种异常最终会以一种信息方式让机场的维修师会来解决,或者换另一个登机口登机,这类异常叫做可透出异常。
在Java中出现的异常其实可以对上上面的四种异常。首先,第一层级会被抽象为错误和异常,然后异常分为检查异常和未检查异常。大家如果把Java中的异常跟图中的异常进行结合,相信大家会有一些新的输入和理解。
![593b3d552599cf7dbf64222ab9aaa7a44c205fcb](https://i-blog.csdnimg.cn/blog_migrate/1883cb29c19ef43c3b46f646f37be7d8.png)
三、P3C项目
大家可能会困惑P3C到底是什么?实际上,P-3C是世界知名反潜机,它有美国克洛希德公司在民用客机的基础上改进而来,绰号“猎户”。“猎户”诞生至今已经40多年了,尽管是一员老将,但在海湾战争中,它还是披挂上阵,为多国部队提供了大量情报。因为它是非常经典的反潜机,所以阿里巴巴也以它作为项目的代号,其中的寓意是以Java开发手册为前提扫描出所有潜在的代码隐患。那么阿里巴巴为何要成立这个项目?主要原因是因为如果单纯地制定了Java开发手册里面的一些规范,它其实是类似于意识形态上的东西,飘在空中,通过口头传达这些规范很难落地,仍然无法保证在开发过程中,不会再犯此类错误。所以在阿里巴巴内部,当时成立了P3C项目组,希望依托于Java开发手册,能够把内容,以及平时的扫描,还有IDE进行一些集成的工作,从而让我们的开发人员能够保证遵循我们的Java开发手册进行工作。
下图中给出了P3C项目地址,放在了Github上。其中主要包含三个部分,第一部分是就是开发手册的扫描问题的实现,是基于PMD实现的。第二部分是IntelliJ IDEA plugin,是一个Java IDE的插件。第三部分是Eclipse的插件。插件的部分会实时的在开发过程中,扫描出的代码中不满足Java开发手册内容的一些代码。
P3C项目目前非常火爆,在刚刚宣布了开源之后,整个社区活跃度是非常之高的。推荐大家也访问一下P3C项目,首先大家可以下载都自己的IDE中集成起来,这样会对大家平时编码的规范性有个很好的督促作用,另外这里也给出了Java开发手册的在线免费下载版本和淘宝购买地址。
![9e161495af0508647fa0d6fd581945bfd6bdf772](https://i-blog.csdnimg.cn/blog_migrate/6a54bf459b606522c00062d3a2130aa4.png)
本文由云栖志愿小组董黎明整理,编辑百见