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


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

    吃掉异常

    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前面执行,而不是方法里面,影响了整体性能。

  • 相关阅读:
    图片gif怎么做?这一招分分钟制作
    【C++】vector 的常用接口
    4-11 Isomorphic
    MySQL 中的 INSERT 是怎么加锁的?(荣耀典藏版)
    宠物之家网站大学生网页制作教程 学生HTML静态宠物网页设计作业成品 DIV布局简单动物网页制作代码
    区别Vue 2.0 和 Vue 3.0
    Docker搭建Vulhub漏洞环境
    2333. 最小差值平方和-排序加二分查找,力扣c语言题解
    【刷题记录⑤】Java从0到1入门| 常用API练习
    前端新轮子Nue JS,号称要打造全新的Web生态!!!
  • 原文地址:https://blog.csdn.net/yuoveyu/article/details/127731648