其他分享
首页 > 其他分享> > 高质量代码日常总结

高质量代码日常总结

作者:互联网

代码质量提升日常总结

1. 开发规范

1.1 合适的命名

1.2 不破坏规则,不引入混乱

1.3 代码是程序员的重要沟通方式之一

2. 编码技巧

2.1 利用try-with-resource

反例:

BufferedReader reader = null;
try {
    reader = new BufferedReader(new FileReader("cities.csv"));
    String line;
    while ((line = reader.readLine()) != null) {
        // TODO: 处理line
    }
} catch (IOException e) {
    log.error("读取文件异常", e);
} finally {
    if (reader != null) {
        try {
            reader.close();
        } catch (IOException e) {
            log.error("关闭文件异常", e);
        }
    }
}

正例:

try (BufferedReader reader = new BufferedReader(new FileReader("test.txt"))) {
    String line;
    while ((line = reader.readLine()) != null) {
        // TODO: 处理line
    }
    reader.close();
} catch (IOException e) {
    log.error("读取文件异常{}", ExceptionUtil.stacktraceToString(e));
}

2.2 利用return

反例:

public boolean modifyPassword(Integer userId, String oldPassword, String newPassword) {
    if (ObjectUtil.isNull(userId) && StrUtil.isNotBlank(newPassword) && StrUtil.isNotBlank(oldPassword)) {
        User user = getUserById(userId);
        if(ObjectUtil.isNotNull(user)) {
            if(StrUtil.equals(user.getPassword(),oldPassword) ){
                return updatePassword(userId, newPassword);
            }
        }
    }
}

正例:

public Boolean modifyPassword(Integer userId, String oldPassword, String newPassword) {
    if (ObjectUtil.isNull(userId) || StrUtil.isBlank(newPassword) || StrUtil.isBlank(oldPassword)) {
        return false;
    }
    User user = getUserById(userId);
    if(ObjectUtil.isNull(user)) {
        return false;
    }
    if(!StrUtil.equals(user.getPassword(),oldPassword)) {
        return false;
    }
    return updatePassword(userId, newPassword);
}

2.3 封装条件表达式(简单条件,复杂条件都要封装)

反例:

public double getTicketPrice(Date currDate) {
    if (ObjectUtil.isNotNull(currDate) && currDate.after(DISCOUNT_BEGIN_DATE)
        && currDate.before(DISCOUNT_END_DATE)) {
        return TICKET_PRICE * DISCOUNT_RATE;
    }
    return TICKET_PRICE;
}

正例:

public double getTicketPrice(Date currDate) {
    return isDiscountDate(currDate)?TICKET_PRICE * DISCOUNT_RATE:TICKET_PRICE;
}
// 封装函数
private static boolean isDiscountDate(Date currDate) {
    return ObjectUtil.isNotNull(currDate) && currDate.after(DISCOUNT_BEGIN_DATE)&& currDate.before(DISCOUNT_END_DATE);
}

2.4 拆分超大函数(当一个函数超过80行就要进行拆分)

反例:

//获取个人信息
private UserDTO getUserDTO(Integer userId){
    try {
        //获取基本信息 
        ...此处写了10行
        //获取最近的一次订单信息.
        ...此处写了20行
        //获取用户可用余额等
        ...此处写了20行
        //获取用户可用优惠券等
        ...此处写了20行
        //获取用户奖励金等
        ...此处写了20行
    }catch (Exception e) {
        log.error("{}获取个人信息异常{}",userId,ExceptionUtil.stacktraceToString(e));
        return null;
    }
	return userDTO;
}

正例:

//  获取个人信息
private UserDTO getUserDTO(Integer userId) {
    //获取基本信息
    UserDTO userDTO = getUserBasicInfo(userId);
    //获取最近的一次订单信息
    userDTO.setUserLastOrder(getUserLastOrder(userId));
    //获取用户可用余额等
    userDTO.setUserBalance(getUserBalance(userId));
    //获取用户可用优惠券等
    userDTO.setUserCoupons(getUserCoupons(userId));
    //获取用户奖励金等
    userDTO.setUserReward(getUserRewards(userId));
    return userDTO;
}
private UserDTO getUserBasicInfo(userId) { //TODO}
private UserLastOrder getUserLastOrder(userId) {//TODO}
private UserBalance UserBalance(userId){
    try{// TODO} catch(Exception e){//TODO}
}
private UserCoupons getUserCoupons(userId){
    try{// TODO} catch(Exception e){//TODO}
}
private UserReward getUserRewards(userId){// TODO}

2.5 同一函数内代码块级别尽量一致

反例:

public void auditById(){
    //组装条件获取数据
    ... 十几行代码
    //处理数据
    processData();
    //发送数据
    sendData();
    // 结果数据保存
    ... 十几行代码
}

正例:

public void auditById(){
    //组装条件获取数据
    getDataById();
    //处理数据
    processData();
    //发送数据
    sendData();
    // 结果数据保存
    saveData();
}

2.6 封装代码(相同代码直接封装,相似代码通过参数区分 )

反例:

//取消订单
public void cancelTicket(){
    Ticket ticket = new Ticket();
    ticket.setId(id);
    ticket.setStatus(CANCEL);
    ticket.setModifyBy(user);
    ticket.setModifyTime(now());
    ticketDao.update(ticket);
}
//订单作废
public void voidTicket(){
    Ticket ticket = new Ticket();
    ticket.setId(id);
    ticket.setStatus(VOID);
    ticket.setModifyBy(system);
    ticket.setModifyTime(now());
    ticketDao.update(ticket);
}

正例:

//取消订单
public void cancelTicket(){
    modifyTicket(id,CANCEL,user);
}
//订单作废
public void voidTicket(){
    modifyTicket(id,VOID,system);
}
//修改订单
private void modifyTicket(Stirng id,String status,String operater){
    Ticket ticket = new Ticket();
    ticket.setId(id);
    ticket.setStatus(status);
    ticket.setModifyBy(operater);
    ticket.setModifyTime(now());
    ticketDao.update(ticket);
}

2.7 尽量避免不必要的空指针判断

反例:

// 保存用户函数
public void saveUser(String id,String name){
    // 构建用户信息
    User user = buildUser(id, name);
    if (ObjectUtil.isNull(user)) {
        throw new BizRuntimeException("构建用户信息为空");
    }
    // 创建用户信息
    userDAO.insert(user);
    userRedis.save(user);
}
// 构建用户函数
private User buildUser(String id, String name) {
    User user = new User();
    user.setId(id);
    user.setName(name);
    return user;
}

正例:

// 保存用户函数
public void saveUser(String id,String name){
    // 构建用户信息
    User user = buildUser(id, name);
    // 创建用户信息
    userDAO.insert(user);
    userRedis.save(user);
}
// 构建用户函数
private User buildUser(String id, String name) {
    User user = new User();
    user.setId(id);
    user.setName(name);
    return user;
}

2.8 内部变量尽量使用基础数据类型

反例:

// 调用代码
double price = 5.1D;
int number = 9;
Double total = calculate(price, number);
// 计算金额函数
private Double calculate(Double price, Integer number) {
    return price * number;
}

正例:

// 调用代码
double price = 5.1D;
int number = 9;
double total = calculate(price, number);
// 计算金额函数
private double calculate(double price, int number) {
    return price * number;
}

2.9 基础规范

3. 流程控制

3.1 日志和异常

3.2 空行

3.3 注释

4. 小结

标签:return,userId,代码,高质量,private,日常,ticket,user
来源: https://www.cnblogs.com/yzycode/p/16246023.html