面对复杂业务,if-else coder 如何升级?
Hollis
共 6287字,需浏览 13分钟
·
2020-09-26 14:40
从if-else说起
我经常说,我们不要做一个if-else coder。这里的if-else,不是说我们在coding的时候不能使用if-else,而是说我们不应该简陋地用if-else去实现业务的分支流程,因为这样随意的代码堆砌很容易堆出一座座“屎山”。
业务的差异性是if-else的根源。以零售通的商品业务为例。不同的处理场景,其业务逻辑实现是有差异性的。如下图所示,商品业务的差异性,主要体现在商品类型、销售方式和仓储方式的不同。
这三个维度上的差异组合起来,有 2 * 3 * 2 = 12 之多。这就是为什么在老代码中,到处可以看到 if(组合品) blabla,if(赠品) blabla,if(实仓) blabla 之类的代码。
那么,要如何消除这些讨厌的if-else呢?我们可以考虑以下两种方式:
多态扩展:利用面向对象的多态特性,实现代码的复用和扩展。
代码分离:对不同的场景,使用不同的流程代码实现。这样很清晰,但是可维护性不好。
public void checkSellable(Item item){
if (item.isNormal()){
item.isSellable();
//省略异常处理
}
else{
List
- childItems = getChildItems();
childItems.forEach(childItem -> childItem.isSellable());
//省略异常处理
}
}
public void checkSellable(Item item){
if (!item.isSellable()){
throw new BizException("商品的状态不可售,不能上架");
}
}
/**
* 1. 普通商品上架
*/
public void itemOnSale(){
checkItemStock();//检查库存
checkItemSellable();//检查可售状态
checkItemPurchaseLimit();//检查限购
checkItemFreight();//检查运费
checkItemCommission();//检查佣金
checkItemActivityConflict();//检查活动冲突
generateCspuGroupNo();//生成单品组号
publishItem();//发布商品
}
/**
* 2. 组合商品上架
*/
public void combineItemOnSale(){
checkCombineItemStock();//检查库存
checkCombineItemSellable();//检查可售状态
checkCombineItemPurchaseLimit();//检查限购
checkCombineItemFreight();//检查运费
checkCombineItemCommission();//检查佣金
checkCombineItemActivityConflict();//检查活动冲突
generateCspuGroupNo();//生成单品组号
publishCombineItem();//发布商品
}
/**
* 3. 赠品上架
*/
public void giftItemOnSale(){
checkGiftItemSellable();//检查可售状态
publishGiftItem();//发布商品
}
心力是指不将就的匠心,不妥协的决心,不满足的好奇心、以及不放弃的恒心。
脑力是指那些必要的思维能力、学习能力、思考能力、思辨能力。
之所以说“业务理解-->领域建模-->流程分解-->多维分析”是体力,是因为实现它们就像是在做填空题,只要你愿意花时间,再复杂的业务都可以按部就班的清晰起来。
往期推荐
今天开始休婚假,国庆顺便回家参加下自己的婚礼!
别再瞎搞了,处理Java异常的10个最佳实践
为什么阿里巴巴禁止使用BigDecimal的equals方法做等值比较?
直面Java第329期:哪个命令可以监控虚拟机各种运行状态信息?
深入并发第013期:拓展synchronized——锁优化
评论