【中】写个漂亮的代码二
有一张配置表,表中有一个类型字段, type 有A、B 两种
产品提出要求,当用户选择不同类型的时候出现不同的交互
- 选择 type-A的时候,页面新增两个字段 X和Y。X是个开关字段,开了之后就可以选择Y
- 选择 type-B的时候,页面隐藏这两个字段
注:即便是选择 type-A,Y也并不是必填的
这种需求大家肯定都做过,大部分人肯定和我一样在 Service层写出下面的代码
if(type == 'A') {
do something ...
}
一开始我在Controller里面加了很多的校验,比如选择了A就不能有X、Y。在Service层也写了很多的if逻辑,代码做了很多的兼容处理,虽然不复杂,但写的时候很难受,看的时候更难受
如果产品在type-A、B的时候都加上这两个字段,那处理起来就简单了,只需要在Service里面写个 handleXY的方法,在方法里统一处理
解决办法:
最终的做法就是在Controller里给默认值,当用户选择type-A的时候,X = 0, Y = 空,这样后面的逻辑就都统一了
如果后续产品要对 type-A放开X、Y字段,那只需要去掉 Controller里给默认值就好了,Service层一点都不用改动
数据库里面有一张关联关系表
t_user_course
,同时这张表里面还有一个type字段
在A场景需要返回基于type分组的 UserCourseEntity,在B场景需要返回基于type分组的 UserCourseDTO
正常情况下,我们会创建两个新的类,分别存储这两种数据结构,在不同的场景去分别构建它们,构建的过程都是先通过userId查到一批List<UserCourseEntity>
,然后再基于type去分组
public class UserCourseGroup {
final Integer userId;
private List<UserCourseEntity> registerCourses;
private List<UserCourseEntity> consumeCourses;
}
public class UserCourseMapping {
final Integer userId;
private List<UserCourseDTO> registerCourses;
private List<UserCourseDTO> consumeCourses;
}
分组构建的过程,会分别写在 UserCourseGroup 和 UserCourseMapping 中,这样就存在一个问题,当type类型再次新增一种的时候,我们需要对2个分组的方法都进行修改,很容易就忘记了修改某处
解决办法:
把两处分组合并到一处,在 UserCourseGroup 中提供一个方法进行数据转换
public UserCourseMapping toUserCourseMapping(List<UserCourseDTO> courseDTOS) {
}
注:UserCourseDTO 的数据是先从 List<UserCourseEntity>
提取 List<Integer> courseIds
,再获取 List<UserCourseDTO>