程式碼優化之延長調用鏈減少括弧嵌套
- 2020 年 8 月 10 日
- 筆記
程式碼優化之延長調用鏈減少括弧嵌套
案例方法://從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(queryListUserByParam3(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.getParam3())) {// 過濾參數篩選成功 加入結果集 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.getParam3())) {// 過濾參數篩選成功 加入結果集 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個新的方法 在主要方法里加三處調用即可。簡單明了,初級程式設計師也能看得明明白白,並且還能繼續維護下去。