Skip to content

编码规范

3.1 代码检测工具及常见规范

  1. 代码检测工具: 采用阿里巴巴JAVA代码规范检测工具 Alibaba Java Coding Guideline
  2. 代码风格
  • 缩进:程序块要采用缩进风格编写,缩进统一使用TAB键
  • 代码块:程序块的分界符左大括号"{" 和右大括号"}",不可省略,左大括号不换行,且块内代码必须另起一行
java
//反例  
if (num == 1) System.* out *.println(num);
if (num == 1) { System.* out *.println(num); }
//正例  
if (num == 1) {
    System.* out *.println(num);
}
  • 换行:一行的长度超过120个字符需要换行,新行缩进2个TAB
  1. 命名规范:
    基本规则:变量尽可能做到见词知意,使用驼峰命名法(正例: userInfo, 反例: user_info)
    包命名:包名一律小写, 且不能使用缩写,必须做到语义明确(如: base、file等)
    类、接口命名:类与接口根据其所在的分层进行命名,必须在文件名后面加上指定的后缀名
    接口层:Controller
    业务接口层:Service
    业务实现层:ServiceImpl
    数据库持久层:Dao
    实体类:Entity
    业务层间传递的实体对象:ViewModel(如: userController、userService、userServiceImpl、userDao、userEntity、menuViewModel)
    方法命名:方法名是一个动词,采用大小写混合的方式,第一个单词的首字母小写,其后单词的首字母大写;取值类使用get前缀,设值类使用set前缀,判断类可使用is(has)前缀。如行 public Result<User> getUserInfo() {...}
  2. 编码习惯
  • if、for、do、while等语句的执行语句部分无论多少都要加括号"{}",以保证代码的可读性
Java
//正例
if (param == true) {
    //do something
}
  • 尽量避免在循环中构造和释放对象
Java
for (int i = 0; i < 10; i++) {
    User u = new User();
}
  • 在使用局部变量的过程,按就近原则处理。不允许定义一个局部变量,然后在很远的地方才使用;
  • 相同的功能应当抽取出来作为函数或者类进行调用,不允许复制成N份代码;
  • 在处理String的时候要尽量使用StringBuffer类。
  1. 注释:
  • 字段注释:注释位于行前,行后不能添加注释,当需要使用中文简拼作为变量名时必须给出注释,定义为public的字段必需给出注释,在类的(静态)变量、实例变量定义之前当对其进行注释,给出该字段的描述等:
  • 方法注释:采用JavaDoc文档注释,在方法定义之前当对其进行注释,包括方法的描述、输入、输出及返回值说明等,创建者需要著名coder的姓名,修改者也需要备注modifier的姓名(采用,块注释格式/……/)如: 分组 + 预览

3.2 结构规范及编码逻辑

  1. 项目层级分工: 整个项目中每个层级必须有明确的分工:
  • 接口层Controller层只负责与前端交互并对业务层的方法进行拼装;
  • 业务层Service与ServiceImpl层负责编写业务逻辑,若业务逻辑较为复杂且庞大,需要将其拆分到多个Service中进行实现,并统一由一个接口Controller与前端交互,该Controller必须为业务的主体;
  • 数据库持久层Dao层只负责与数据库进行交互;
  • 当业务层之间的数据传递需求或者前端需要的数据类型无数据库表与之对应时(Entity满足不了),使用ViewModel作为容器;
  1. Java文件组织规范:容器;避免单个文件的代码量超出2000行,尽可能控制在1000以内
  2. 避免脏数据造成的bug:
  3. 禁止魔法值的使用: 所谓魔法值,是指在代码中直接出现的数值,只有在这个数值记述的那部分代码中才能明确了解其含义。(例如:**int [] array = new int[20];**其中20就是魔法值)魔法数值使代码的可读性大大下降,也增加了开发者之间交流的成本,因此若非必须的情况,例如从前端传递的JSON中取值(String userName = jsonObject.getString("userName");),禁止使用魔法值。
  4. Date数据类型在实体中添加@DateTimeFormat注解,并且注解需要明确Date格式(如:yyyy-MM-dd),该注解能将前端String格式的数据转化为Java Date格式。