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;
    }

                 效果:

SpringBoot实战(七):替代if的优雅方案,提高程序扩展性_第1张图片

                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 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)效果:

SpringBoot实战(七):替代if的优雅方案,提高程序扩展性_第2张图片

                3、比较:

                    很显然第二种方案比第一种方案更优雅;第一种方案,扩展性就很差,如果以后再扩展其他国家,则需要增加if判断,修改代码发布程序;而第二种方案只需要增加相应的配置文件即可(如果项目连接动态的配置中心如:Apollo,springcloudconfig等,都无需重启项目)。              

        三、项目地址及代码版本

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

               2、代码版本:1.0.0-Release

             

【总结】

         1、不断思考程序的可扩展性,不然会被需求累死;

         2、不断实践,不断思考。

你可能感兴趣的:(●,编程语言,#,【Java】,SpringBoot实战)