• 不好的代码要引以为戒,才能写出更好的代码


    不好的代码要引以为戒,才能写出更好的代码

    吃掉异常

    try {
        //...
    }
    catch (Throwable t) {
        return;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    catch的地方直接吃掉异常,这样导致排除问题变困难。

    变量名无意义,神奇魔法数

    public static final String ZERO = "0";//Constants.java
    wrapper.lambda().eq(UserEntity::getIsDelete, Constants.ZERO);
    
    • 1
    • 2

    定义的变量名只是0的英文,根本无法理解表达的是已经删除还是未删除状态

    循环里依次查询数据库

    for(Test test:tests) {
        test.setName(userService.getNameById(test.getUserId()));
    }
    
    • 1
    • 2
    • 3

    应该汇总userId,一次性查询tests列表里对应的,而不是循环不断查询

    System.out.println()打印

    System.out.println("users:"+users);
    
    • 1

    生产上应该用log日志去打印,而不是System.out.println,
    System.out.println代码跟踪进去,会有synchronized 同步锁,对性能影响很大。
    printStackTrace也是。

    参数传递userId

    //接口请求,传递userId,直接用前端给的userId查询数据
    //user/getUserById?userId=11
    
    • 1
    • 2

    存在安全风险,应该从当前用户session或者token中得到userId(经验的原因,新手老是会犯)

    大量的ifelse

    if ("1".equals(type)) {
        ...
    } else if ("2".equals(type)) {
        ...
    } else if ("3".equals(type)) {
        ....
    } else if ("4".equals(type)) {
        ....
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    通过map优化,更复杂考虑采用责任链模式

    controller调用mapper

    @RestController("user")
    public class UserController {
     
        Autowired
        private UserMapper userMapper;
     
        @RequestMapping("/getUser")
        public String getUser() {
            Long userId = ...;
            return userDao.getUserById(userId);
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    controller直接调用mapper,而不是service,层级混乱

    未在finally中close

    try {
        //...
        x.close();
    }
    catch (Throwable t) {
        return;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    很多api涉及到资源释放,都会提供close方法,
    但是close()方法应该写在finally中确保被调用。

    log日志打印用占位符而不是用字符串拼接

    log.info("users:"+users);
    
    • 1

    正确应该是log.info(“users:{}”,users);

    synchronized范围太大

    public void deal() {
        synchronized (obj) {
            // 查询list当数据判断
            // 处理业务
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    synchronized应该锁粒度尽量小,本身查询list没有影响的情况下,应该在synchronized前面执行,而不是方法里面,影响了整体性能。

  • 相关阅读:
    遥感语义分割、变化检测论文小trick合集(持续更新)
    5800计算程序
    练气第六天
    【毕业设计】基于单片机的手势识别系统 - 手势识别 单片机 物联网
    自动化运维机器人(RPA)在银行IT运维领域应用场景分析
    Rust编程中的线程间通信
    JAVA学习实战(十二)分库分表学习
    C高级 shell指令分支和循环
    如何本地windows电脑通过scp下载vps服务器内的文件
    PCL1.12+VTK9.1+QT6编译部署
  • 原文地址:https://blog.csdn.net/yuoveyu/article/details/127731648