强烈推荐一个大神的人工智能的教程:http://www.captainai.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、不断实践,不断思考。