编码规范

2021-08-10  本文已影响0人  新生代民工代表

摘录自阿里编码规范
地址:https://github.com/alibaba/p3c

命名规范

  • 代码中的命名均不能以下划线或美元符号开始,也不能以下划线或美元符号结束。
    反例:_name/_name/$Object/name/name$/Object$
  • 代码中的命名严禁使用拼音与英文混合的方式,更不允许直接使用中文的方式。 说明:正确的英文拼写和语法可以让阅读者易于理解,避免歧义。注意,即使纯拼音命名方式也要避免采用。
    正例:taobao / youku / hangzhou 等国际通用的名称,可视同英文。
    反例:DaZhePromotion [打折] / getPingfenByName() [评分] / int 某变量 = 3
  • 类名使用UpperCamelCase风格,必须遵从驼峰形式,但以下情形例外:DO / BO / DTO / VO / AO
    正例:MarcoPolo / UserDO / XmlService / TcpUdpDeal / TaPromotion
    反例:macroPolo / UserDo / XMLService / TCPUDPDeal / TAPromotion
  • 方法名、参数名、成员变量、局部变量都统一使用lowerCamelCase风格,必须遵从驼峰形式
  • 常量命名全部大写,单词间用下划线隔开,力求语义表达完整清楚,不要嫌名字长。
    正例:MAX_STOCK_COUNT
    反例:MAX_COUNT
  • 抽象类命名使用Abstract或Base开头;异常类命名使用Exception结尾;测试类命名以它要测试的类的名称开始,以Test结尾。
  • 中括号是数组类型的一部分,数组定义如下:String[] args;
    反例:使用String args[]的方式来定义。
  • POJO类中布尔类型的变量,都不要加is,否则部分框架解析会引起序列化错误。
  • 包名统一使用小写,点分隔符之间有且仅有一个自然语义的英语单词。包名统一使用单数形式,但是类名如果有复数含义,类名可以使用复数形式。
    正例: 应用工具类包名为com.test.open.util、类名为MessageUtils(此规则参考spring的框架结构)
  • 杜绝完全不规范的缩写,避免望文不知义。
    反例:AbstractClass“缩写”命名成AbsClass;condition“缩写”命名成 condi,此类随意缩写严重降低了代码的可阅读性。
  • 如果模块、接口、类、方法使用了设计模式,在命名时体现出具体模式。 说明:将设计模式体现在名字中,有利于阅读者快速理解架构设计理念。
    正例:public class OrderFactory;
    public class LoginProxy;
    public class ResourceObserver;
  • 对于Service和DAO类,基于SOA的理念,暴露出来的服务一定是接口,内部的实现类用Impl的后缀与接口区别。
    正例:CacheServiceImpl实现CacheService接口。

常量定义

1)不允许任何魔法值(即未经定义的常量)直接出现在代码中。
反例:

if (a == "9"){
} else if(a == "10"{
}
//别人看到这个会很蒙,等于9和等于10到底是什么意思

long或者Long初始赋值时,使用大写的L,不能是小写的l,小写容易跟数字1混淆,造成误解。
说明:Long a = 2l; 写的是数字的21,还是Long型的2?

不要使用一个常量类维护所有常量,按常量功能进行归类,分开维护。 说明:大而全的常量类,非得使用查找功能才能定位到修改的常量,不利于理解和维护。
正例:缓存相关常量放在类CacheConsts下;系统配置相关常量放在类ConfigConsts下。

如果变量值仅在一个范围内变化,且带有名称之外的延伸属性,定义为枚举类。下面正例中的数字就是延伸信息,表示星期几。
正例:public Enum { MONDAY(1), TUESDAY(2), WEDNESDAY(3), THURSDAY(4), FRIDAY(5), SATURDAY(6), SUNDAY(7);}

代码格式

  • 大括号的使用约定。如果是大括号内为空,则简洁地写成{}即可,不需要换行;如果是非空代码块则:
    1.左大括号前不换行。
    2.左大括号后换行。
    3.右大括号前换行。
    4.右大括号后还有else等代码则不换行;表示终止的右大括号后必须换行
  • 左小括号和字符之间不出现空格;同样,右小括号和字符之间也不出现空格。详见第5条下方正例提示。
    反例:if (空格a == b空格)
  • if/for/while/switch/do等保留字与括号之间都必须加空格。
  • 任何二目、三目运算符的左右两边都需要加一个空格。
    说明:运算符包括赋值运算符=、逻辑运算符&&、加减乘除符号等。
  • 采用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");
      // 在右大括号后直接结束,则必须换行
      }
}

注释的双斜线与注释内容之间有且仅有一个空格。
正例:// 注释内容,注意在//和注释内容之间有一个空格。

方法参数在定义和传入时,多个参数逗号后边必须加空格。
正例:下例中实参的"a",后边必须要有一个空格。
method("a", "b", "c");

上一篇下一篇

猜你喜欢

热点阅读