9條消除if...else的錦囊妙計,助你寫出更優雅的程式碼
阿新 • • 發佈:2021-01-04
### 前言
最近在做程式碼重構,發現了很多程式碼的爛味道。其他的不多說,今天主要說說那些又臭又長的if...else要如何重構。
在介紹更更優雅的程式設計之前,讓我們一起回顧一下,不好的if...else程式碼
### 一、又臭又長的if...else
廢話不多說,先看看下面的程式碼。
```
public interface IPay {
void pay();
}
@Service
public class AliaPay implements IPay {
@Override
public void pay() {
System.out.println("===發起支付寶支付===");
}
}
@Service
public class WeixinPay implements IPay {
@Override
public void pay() {
System.out.println("===發起微信支付===");
}
}
@Service
public class JingDongPay implements IPay {
@Override
public void pay() {
System.out.println("===發起京東支付===");
}
}
@Service
public class PayService {
@Autowired
private AliaPay aliaPay;
@Autowired
private WeixinPay weixinPay;
@Autowired
private JingDongPay jingDongPay;
public void toPay(String code) {
if ("alia".equals(code)) {
aliaPay.pay();
} else if ("weixin".equals(code)) {
weixinPay.pay();
} else if ("jingdong".equals(code)) {
jingDongPay.pay();
} else {
System.out.println("找不到支付方式");
}
}
}
```
PayService類的toPay方法主要是為了發起支付,根據不同的code,決定呼叫用不同的支付類(比如:aliaPay)的pay方法進行支付。
這段程式碼有什麼問題呢?也許有些人就是這麼幹的。
試想一下,如果支付方式越來越多,比如:又加了百度支付、美團支付、銀聯支付等等,就需要改toPay方法的程式碼,增加新的else...if判斷,判斷多了就會導致邏輯越來越多?
很明顯,這裡違法了設計模式六大原則的:開閉原則 和 單一職責原則。
> 開閉原則:對擴充套件開放,對修改關閉。就是說增加新功能要儘量少改動已有程式碼。
> 單一職責原則:顧名思義,要求邏輯儘量單一,不要太複雜,便於複用。
那有什麼辦法可以解決這個問題呢?
### 二、消除if...else的錦囊妙計
#### 1、使用註解
程式碼中之所以要用code判斷使用哪個支付類,是因為code和支付類沒有一個繫結關係,如果繫結關係存在了,就可以不用判斷了。
我們先定義一個註解。
```
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
public @interface PayCode {
String value();
String name();
}
```
在所有的支付類上都加上該註解
```
@PayCode(value = "alia", name = "支付寶支付")
@Service
public class AliaPay implements IPay {
@Override
public void pay() {
System.out.println("===發起支付寶支付===");
}
}
@PayCode(value = "weixin", name = "微信支付")
@Service
public class WeixinPay implements IPay {
@Override
public void pay() {
System.out.println("===發起微信支付===");
}
}
@PayCode(value = "jingdong", name = "京東支付")
@Service
public class JingDongPay implements IPay {
@Override
public void pay() {
System.out.println("===發起京東支付===");
}
}
```
然後增加最關鍵的類:
```
@Service
public class PayService2 implements Application