關於條件分支過多的情況,有什麼好的、比較通用的解決方案?下面這個例子來說明一下情況
//購物車中的一個商品$data = [];//判斷是否上架if(){ //判斷庫存是否足夠 if() { //判斷是否有優惠活動 if() { //有優惠活動 if() { if() { //計算活動庫存是否足夠 } else { //不夠活動庫存 } } else { //不寫了,這麼多分支,足夠說明情況了 } } else { //無優惠活動 if() { //vip計算, if() { //金卡-100 } else if() { //銀卡-200 } else { //普卡-50 } } else { //普通會員,按商品原價計算 } } }}
回複內容:
關於條件分支過多的情況,有什麼好的、比較通用的解決方案?下面這個例子來說明一下情況
//購物車中的一個商品$data = [];//判斷是否上架if(){ //判斷庫存是否足夠 if() { //判斷是否有優惠活動 if() { //有優惠活動 if() { if() { //計算活動庫存是否足夠 } else { //不夠活動庫存 } } else { //不寫了,這麼多分支,足夠說明情況了 } } else { //無優惠活動 if() { //vip計算, if() { //金卡-100 } else if() { //銀卡-200 } else { //普卡-50 } } else { //普通會員,按商品原價計算 } } }}
早返回:把否定的/能返回的分支提前
例子
//BAD://判斷是否上架if(){ //判斷庫存是否足夠 if() { xxx }}//GOOD:if(!上架) { return 報錯(沒上架!);}if(!庫存足夠) { return 報錯(沒庫存!);}xxx
抽取方法
//BAD: //判斷是否有優惠活動if(){ //有優惠活動 if() { if() { //計算活動庫存是否足夠 } else { //不夠活動庫存 } } else { //不寫了,這麼多分支,足夠說明情況了 }}//GOODprice = 計算優惠(user, item)function 計算優惠(user, item) { if(優惠 = 擷取優惠(user, item)) { return 優惠.計算價格(item.price); } if(VIP = 擷取VIP會員(user)) { return VIP.打折(item) } return item.price;}
職責鏈
就說電商活動的情境,優惠疊加/互斥,積分啊什麼的需求可能複雜到抽方法也理不清楚,這時候可能就要把結構再理清楚一點
每種改變價格/增減積分的方法都實現成職責鏈的一環串起來就好,每一環都有許可權執行自己的邏輯,對價格進行修改,跳過其他環節等等
1.使用衛術句,提前return。
2.使用數組或字典,避免分支
3.使用設計模式