SpringBoot實戰(七):替代if的優雅方案,提高程序擴展性

強烈推薦一個大神的人工智能的教程:http://www.captainbed.net/zhanghan

【前言】

        最近業務由一個國家擴展到多個國家,維護的通知平臺也要進行相應的擴展;在擴展的時候應用一個技巧使得程序的擴展性大大提高;

【if的優雅替代方案】

         一、業務需求

                在此以通知平臺中短信業務中的校驗手機號前綴爲例;

                1、一個國家(比如:中國),校驗手機號是否合法的規則:以86開頭爲合法;

                2、業務擴展增加一個國家(比如:美國),校驗手機號是否合法的規則:

                    (1)國家編碼爲中國:以86開頭爲合法;

                    (2)國家編碼爲美國:以1開頭爲合法;

                3、如果再增加其他國家則需要再擴充;

         二、實現方案

                1、第一種實現方案:首先想到的是if判斷就ok;相應的代碼:

 @RequestMapping(value = "/bad/check/mobile", method = RequestMethod.POST)
    public Map badCheckMobile(@RequestBody MobileCheckRequest mobileCheckRequest) {

        String countryCode = mobileCheckRequest.getCountryCode();

        String proFix;
        if (countryCode.equals("CN")) {
            proFix = "86";
        } else if (countryCode.equals("US")) {
            proFix = "1";
        } else {
            return buildFailResponse();
        }

        String mobile = mobileCheckRequest.getMobile();

        Boolean isLegal = false;
        if (mobile.startsWith(proFix)) {
            isLegal = true;
        }


        Map map = new HashMap();
        map.put("code", 0);
        map.put("mobile", mobile);
        map.put("isLegal", isLegal);
        map.put("proFix", proFix);
        return map;
    }

    private Map buildFailResponse() {
        Map map = new HashMap();
        map.put("code", 1);
        map.put("mobile", "");
        map.put("isLegal", false);
        map.put("proFix", "");
        return map;
    }

                 效果:

                2、第二種方案:更優雅的實現方式:

                  (1)在配置文件中增加配置

mobile.prefixs[CN]=86
mobile.prefixs[US]=1

                  (2)增加讀取配置的類

package com.zhanghan.zhboot.properties;

import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Configuration;

import java.util.HashMap;
import java.util.Map;

@Configuration
@ConfigurationProperties(prefix = "mobile")
@Data
public class MobilePreFixProperties {

    // 查詢國家所有主體 url
    private Map<String, String> prefixs = new HashMap<>();

}

                  (3)相應的代碼

    @Autowired
    private MobilePreFixProperties mobilePreFixProperties;

    @RequestMapping(value = "/good/check/mobile", method = RequestMethod.POST)
    public Map goodCheckMobile(@RequestBody MobileCheckRequest mobileCheckRequest) {

        String countryCode = mobileCheckRequest.getCountryCode();
        String proFix = mobilePreFixProperties.getPrefixs().get(countryCode);

        if (StringUtils.isNullOrEmpty(proFix)) {
            return buildFailResponse();
        }

        String mobile = mobileCheckRequest.getMobile();

        Boolean isLegal = false;
        if (mobile.startsWith(proFix)) {
            isLegal = true;
        }


        Map map = new HashMap();
        map.put("code", 0);
        map.put("mobile", mobile);
        map.put("isLegal", isLegal);
        map.put("proFix", proFix);
        return map;
    }

                  (4)效果:

                3、比較:

                    很顯然第二種方案比第一種方案更優雅;第一種方案,擴展性就很差,如果以後再擴展其他國家,則需要增加if判斷,修改代碼發佈程序;而第二種方案只需要增加相應的配置文件即可(如果項目連接動態的配置中心如:Apollo,springcloudconfig等,都無需重啓項目)。              

        三、項目地址及代碼版本

               1、地址:https://github.com/dangnianchuntian/springboot

               2、代碼版本:1.0.0-Release

             

【總結】

         1、不斷思考程序的可擴展性,不然會被需求累死;

         2、不斷實踐,不斷思考。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章