強烈推薦一個大神的人工智能的教程: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、不斷實踐,不斷思考。