带你读《2022技术人的百宝黑皮书》——谈一谈凑单页的那些优雅设计(9)https://developer.aliyun.com/article/1338373?groupCode=taobaotech
设计方案
- 由于可能需要计算所有勾选的商品,所以前端需要将当前所有已加载的商品数据的勾选状态告知服务端
- 超过50个勾选商品时,不再调用动态计算接口,直接用本地价格计算总价,同时降级优惠明细和凑单进度
- 前端根据后端返回结果进行合并操作,减少不必要的计算开销
整体逻辑如下:
同时针对勾选处理,我将各类获取商品信息的动作封装进领域模型中(比如已勾选品,全部品,下一页品,操作的品,方便复用,代码设计已经讲过),获取各类商品的逻辑代码如下:
勾选处理的逻辑代码如下:
8 |
|
// 勾选操作的品,加入动态计算列表,并勾选 |
9 |
|
} else if (checkedHandleMap.containsKey(v.getCartId())) { |
10 |
|
cartItemDetail.setChecked(true); |
11 |
|
cartData.addCalculateItem(cartItemDetail); |
12 |
|
// 取消勾选的品,加入动态计算列表,并去勾选 |
13 |
|
} else if (nonCheckedHandleMap.containsKey(v.getCartId())) { |
14 |
|
cartItemDetail.setChecked(false); |
15 |
|
cartData.addCalculateItem(cartItemDetail); |
16 |
|
// 勾选商品的数量修改,加入动态计算 |
17 |
|
} else if (modifyHandleMap.containsKey(v.getCartId())) { |
18 |
|
cartItemDetail.setChecked(modifyHandleMap.get(v.getCartId()).getChecked()); |
19 |
|
cartData.addCalculateItem(cartItemDetail); |
20 |
|
// 加载下一页,加入动态计算,如果是全选动作下,则将该页商品勾选 |
21 |
|
} else if (addNextItemMap.containsKey(v.getCartId())) { |
22 |
|
if (context.isAllChecked()) { |
23 |
|
cartItemDetail.setChecked(true); |
24 |
|
} |
25 |
|
cartData.addCalculateItem(cartItemDetail); |
26 |
|
// 判断是否需要将之前所有勾选的商品加入动态计算 |
27 |
|
} else if (calculateAllChecked && checkedItemMap.containsKey(v.getCartId())) { |
28 |
|
cartItemDetail.setChecked(true); |
29 |
|
cartData.addCalculateItem(cartItemDetail); |
30 |
|
} |
31 |
}); |
|
32 |
|
|
P.S. 这里可能有人会发现,这么多的if-else就觉得它是烂代码。如果 if-else 分支判断不复杂、代码不多,这并没有任何问题,毕竟 if-else 分支判断几乎是所有编程语言都会提供的语法,存在即有理由。遵循 KISS 原则,怎么简单怎么来,就是最好的设计。非得用策略模式,搞出 n 多类,反倒是一种过度设计。
带你读《2022技术人的百宝黑皮书》——谈一谈凑单页的那些优雅设计(11) https://developer.aliyun.com/article/1338369?groupCode=taobaotech