为什么阿里的程序员那么帅?---原来他们都有"编码规约扫描"神器在手
为了迎接十九大的到来,帝都城这几天也是满城风雨,听说早高峰期地铁站的人都排到天桥上了,哎,这就是该死的北漂生活。但是无论怎样,我依然在北京向各位问好!
之前总结过俩篇关于阿里Java开发手册的编程规约(http://www.cnblogs.com/1315925303zxz/p/6934575.html、http://www.cnblogs.com/1315925303zxz/p/6899728.html)的博客,我想说那近乎纸上谈兵,很多自律性比较差的同志坚持几天就又回归原点了,又是每天在SVN上自由发挥着自己狠个性的代码风格。不过没关系今天我督促你一把,我一直是一个对代码有洁癖的程序员,所以就比较喜欢这类东西的出现,也比较喜欢和各位总结分享,说不定哪天我去你们公司碰上你写的代码,恰好是我分享的编码规约,那岂不皆大欢喜。
好了,不是废话的也说了这么多,想必大家都知道公元2017-10-15,阿里首发了Java开发规约插件,当时我在地铁上看的那叫一个兴奋,由于昨天有点忙,所以今天抽空给各位分享一下该插件的安装和使用,以及我们需要修行的代码风格。
阿里代码规约插件的安装:
官方推荐IDEA使用编码规约插件jdk至少是1.7+,eclipse使用编码规约插件jdk至少是1.8+。但是本人使用的是Spring Tool Suite开发工具(spring的一个开发插件),jdk是1.7的,但是今天安装后能够正常使用,具体原因我也没有详细去查,但是结果是好的,再说一次能够正常使用。
打开eclipse或者Spring Tool Suite工具,通过 Help 菜单>>选择 Install New Software,然后输入https://p3c.alibaba.com/plugin/eclipse/update 即可看到安装列表,然后安装即可,如果在安装过程中如果出现警告信息则可不比关心,跳过即可。
阿里代码规约插件的使用:
如果你已经在你的开发工具中安装了阿里代码规约插件,你可以在某个类或者某个包上鼠标右键,就会看到【阿里编码规约扫描】神器了,抓紧试试,看看自己写的代码是有多丑。
阿里编码规约扫描的结果总结:
通过阿里代码规约插件的几通扫描,丑陋的代码原形毕露,我可是费了老半天才帮它们化好妆的。首先普及各位三个单词:blocker(雏形锻模,预锻模)、Critical(关键的; 批评的,爱挑剔的; 严重的; 极重要的)、Major(主要的; 重要的; 大调的)。这三个单词代表代码规约插件扫描出来的三类不规范的信息列表,具体的信息你自己去体验一把就知道了。
当你右键执行>>阿里编码规约扫描时,就会在开发工具的通知栏中出现以下俩个选项卡P3C Results和Rule Detail,前者代表扫描出的不规范的错误列表,后者代表各个列表项不规范的详细情况,最主要的是举例教你如何改正,我喜欢。
就我今天扫描出的不规范代码,有几点是值得注意的,特此记录一下:
1、Object的equals方法容易抛空指针异常,应使用常量或确定有值的对象来调用equals。
我的代码风格:
if (ip.equals("127.0.0.1") || ip.equals("0:0:0:0:0:0:0:1")) {
插件代码风格:
if ("127.0.0.1".equals(ip) || "0:0:0:0:0:0:0:1".equals(ip)) {
2、不允许任何魔法值(即未经定义的常量)直接出现在代码中。
我的代码风格:
if (currentMonth >= 1 && currentMonth <= 3) {
插件代码风格:
String KEY_PRE = "Id#taobao_1";
if(key.equals(KEY_PRE)){
//...
}
3、方法内部单行注释,在被注释语句上方另起一行,使用//注释。方法内部多行注释使用/* */注释。注意与代码对齐。 【注释这块我个人是非常重视的】
4、类、类属性、类方法的注释必须使用javadoc规范,使用/**内容*/格式,不得使用//xxx方式和/*xxx*/方式。说明:在IDE编辑窗口中,javadoc方式会提示相关注释,生成javadoc可以正确输出相应注释;在IDE中,工程调用方法时,不进入方法即可悬浮提示方法、参数、返回值的意义,提高阅读效率。
5、循环体内,字符串的联接方式,使用StringBuilder的append方法进行扩展。说明:反编译出的字节码文件显示每次循环都会new出一个StringBuilder对象,然后进行append操作,最后通过toString方法返回String对象,造成内存资源浪费。
反例:
String result;
for (String string : tagNameList) {
result = result + string;
}
正例:
StringBuilder stringBuilder = new StringBuilder();
for (String string : tagNameList) {
stringBuilder.append(string);
}
String result = stringBuilder.toString();
6、集合初始化时,指定集合初始值大小。HashMap使用如下构造方法进行初始化,如果暂时无法确定集合大小,那么指定默认值(16)即可。这块我个人的代码扫出了一大堆,以后真得防范了。
到这儿可能就会有人站出来反对,功能实现了比啥都重要,至于浪费精力去关注代码的规范性嘛,那么我想送朋友一句话:谁会愿意通过一张邋遢的外表去发现内心一颗高尚的心。日常开发中也是一样,如果你写的代码再优再牛逼,你试试将一个项目中所有代码搞得长一行短一行格式乱七八糟,甚至连最基本的类、接口注释都不写,谁会愿意去发现你是一位牛逼的程序员。
最后给那些插件开发的伙伴们付出的247个日夜点个赞,他们的确很棒,愿他们在以后的开发路上激情永在,薪水倍升!