首页 > 技术文章 > 代码优化之延长调用链减少括号嵌套

happydaytome 2020-08-10 22:32 原文

代码优化之延长调用链减少括号嵌套

案例方法://从List<User>中获取符合Map参数条件的对象。    

案例概要://假设Map参数中有三个可能存在值的过滤参数  根据这三个参数去筛选List<User>中符合条件数据并返回结果集newListUser     后续可能会添加过滤参数。

// 优化前

public List<User> queryListUser(List<User> listUser, Map<String, String> params) {
List<User> newListUser = new ArrayList<User>();
for (int i = 0; i < listUser.size(); i++) {
User user = listUser.get(i);
if (params.get("param1") != null && !"".equals(params.get("param1"))) {// 如果过滤参数有效 则继续筛选数据
if (params.get("param1").equals(user.getParam1())) {// 第一个过滤参数筛选成功 继续第二个过滤参数筛选
if (params.get("param2") != null && !"".equals(params.get("param2"))) {// 如果第二个过滤参数有效 则继续筛选
if (params.get("param2").toString().equals(user.getParam2())) {// 第二个过滤参数筛选成功 继续第三个过滤参数筛选
if (params.get("param3") != null && !"".equals(params.get("param3"))) {// 第三个过滤参数有效 则继续筛选数据
if (params.get("param3").equals(user.getParam3())) {// 第三个过滤参数筛选成功 加入结果集 newListUser;
newListUser.add(user);//这里是三个过滤参数都存在 筛选后的结果集 (1) 111
}
} else { //如果第三个过滤参数无效或者不存在 则把所有符合前两个过滤参数的数据加入结果集 newListUser;
newListUser.add(user); //这里是前两个过滤参数存在 第三个过滤参数不存在的情况下 筛选后的结果集(2) 110
}
}
} else {//如果第二个过滤参数无效或者不存在 则继续用第三个过滤参数筛选数据
if (params.get("param3") != null && !"".equals(params.get("param3"))) {// 第三个过滤参数有效 则继续筛选数据
if (params.get("param3").equals(user.getParam3())) {// 第三个过滤参数筛选成功 加入结果集 newListUser;
newListUser.add(user);//这里是第一个过滤参数存在 第二个过滤参数不存在 第三个过滤参数存在的情况下 筛选后的结果集(3) 101
}
}else {//如果第三个过滤参数无效或者不存在 则把所有符合第一个过滤参数的数据加入结果集 newListUser;
newListUser.add(user);//这里是第一个过滤参数存在 第二个过滤参数不存在 第三个过滤参数不存在的情况下 筛选后的结果集(4) 100
}
}
}
} else {//如果第一个过滤参数无效 继续用第二个过滤参数和第三个过滤参数继续筛选数据
if (params.get("param2") != null && !"".equals(params.get("param2"))) {// 如果第二个过滤参数有效 则继续筛选
if (params.get("param2").toString().equals(user.getParam2())) {// 第二个过滤参数筛选成功 继续第三个过滤参数筛选
if (params.get("param3") != null && !"".equals(params.get("param3"))) {// 第三个过滤参数有效 则继续筛选数据
if (params.get("param3").equals(user.getParam3())) {// 第三个过滤参数筛选成功 加入结果集 newListUser;
newListUser.add(user);//这里是第一个过滤参数不存在 第二个过滤参数存在 第三个过滤参数存在的情况下 筛选后的结果集(5) 011
}
} else { //如果第三个过滤参数无效或者不存在 则把所有符合第二个过滤参数的数据加入结果集 newListUser;
newListUser.add(user); //这里是第一个过滤参数不存在 第二个过滤参数存在 第三个过滤参数不存在的情况下 筛选后的结果集(6) 010
}
}
} else {//如果第二个过滤参数无效或者不存在 则继续用第三个过滤参数筛选数据
if (params.get("param3") != null && !"".equals(params.get("param3"))) {// 第三个过滤参数有效 则继续筛选数据
if (params.get("param3").equals(user.getParam3())) {// 第三个过滤参数筛选成功 加入结果集 newListUser;
newListUser.add(user);//这里是第一个过滤参数不存在 第二个过滤参数不存在 第三个过滤参数存在的情况下 筛选后的结果集(7) 001
}
}else {//如果第三个过滤参数无效或者不存在 则所有过滤参数都不存在 则把所有数据加入结果集 newListUser;
newListUser.add(user);//这里是第一个过滤参数不存在 第二个过滤参数不存在 第三个过滤参数不存在的情况下 筛选后的结果集(8) 000
}
}
}
}

//通过三个过滤参数的筛选 获得最后的结果集 newListUser 返回给调用者
return newListUser;
}

//这里仅仅是用三个过滤参数值去筛选数据  情况就出现了8种  二进制的000——111   2的3次方     for循环里面嵌套了好多if-else,  各种情况都考虑到了  也都加了备注  但是这代码也太长了。

//很明显这段代码能够完成上述的要求条件去筛选出符合条件的User列表。   但是这代码可读性差,可维护性差,后续想增加一个过滤参数,改动非常大,代码嵌套深度也越来越厉害,感觉伤不起。

//如果真的要再增加一个过滤参数  情况就是二进制的0000——1111   2的4次方  16种情况了  这哪是程序员玩代码呀! 这是代码玩程序员呀!

 

 

通过延长调用链来减少括号嵌套

优化后//

public List<User> queryListUser(List<User> listUser, Map<String, String> params) {
List<User> newListUser = queryListUserByParam1(listUser,params.get("param1"));
newListUser = queryListUserByParam2(newListUser,params.get("param2"));
newListUser = queryListUserByParam3(newListUser,params.get("param3"));
//可读性比较差的链式写法queryListUserByParam3(queryListUserByParam2(queryListUserByParam1(listUser,params.get("param1")),params.get("param2")),params.get("param3"));
//通过三个过滤参数的筛选 获得最后的结果集 newListUser 返回给调用者
return newListUser;
}

public List<User> queryListUserByParam1(List<User> listUser, String param1) {
List<User> newListUser = new ArrayList<User>();
for (int i = 0; i < listUser.size(); i++) {
User user = listUser.get(i);
if (param1 != null && !"".equals(param1)) {// 过滤参数有效 则继续筛选数据
if (param1.equals(user.getParam1())) {// 过滤参数筛选成功 加入结果集 newListUser;
newListUser.add(user); //这里是过滤参数存在的情况下 筛选后的结果集
}
}else{
newListUser.add(user);
}
}
return newListUser;
}

public List<User> queryListUserByParam2(List<User> listUser, String param2) {
List<User> newListUser = new ArrayList<User>();
for (int i = 0; i < listUser.size(); i++) {
User user = listUser.get(i);
if (param2 != null && !"".equals(param2)) {// 过滤参数有效 则继续筛选数据
if (param2.equals(user.getParam2())) {// 过滤参数筛选成功 加入结果集 newListUser;
newListUser.add(user); //这里是过滤参数存在的情况下 筛选后的结果集
}
}else{
newListUser.add(user);
}
}
return newListUser;
}

public List<User> queryListUserByParam3(List<User> listUser, String param3) {
List<User> newListUser = new ArrayList<User>();
for (int i = 0; i < listUser.size(); i++) {
User user = listUser.get(i);
if (param3 != null && !"".equals(param3)) {// 过滤参数有效 则继续筛选数据
if (param3.equals(user.getParam3())) {// 过滤参数筛选成功 加入结果集 newListUser;
newListUser.add(user); //这里是过滤参数存在的情况下 筛选后的结果集
}
}else{
newListUser.add(user);
}
}
return newListUser;
}

优化后这么看来,感觉世界都清爽了 哪怕再加3个过滤参数 也不怕了 如果用优化前的方式来实现的话 情况就是2的6次方 64种情况 就需要有128层括号嵌套 就是大神来了 也得读个头晕脑花的。
而现在用优化后的方式来实现 就是增加了3个新的方法 在主要方法里加三处调用即可。简单明了,初级程序员也能看得明明白白,并且还能继续维护下去。


感觉还可以的话 麻烦给点个推荐呗

 

推荐阅读