code style

2016-11-18

注释

1. 所有public类均需写/*/类型注释,可通过设置IDE模板实现

/**
 * 支付业务,包括微信、支付宝的支付请求与回调
 *
 * @author XXX
 * @mail XXX@163.com
 * @date 2016-7-18 20:02:06
 * @copyright ©2016 mamian.net All Rights Reserved
 */
@Component
@Transactional
public class PayServiceImpl implements PayService {
    ...
}

2. 所有public方法均需写/*/类型注释

/**
 * 用户登录
 *
 * @param visitor 访问来源
 * @param version 访问的版本
 * @param loginName 用户名
 * @param password 密码
 * @return
 */
@RequestMapping(value = "/login", method = RequestMethod.POST)
public ModelAndView login(@RequestHeader("visitor") Visitor visitor,
                          @RequestHeader("version") int version,
                          @RequestParam(value="loginName") String loginName,
                          @RequestParam(value="password") String password)

3. 所有方法内的代码,如需要注释,使用//类型注释

public Result create(Task task) {
    try {
        //添加城市
        task.addCity();

        //添加省份
        task.addProvince();

        //添加日志
        addLog();
        ...
    } catch (Exception e) {
        log.error("...", e);
        ...
    }
}

4. POJO类、枚举、interface的成员需使用/*/类型注释说明其含义

public class User extends BaseObject {

    /**
     * id
     */
    @Getter
    @Setter
    private String id;

    /**
     * 手机号
     */
    @Getter
    @Setter
    private String mobile;

    /**
     * 真实姓名
     */
    @Getter
    @Setter
    private String name;

    /**
     * 用户名
     */
    @Getter
    @Setter
    private String loginName;

}

命名

1. 类名、变量名、方法名使用驼峰命名法命名(类名首字母大写、变量名首字母小写)

public class PayService {
    ...
}

public void getDefaultValue (){
    int defaultValue = testService.getDefaultValue();
    ...
}

2. 枚举、常量、变量名需为有意义的字符串,不可出现类似x、i等无法判定含义的字符串。

int x = paymentService.sum();

public static final String ONE = 1;

3. 抽象类使用Abstract前缀,接口使用I前缀,实现类使用Impl后缀。


方法

1. 定义及使用方法时,若参数多于3个,使用竖版方式,且参数要对齐

public Result create(String loginName,
                     String password,
                     String name,
                     String mobile,
                     String address){
    User user = userService.create(CountryCode.CN,
                                   loginName,
                                   password,
                                   name,
                                   mobile,
                                   address);
    ...
}

2. 过时方法需加注@Deprecated,并注明过期时间

/**
 * <strong>不再支持,使用newAssign方法代替</strong>分配任务
 * 预计于2016.11.11删除
 *
 * @param task
 * @return
 * */
@Deprecated
public boolean assign(Task task) 

3. 实现父类与接口的方法,必须加@Override

@Override
public int init(Task task){}

4. 所有类不得出现默认构造函数、全成员构造函数、字段的get与set方法,需使用注解代替

  • 不推荐的方式:

    public class User extends BaseObject {
    
        /**
         * 手机号
         */
        private String mobile;
    
        /**
         * 真实姓名
         */
        private String name;
    
        public User () {}
    
        public User (String mobile, String name) {
            this.mobile = mobile;
            this.name = name;
        }
    
        public String getMobile () {
            return mobile;
        }
    
        public void setMobile (String mobile) {
            this.mobile = mobile;
        }
    
        public String getName () {
            return name;
        }
    
        public void setName (String name) {
            this.name = name;
        }   
    }
    
  • 推荐的方式:

    @NoArgsConstructor
    @AllArgsConstructor
    public class User extends BaseObject {
    
        /**
         * 手机号
         */
        @Getter
        @Setter
        private String mobile;
    
        /**
         * 真实姓名
         */
        @Getter
        @Setter
        private String name;
    
    }
    

代码

1. 业务代码中不可出现与特定数字与字符串的比较,需使用Constant代替,注意用大写

  • 不推荐的方式:

    if (type == 1) {
        ...
    } else if (type == 2) {
        ...
    }
    
    if (type.equals("name")) {
        ...
    } else if (type.equals("logo")) {
        ...
    }
    
  • 推荐的方式:

    public interface OpTypeConstant {
        /**
         * 入账
         * */
        int IN = 1;
    
        /**
         * 出账
         * */
        int OUT = 2;
    }
    
    if (OpTypeConstant.IN == type) {
        ...
    } else if (OpTypeConstant.OUT == type) {
        ...
    }
    

2. 无效的代码、方法要及时清理

  • 清理过时代码时要注意检测是否还被引用。

3. 合理确定代码分层粒度,每一层方法不宜超过100行

4. 循环不得超过3层

5. 相似功能的方法要挨着

6. rest api接口返回数据不可为null,不可为数组

7. 更改他人代码

  • 不得更改类上的@author,若后续有人修改代码,请在@author后添加修改人员。

Kommentare: