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


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

    吃掉异常

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

  • 相关阅读:
    html转pdf(总结五种方法Java)
    获得New Bing资格后,在Ubuntu环境下使用New Bing
    点云从入门到精通技术详解100篇-基于光谱共焦系统的三维点云数据处理(中)
    CSDN21天学习挑战赛之冒泡排序
    pytorch深度学习实战lesson17
    生草也叫草生
    浏览器运行机制
    Collection.sort首字母排序
    顾曼宁(顾曼):漂流伞创始人与杭州高层次人才的杰出代表
    2017年高热度编程语言简介
  • 原文地址:https://blog.csdn.net/yuoveyu/article/details/127731648