ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

思考及总结一份关于适应当前公司的代码规约

2021-06-05 15:03:44  阅读:208  来源: 互联网

标签:正例 String 规约 代码 注释 思考 强制 方法


思考及总结一份关于适应当前公司的代码规约

xxxx公司代码规范文档,约定对象为开发部人员(Java开发工程师),开发人员须严格按照该文档相关约定进行开发,以提高代码质量与个人编码水平。

一、IDEA代码注释风格

1.1 类注释模板设置

IDEA --> Settings… --> Editor --> File and Code Templates --> Includes -->File Header

/**
*   Description: 
*   Author: ${USER}
*   Datetime: ${DATE}
*/

1.2 方法注释模板设置

IDEA --> Settings… --> Editor --> Live Templates --> 点击**+号 -->Template Group…(添加模板组)
添加了模板组后再次点击
+**号,这次选择Live Template(添加注释模板)

  1. Abbreviation: 该处填入***** **(注意*设置的模板名称为*,*此处一定要填写*,因为IDEA生成注释的默认方式是:/*+模板名+快捷键)
  2. Description:该处填入调用模板时的提示
  3. Template text内容(一定要以******开头):
**
 * 功能描述:
 * 创建时间: $date$
 $params$
 $return$
 * author: xxxxx
 */
  1. Edit variables:
    params Default value内容:
groovyScript("if(\"${_1}\".length() == 2) {return '';} else {def result=''; def params=\"${_1}\".replaceAll('[\\\\[|\\\\]|\\\\s]', '').split(',').toList();for(i = 0; i < params.size(); i++) {if(i==0){result+='* @param ' + params[i] + ': '}else{result+='\\n' + ' * @param ' + params[i] + ': '}}; return result;}", methodParameters());

return Default value内容:

groovyScript("def returnType = \"${_1}\"; def result = '* @return ' + returnType; return result;", methodReturnType());

author、date、time处变量分别点击,下拉后选择user(),date(),time()

  • name没有time,不用选择time()。

  1. Expand with处选择Tab键补全,默认也是按Tab键补全(设置为Enter键,类属性文档注释会有冲突)

  1. Change处选择Java

测试效果:

  • 方法上输入**/***后按Tab键自动补全
二、命名规则

2.1 包命名规则

  1. 若项目名称为:abc
  2. - javacom.xxxx.abc对应 前台目录:back/abc``
  3. +com.xxxx.abc.model数据库模型层
  4. +com.xxxx.abc.controller控制器层
  5. +com.xxxx.abc.repository持久化层
  6. +com.xxxx.abc.service服务接口层
  7. +com.xxxx.abc.service.impl服务实现类层

2.2 类名命名规则

  1. - controller 根据业务命名*Controller``
  2. - service 与contoller一一对应*Service实现类*ServiceImpl``
  3. - repository 与数据库模型 一一对应*Repository``

2.3 方法命名规则

功能 业务级(service,controller) 对象级(repository)
查询 query read
增加 add create
修改 edit update
删除 remove delete
计算 ccl count
初始化 init
保存 save
生成/创建 generate

2.4 Controller命名规范

默认情况下 创建好controller之后 继承于 xxxController 可不写任何控制规则 就可以 随意访问对应的页面,如下:
映射路径 abc/user 前台对应目录 back/abc/user/index.html
映射路径 abc/user/index 前台对应目录 back/abc/user/index.html
映射路径 abc/foo 前台对应目录 back/abc/foo/index.html
映射路径 abc/foo/123 前台对应目录 back/abc/foo/123.html

三、编程规约

3.1 命名风格

  1. 【强制】代码中的命名均不能以下划线或美元符号开始,也不能以下划线或美元符号结束。
    反例:_name/name / n a m e / n a m e / n a m e name / name_/ name name/name/​name / name

  2. 【强制】类名使用 UpperCamelCase 风格。

    正例:ForceCode / UserDO / HtmlDTO / XmlService / TcpUdpDeal / TaPromotion

    反例:forcecode / UserDo / HTMLDto / XMLService / TCPUDPDeal / TAPromotion

  3. 【强制】方法名、参数名、成员变量、局部变量都统一使用 lowerCamelCase 风格。

    正例: localValue / getHttpMessage() / inputUserId

  4. 【强制】常量命名全部大写,单词间用下划线隔开,力求语义表达完整清楚,不要嫌名字长。

    正例:MAX_STOCK_COUNT / CACHE_EXPIRED_TIME

    反例:MAX_COUNT / EXPIRED_TIME

  5. 【强制】类型与中括号紧挨相连来表示数组。

    正例:定义整形数组 int[] arrayDemo;

    反例:在 main 参数中,使用 String args[]来定义。

  6. 【强制】POJO 类中的任何布尔类型的变量,都不要加 is 前缀,否则部分框架解析会引起序列

    化错误。

    反例:定义为基本数据类型 Boolean isDeleted 的属性,它的方法也是 isDeleted(),框架在反向解析的时

    候,“误以为”对应的属性名称是 deleted,导致属性获取不到,进而抛出异常。

  7. 【强制】包名统一使用小写,点分隔符之间有且仅有一个自然语义的英语单词。包名统一使用

    单数形式,但是类名如果有复数含义,类名可以使用复数形式。

    正例:应用工具类包名为 com.alibaba.ei.kunlun.aap.util、类名为 MessageUtils

  8. 【强制】避免在子父类的成员变量之间、或者不同代码块的局部变量之间采用完全相同的命名,

    使可读性降低。

  9. 【推荐】接口类中的方法和属性不要加任何修饰符号(public 也不要加),保持代码的简洁

    性,并加上有效的 Javadoc 注释。尽量不要在接口里定义变量,如果一定要定义变量,确定

    与接口方法相关,并且是整个应用的基础常量。

    正例:接口方法签名 void commit();

    接口基础常量 String COMPANY = “alibaba”;

    反例:接口方法定义 public abstract void f();

    说明:JDK8 中接口允许有默认实现,那么这个 default 方法,是对所有实现类都有价值的默认实现。

  10. 【参考】枚举类名带上 Enum 后缀,枚举成员名称需要全大写,单词间用下划线隔开。

    说明:枚举其实就是特殊的常量类,且构造方法被默认强制是私有。

    正例:枚举名字为 ProcessStatusEnum 的成员名称:SUCCESS / UNKNOWN_REASON。

  11. 【参考】各层命名规约:

    A) Service/DAO 层方法命名规约

    1) 获取单个对象的方法用 get 做前缀。

    2) 获取多个对象的方法用 list 做前缀,复数结尾,如:listObjects。

    3) 获取统计值的方法用 count 做前缀。

    4) 插入的方法用 save/insert 做前缀。

    5) 删除的方法用 remove/delete 做前缀。

    6) 修改的方法用 update 做前缀。

    B) 领域模型命名规约

    1) 数据对象:xxxDO,xxx 即为数据表名。

    2) 数据传输对象:xxxDTO,xxx 为业务领域相关的名称。

    3) 展示对象:xxxVO,xxx 一般为网页名称。

    4) POJO 是 DO/DTO/BO/VO 的统称,禁止命名成 xxxPOJO。

3.2 常量定义

  1. 【强制】在 long 或者 Long 赋值时,数值后使用大写的 L,不能是小写的 l,小写容易跟数字

    混淆,造成误解。

    说明:Long a = 2l; 写的是数字的 21,还是 Long 型的 2。

  2. 【推荐】不要使用一个常量类维护所有常量,要按常量功能进行归类,分开维护。

    说明:大而全的常量类,杂乱无章,使用查找功能才能定位到修改的常量,不利于理解,也不利于维护。

    正例:缓存相关常量放在类 CacheConsts 下;系统配置相关常量放在类 ConfigConsts 下。

  3. 【推荐】常量的复用层次有五层:跨应用共享常量、应用内共享常量、子工程内共享常量、包

    内共享常量、类内共享常量。

    1) 跨应用共享常量:放置在二方库中,通常是 client.jar 中的 constant 目录下。

    2) 应用内共享常量:放置在一方库中,通常是子模块中的 constant 目录下。

    反例:易懂变量也要统一定义成应用内共享常量,两位工程师在两个类中分别定义了“YES”的变量:

    类 A 中:public static final String YES = “yes”;

    类 B 中:public static final String YES = “y”;

    A.YES.equals(B.YES),预期是 true,但实际返回为 false,导致线上问题。

    3) 子工程内部共享常量:即在当前子工程的 constant 目录下。

    4) 包内共享常量:即在当前包下单独的 constant 目录下。

    5) 类内共享常量:直接在类内部 private static final 定义。

3.3 代码格式

  1. 【强制】如果是大括号内为空,则简洁地写成{}即可,大括号中间无需换行和空格;如果是非

    空代码块则:

    1) 左大括号前不换行。

    2) 左大括号后换行。

    3) 右大括号前换行。

    4) 右大括号后还有 else 等代码则不换行;表示终止的右大括号后必须换行。

  2. 【强制】左小括号和右边相邻字符之间不出现空格;右小括号和左边相邻字符之间也不出现空

    格;而左大括号前需要加空格。详见第 5 条下方正例提示。

    反例:if (空格 a == b 空格)

  3. 【强制】if/for/while/switch/do 等保留字与括号之间都必须加空格。

  4. 【强制】任何二目、三目运算符的左右两边都需要加一个空格。

    说明:包括赋值运算符=、逻辑运算符&&、加减乘除符号等。

  5. 【强制】采用 4 个空格缩进,禁止使用 tab 字符。

    说明:如果使用 tab 缩进,必须设置 1 个 tab 为 4 个空格。IDEA 设置 tab 为 4 个空格时,请勿勾选 Use tab

    character;而在 eclipse 中,必须勾选 insert spaces for tabs。

    正例: (涉及 1-5 点)

   public static void main(String[] args) {
        // 缩进 4 个空格
        String say = "hello";
        // 运算符的左右必须有一个空格
        int flag = 0;
        // 关键词 if 与括号之间必须有一个空格,括号内的 f 与左括号,0 与右括号不需要空格
        if (flag == 0) {
            System.out.println(say);
        }
        // 左大括号前加空格且不换行;左大括号后换行
        if (flag == 1) {
            System.out.println("world");
            // 右大括号前换行,右大括号后有 else,不用换行
        } else {
           System.out.println("ok");
            // 在右大括号后直接结束,则必须换行
        }
   }
  1. 【强制】注释的双斜线与注释内容之间有且仅有一个空格。
    正例:
     // 这是示例注释,请注意在双斜线之后有一个空格
     String commentString = new String();
  1. 【强制】方法参数在定义和传入时,多个参数逗号后边必须加空格。

    正例:下例中实参的 args1,后边必须要有一个空格。

    method(args1, args2, args3);

3.4 注释规约

  1. 【强制】类、类属性、类方法的注释必须使用 Javadoc 规范,使用/*内容/格式,不得使用

    // xxx 方式。

    说明:在 IDE 编辑窗口中,Javadoc 方式会提示相关注释,生成 Javadoc 可以正确输出相应注释;在 IDE

    中,工程调用方法时,不进入方法即可悬浮提示方法、参数、返回值的意义,提高阅读效率。

  2. 【强制】所有的类都必须添加创建者和创建日期。

    说明:在设置模板时,注意 IDEA 的@author 为${USER},而 eclipse 的@author 为${user},大小写有

    区别,而日期的设置统一为 yyyy/MM/dd 的格式。

  3. 【强制】方法内部单行注释,在被注释语句上方另起一行,使用//注释。方法内部多行注释使

    用/* */注释,注意与代码对齐。

  4. 【强制】所有的枚举类型字段必须要有注释,说明每个数据项的用途。

  5. 【推荐】代码修改的同时,注释也要进行相应的修改,尤其是参数、返回值、异常、核心逻辑

    等的修改。

    说明:代码与注释更新不同步,就像路网与导航软件更新不同步一样,如果导航软件严重滞后,就失去了

    导航的意义。

  6. 【推荐】在类中删除未使用的任何字段和方法;在方法中删除未使用的任何参数声明与内部变

    量。

  7. 【参考】谨慎注释掉代码。在上方详细说明,而不是简单地注释掉。如果无用,则删除。

    说明:代码被注释掉有两种可能性:1)后续会恢复此段代码逻辑。2)永久不用。前者如果没有备注信息,

    难以知晓注释动机。后者建议直接删掉即可,假如需要查阅历史代码,登录代码仓库即可。

  8. .【参考】对于注释的要求:第一、能够准确反映设计思想和代码逻辑;第二、能够描述业务含

    义,使别的程序员能够迅速了解到代码背后的信息。完全没有注释的大段代码对于阅读者形同

    天书,注释是给自己看的,即使隔很长时间,也能清晰理解当时的思路;注释也是给继任者看

    的,使其能够快速接替自己的工作。

  9. 【参考】好的命名、代码结构是自解释的,注释力求精简准确、表达到位。避免出现注释的一

    个极端:过多过滥的注释,代码的逻辑一旦修改,修改注释是相当大的负担。

  10. 【参考】特殊注释标记,请注明标记人与标记时间。注意及时处理这些标记,通过标记扫描,

    经常清理此类标记。线上故障有时候就是来源于这些标记处的代码。

    1) 待办事宜(TODO):(标记人,标记时间,[预计处理时间])

    表示需要实现,但目前还未实现的功能。这实际上是一个 Javadoc 的标签,目前的 Javadoc 还没

    有实现,但已经被广泛使用。只能应用于类,接口和方法(因为它是一个 Javadoc 标签)。

    2) 错误,不能工作(FIXME):(标记人,标记时间,[预计处理时间])

    在注释中用 FIXME 标记某代码是错误的,而且不能工作,需要及时纠正的情况。

3.5 OOP规约

  1. 【强制】不能使用过时的类或方法。

    说明:java.net.URLDecoder 中的方法 decode(String encodeStr) 这个方法已经过时,应该使用双参数

    decode(String source, String encode)。接口提供方既然明确是过时接口,那么有义务同时提供新的接口;

    作为调用方来说,有义务去考证过时方法的新实现是什么。

  2. 【强制】浮点数之间的等值判断,基本数据类型不能用==来比较,包装数据类型不能用 equals

    来判断。

    说明:浮点数采用“尾数+阶码”的编码方式,类似于科学计数法的“有效数字+指数”的表示方式。二进

    制无法精确表示大部分的十进制小数。

    反例:

   float a = 1.0f - 0.9f;
   float b = 0.9f - 0.8f;

   if (a == b) {
        // 预期进入此代码快,执行其它业务逻辑
        // 但事实上 a==b 的结果为 false
   }

   Float x = Float.valueOf(a);
   Float y = Float.valueOf(b);

   if (x.equals(y)) {
        // 预期进入此代码快,执行其它业务逻辑
        // 但事实上 equals 的结果为 false
   }

正例:

(1) 指定一个误差范围,两个浮点数的差值在此范围之内,则认为是相等的。

   float a = 1.0f - 0.9f;
   float b = 0.9f - 0.8f;
   float diff = 1e-6f;

   if (Math.abs(a - b) < diff) {
        System.out.println("true");
   }

(2) 使用 BigDecimal 来定义值,再进行浮点数的运算操作。

   BigDecimal a = new BigDecimal("1.0");
   BigDecimal b = new BigDecimal("0.9");
   BigDecimal c = new BigDecimal("0.8");
   BigDecimal x = a.subtract(b);
   BigDecimal y = b.subtract(c);

   if (x.equals(y)) {
       System.out.println("true");
   }

  1. 【强制】构造方法里面禁止加入任何业务逻辑,如果有初始化逻辑,请放在 init 方法中。

  2. 【强制】POJO 类必须写 toString 方法。使用 IDE 中的工具:source> generate toString

    时,如果继承了另一个 POJO 类,注意在前面加一下 super.toString。

    说明:在方法执行抛出异常时,可以直接调用 POJO 的 toString()方法打印其属性值,便于排查问题。

  3. 【强制】禁止在 POJO 类中,同时存在对应属性 xxx 的 isXxx()和 getXxx()方法。

    说明:框架在调用属性 xxx 的提取方法时,并不能确定哪个方法一定是被优先调用到,神坑之一。

  4. 【推荐】循环体内,字符串的连接方式,使用 StringBuilder 的 append 方法进行扩展。

    说明:下例中,反编译出的字节码文件显示每次循环都会 new 出一个 StringBuilder 对象,然后进行 append

    操作,最后通过 toString 方法返回 String 对象,造成内存资源浪费。

    反例:

   String str = "start";
   for (int i = 0; i < 100; i++) {
       str = str + "hello";
   }
  1. 【推荐】final 可以声明类、成员变量、方法、以及本地变量,下列情况使用 final 关键字:

    1) 不允许被继承的类,如:String 类。

    2) 不允许修改引用的域对象,如:POJO 类的域变量。

    3) 不允许被覆写的方法,如:POJO 类的 setter 方法。

    4) 不允许运行过程中重新赋值的局部变量。

    5) 避免上下文重复使用一个变量,使用 final 可以强制重新定义一个变量,方便更好地进行重构。

  2. 【推荐】类成员与方法访问控制从严:

    1) 如果不允许外部直接通过 new 来创建对象,那么构造方法必须是 private。

    2) 工具类不允许有 public 或 default 构造方法。

    3) 类非 static 成员变量并且与子类共享,必须是 protected。

    4) 类非 static 成员变量并且仅在本类使用,必须是 private。

    5) 类 static 成员变量如果仅在本类使用,必须是 private。

    6) 若是 static 成员变量,考虑是否为 final。

    7) 类成员方法只供类内部调用,必须是 private。

    8) 类成员方法只对继承类公开,那么限制为 protected。

    说明:任何类、方法、参数、变量,严控访问范围。过于宽泛的访问范围,不利于模块解耦。思考:如果

    是一个 private 的方法,想删除就删除,可是一个 public 的 service 成员方法或成员变量,删除一下,不

    得手心冒点汗吗?变量像自己的小孩,尽量在自己的视线内,变量作用域太大,无限制的到处跑,那么你

    会担心的。

3.6 日期时间

  1. 【强制】日期格式化时,传入 pattern 中表示年份统一使用小写的 y。

    说明:日期格式化时,yyyy 表示当天所在的年,而大写的 YYYY 代表是 week in which year(JDK7 之后

    引入的概念),意思是当天所在的周属于的年份,一周从周日开始,周六结束,只要本周跨年,返回的 YYYY

    就是下一年。

    正例:表示日期和时间的格式如下所示:

   new SimpleDateFormat("yyyy-MM-dd HH:mm:ss")
  1. 【强制】在日期格式中分清楚大写的 M 和小写的 m,大写的 H 和小写的 h 分别指代的意义。

    说明:日期格式中的这两对字母表意如下:

    1) 表示月份是大写的 M;

    2) 表示分钟则是小写的 m;

    3) 24 小时制的是大写的 H;

    4) 12 小时制的则是小写的 h。

  2. 【强制】获取当前毫秒数:System.currentTimeMillis(); 而不是 new Date().getTime()。

    说明:如果想获取更加精确的纳秒级时间值,使用 System.nanoTime 的方式。在 JDK8 中,针对统计时间

    等场景,推荐使用 Instant 类。

  3. 【强制】不允许在程序任何地方中使用:1)java.sql.Date 2)java.sql.Time 3)

    java.sql.Timestamp。

    说明:第 1 个不记录时间,getHours()抛出异常;第 2 个不记录日期,getYear()抛出异常;第 3 个在构造

    方法 super((time/1000)*1000),fastTime 和 nanos 分开存储秒和纳秒信息。

    反例: java.util.Date.after(Date)进行时间比较时,当入参是 java.sql.Timestamp 时,会触发 JDK

    BUG(JDK9 已修复),可能导致比较时的意外结果。

  4. 【推荐】使用枚举值来指代月份。如果使用数字,注意 Date,Calendar 等日期相关类的月份

    month 取值在 0-11 之间。

    说明:参考 JDK 原生注释,Month value is 0-based. e.g., 0 for January.

    正例: Calendar.JANUARY,Calendar.FEBRUARY,Calendar.MARCH 等来指代相应月份来进行传参或

    比较。

3.7 集合处理

  1. 【强制】判断所有集合内部的元素是否为空,使用 isEmpty()方法,而不是 size()==0 的方式。

    说明:前者的时间复杂度为 O(1),而且可读性更好。

    正例:

   Map<String, Object> map = new HashMap<>();
   if(map.isEmpty()) {
       System.out.println("no element in this map.");
   }
  1. 【强制】不要在 foreach 循环里进行元素的 remove/add 操作。remove 元素请使用 Iterator

    方式,如果并发操作,需要对 Iterator 对象加锁。

    正例:

   List<String> list = new ArrayList<>();
   list.add("1");
   list.add("2");
   Iterator<String> iterator = list.iterator();
   while (iterator.hasNext()) {
       String item = iterator.next();
       if (删除元素的条件) {
            iterator.remove();
       }
   }

反例:

   for (String item : list) {
       if ("1".equals(item)) {
         list.remove(item);
       }
   }
  1. 【推荐】集合初始化时,指定集合初始值大小。

    说明:HashMap 使用 HashMap(int initialCapacity) 初始化,如果暂时无法确定集合大小,那么指定默

    认值(16)即可。

    正例:initialCapacity = (需要存储的元素个数 / 负载因子) + 1。注意负载因子(即 loader factor)默认

    为 0.75,如果暂时无法确定初始值大小,请设置为 16(即默认值)。

    反例:HashMap 需要放置 1024 个元素,由于没有设置容量初始大小,随着元素不断增加,容量 7 次被迫

    扩大,resize 需要重建 hash 表。当放置的集合元素个数达千万级别时,不断扩容会严重影响性能。

  2. 【推荐】使用 entrySet 遍历 Map 类集合 KV,而不是 keySet 方式进行遍历。

    说明:keySet 其实是遍历了 2 次,一次是转为 Iterator 对象,另一次是从 hashMap 中取出 key 所对应的

    value。而 entrySet 只是遍历了一次就把 key 和 value 都放到了 entry 中,效率更高。如果是 JDK8,使用

    Map.forEach 方法。

    正例:values()返回的是 V 值集合,是一个 list 集合对象;keySet()返回的是 K 值集合,是一个 Set 集合对

    象;entrySet()返回的是 K-V 值组合集合

3.8 并发处理

  1. 【强制】获取单例对象需要保证线程安全,其中的方法也要保证线程安全。

    说明:资源驱动类、工具类、单例工厂类都需要注意。

  2. 【强制】SimpleDateFormat 是线程不安全的类,一般不要定义为 static 变量,如果定义为 static,

    必须加锁,或者使用 DateUtils 工具类。

    正例:注意线程安全,使用 DateUtils。亦推荐如下处理:

   private static final ThreadLocal<DateFormat> df = new ThreadLocal<DateFormat>() {
       @Override
       protected DateFormat initialValue() {
            return new SimpleDateFormat("yyyy-MM-dd");
       }
   };

3.9 控制语句

  1. 【强制】在一个 switch 块内,每个 case 要么通过 continue/break/return 等来终止,要么

    注释说明程序将继续执行到哪一个 case 为止;在一个 switch 块内,都必须包含一个 default语句并且放在最后,即使它什么代码也没有。

    说明:注意 break 是退出 switch 语句块,而 return 是退出方法体。

  2. 【强制】当 switch 括号内的变量类型为 String 并且此变量为外部参数时,必须先进行 null

    判断。

    反例:如下的代码输出是什么?

   public class SwitchString {
      public static void main(String[] args) {
         method(null);
      }

    public static void method(String param) {
       switch (param) {
         // 肯定不是进入这里
         case "sth":
           System.out.println("it's sth");
           break;
         // 也不是进入这里
         case "null":
           System.out.println("it's null");
           break;
         // 也不是进入这里
         default:
           System.out.println("default");
       }
    }
   }
  1. 【强制】在 if/else/for/while/do 语句中必须使用大括号。

    说明:即使只有一行代码,禁止不采用大括号的编码方式:if (condition) statements;

  2. 【强制】三目运算符 condition? 表达式 1 : 表达式 2 中,高度注意表达式 1 和 2 在类型对齐

    时,可能抛出因自动拆箱导致的 NPE 异常。

    说明:以下两种场景会触发类型对齐的拆箱操作:

    1) 表达式 1 或表达式 2 的值只要有一个是原始类型。

    2) 表达式 1 或表达式 2 的值的类型不一致,会强制拆箱升级成表示范围更大的那个类型。

    反例:

   Integer a = 1;
   Integer b = 2;
   Integer c = null;
   Boolean flag = false;
   // a*b 的结果是 int 类型,那么 c 会强制拆箱成 int 类型,抛出 NPE 异常
   Integer result=(flag? a*b : c);

3.10 其他

  1. 【强制】在使用正则表达式时,利用好其预编译功能,可以有效加快正则匹配速度。

    说明:不要在方法体内定义:Pattern pattern = Pattern.compile(“规则”);

  2. 【强制】后台输送给页面的变量必须加$!{var}——中间的感叹号。

    说明:如果 var 等于 null 或者不存在,那么${var}会直接显示在页面上。

  3. 【推荐】不要在视图模板中加入任何复杂的逻辑。

    说明:根据 MVC 理论,视图的职责是展示,不要抢模型和控制器的活。

  4. 【推荐】任何数据结构的构造或初始化,都应指定大小,避免数据结构无限增长吃光内存。

  5. 【推荐】及时清理不再使用的代码段或配置信息。

    说明:对于垃圾代码或过时配置,坚决清理干净,避免程序过度臃肿,代码冗余。

    正例:对于暂时被注释掉,后续可能恢复使用的代码片断,在注释代码上方,统一规定使用三个斜杠(///)

    来说明注释掉代码的理由。如:

   public static void hello() {
      /// 业务方通知活动暂停
      // Business business = new Business();
      // business.active();
      System.out.println("it's finished");
   }
四、IDEA插件-Alibaba代码规约实时检测

打开 Settings >> Plugins
搜索:Alibaba Java Coding Guidelines,然后install,restart一次IDEA即可。

五、Git Commit代码提交规范

代码提交信息的说明,能够使项目在后期协作以及Bug处理时更加容易理解

5.1 commit message格式

<type>: <subject>
注意:冒号后面又空格

5.2 type 用于说明commit的类别

  • feat:新功能(feature)
  • fix:修补bug
  • docs:文档(documentation)
  • stype:格式(不影响代码运行的变动)
  • refactor:重构:(即不是新增功能,也不是修改bug的代码变动)
  • test:增加测试
  • chore:构建过程或辅助工具的变动

5.3 subject 是commit代码的简短描述

标签:正例,String,规约,代码,注释,思考,强制,方法
来源: https://blog.51cto.com/u_15078339/2869871

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有