一、项目结构

jeecg-boot-parent 
└───jeecg-boot-module-system(以下简称system)
│   │
│   └───xxxx-des(以下简称des)
│   	│
│       └───jeecg-boot-base-core
└───jeecg-boot-base

二、技术路线

  1. jeecgboot 3.0
  2. MyBatis-Plus 3.4.3.1
  3. MySQL 5.7.26
  4. Redis 3.0.504

三、代码鉴赏

  1. 模块拆分不合理

    本属于des模块的Mapper/Entity/Service被写入到system模块,为了和des模块的类做区分、不冲突不惜重新修改一套命名,导致代码混乱、难以维护。

    经过阅读源代码发现,作者遇到的问题是,在des模块内无法调用system模块方法修改系统用户信息,所以将本该属于des模块的代码提到system模块。

    解决办法:在system模块新建controller,在controller内部组合dessystem模块服务方法实现目标逻辑;同时移除system模块内的des模块相关代码。

  2. 代码重复

    工具类函数listToString重复5次。

    public String listToString(List list, char separator) {
        StringBuilder sb = new StringBuilder();
        for (int i = 0; i < list.size(); i++) {
            sb.append(list.get(i)).append(separator);
        }
        return sb.toString().substring(0, sb.toString().length() - 1);
    }
    
    public void xxxx(){
        // 省略部分逻辑代码...
        List<String> strings = baseAPI.xxxx(dto.getIndustry());
        String nameA = "";
        if (strings.size() == 1) {
            nameA = strings.get(0);
        } else {
            for (int i = 0; i < strings.size(); i++) {
                if (i < strings.size() - 1) {
                    nameA += strings.get(i) + "、";
                } else if (i == strings.size() - 1) {
                    nameA += strings.get(i);
                }
            }
        }
        // 省略部分逻辑代码...
    }
    

    解决办法:将该方法抽成一个静态工具类方法,或者直接使用第三方包工具类。

  3. 方法命名可读性较差

    // xg:相关、习惯、香港、效果、信鸽、香菇、选股、宣贯、膝盖、西瓜、小哥、
    // 小狗、小锅、新冠、修改
    public void xg(DesEnterpriseInformation desEnterpriseInformation){}
    
    // stag:n.雄鹿;vi.不带女伴参加晚会;[商]〈俚〉买进新股(等)见利即抛;
    // 〈英〉监视;盯梢;告发;截短长裤;adj.全是男人(集会等)的;无异性伴侣的;
    public void stag(DesEnterpriseInformation desEnterpriseInformation){}
    
    // 笔误
    @Api(tags="数据统计")
    @RestController
    @RequestMapping("/des/datastatistics")
    public class DatestaticsController{}
    
    // 其实是根据ID获取记录
    DesEnterpriseInformation result(@Param("id") String id);
    
    // 方法名与返回值不一致
    public String getUserId() {
        LoginUser principal = (LoginUser) SecurityUtils.getSubject().getPrincipal();
        String orgCode = principal.getOrgCode();
        return orgCode;
    }
    
    // 过于简洁
    public String userName(String id) {
        String userName = desFeedbackQuestionMapper.getUserName(id);
        return userName;
    }
    
  4. 水KPI嫌疑

    判断不为空,直接拼接就完事儿了。

    String biaoShu = "";
    if (labelContent.isEmpty() && !chooseLabel.isEmpty()) {
    	biaoShu = chooseLabel;
    }
    if (!labelContent.isEmpty() && chooseLabel.isEmpty()) {
    	biaoShu = labelContent;
    }
    if (!labelContent.isEmpty() && !chooseLabel.isEmpty()) {
    	biaoShu = labelContent + chooseLabel;
    }
    if (!biaoShu.isEmpty()) {
    	strings.add(biaoShu);
    }
    

    一个for循环可以搞定的事情,愣是干出这个多代码。

    List<Map<String, Object>> maps1 = ...;
    StringBuffer stringBuffer = new StringBuffer();
    if (maps1.size() == 1) {
        Map<String, Object> stringObjectMap = maps1.get(0);
        String des_industry_id = (String) stringObjectMap.get("des_industry_id");
        List<String> stringList1 = baseAPI.loadCategoryDictItem(des_industry_id);
        // 省略部分逻辑代码...
    } else if (maps1.size() == 0) {
        desQuestionnaireConfig1.setCanFillEnterprise("");
        map.put("questionnaireConfig", desQuestionnaireConfig1);
        maps.add(map);
    } else {
        List<String> strings = new ArrayList<>();
        for (int j = 0; j < maps1.size(); j++) {
            Map<String, Object> stringObjectMap = maps1.get(j);
            String des_industry_id = (String) stringObjectMap.get("des_industry_id");
            strings.add(des_industry_id);
        }
        String s1 = listToString(strings, ',');
        List<String> stringList1 = baseAPI.loadCategoryDictItem(s1);
        // 省略部分逻辑代码...
    }
    
  5. IF陷阱

    如果我的分数是20分,得到level为4级,阁下应该如何应对?

    //通过分数去判断级别
    if (score >= 0.0 && score < 20.0) {
        map.put("level", "0");
    } else if (score > 20.0 && score <= 40.0) {
        map.put("level", "1");
    } else if (score > 40 && score <= 60.0) {
        map.put("level", "2");
    } else if (score > 60.0 && score <= 80.0) {
        map.put("level", "3");
    } else {
        map.put("level", "4");
    }
    
  6. 能运行但是不赞同

    • mapper.xml文件内存在大量单表增删改查sql语句
    • 很多mapper方法使用map作为返回值类型

    个人观点:既然使用了MyBatis-Plus,单表的增删改查就别再写sql语句了,直接通过Wrapper就能组装出语句;针对复杂统计方法可以考虑使用map接收返回值,但是大多数情况下还是建议使用实体类接收返回值。