一、项目结构
jeecg-boot-parent
│
└───jeecg-boot-module-system(以下简称system)
│ │
│ └───xxxx-des(以下简称des)
│ │
│ └───jeecg-boot-base-core
│
└───jeecg-boot-base
二、技术路线
- jeecgboot 3.0
- MyBatis-Plus 3.4.3.1
- MySQL 5.7.26
- Redis 3.0.504
三、代码鉴赏
-
模块拆分不合理
本属于
des
模块的Mapper/Entity/Service被写入到system
模块,为了和des
模块的类做区分、不冲突不惜重新修改一套命名,导致代码混乱、难以维护。经过阅读源代码发现,作者遇到的问题是,在
des
模块内无法调用system
模块方法修改系统用户信息,所以将本该属于des
模块的代码提到system
模块。解决办法:在
system
模块新建controller,在controller内部组合des
和system
模块服务方法实现目标逻辑;同时移除system
模块内的des
模块相关代码。 -
代码重复
工具类函数
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); } } } // 省略部分逻辑代码... }
解决办法:将该方法抽成一个静态工具类方法,或者直接使用第三方包工具类。
-
方法命名可读性较差
// 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; }
-
水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); // 省略部分逻辑代码... }
-
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"); }
-
能运行但是不赞同
- mapper.xml文件内存在大量单表增删改查sql语句
- 很多mapper方法使用map作为返回值类型
个人观点:既然使用了MyBatis-Plus,单表的增删改查就别再写sql语句了,直接通过Wrapper就能组装出语句;针对复杂统计方法可以考虑使用map接收返回值,但是大多数情况下还是建议使用实体类接收返回值。