1. 程式人生 > >9條消除if...else的錦囊妙計,助你寫出更優雅的程式碼

9條消除if...else的錦囊妙計,助你寫出更優雅的程式碼

### 前言 最近在做程式碼重構,發現了很多程式碼的爛味道。其他的不多說,今天主要說說那些又臭又長的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