强烈推荐一个大神的人工智能的教程: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 {// 查询国家所有主体 urlprivate Map<String, String> prefixs = new HashMap<>();}

(3)相应的代码

    @Autowiredprivate 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、不断实践,不断思考。

SpringBoot实战(七):替代if的优雅方案,提高程序扩展性相关推荐

  1. Python爬虫实战(七):某讯较真辟谣小程序爬虫

    追风赶月莫停留,平芜尽处是春山. 文章目录 追风赶月莫停留,平芜尽处是春山. 一.准备工作 二.目标分析 二.接口分析 url分析 返回数据分析 三.编写代码 获取数据 保存数据 完整代码 大四考研狗 ...

  2. Redis由浅到深层次讲解和springboot实战(服务器层面的搭建部署)

    Redis由深层次讲解到springboot实战 一.Nosql概述 为什么使用Nosql 1.单机Mysql时代 90年代,一个网站的访问量一般不会太大,单个数据库完全够用.随着用户增多,网站出现以 ...

  3. SpringBoot 实战 (八) | 使用 Spring Data JPA 访问 Mysql 数据库

    微信公众号:一个优秀的废人 如有问题或建议,请后台留言,我会尽力解决你的问题. 前言 如题,今天介绍 Spring Data JPA 的使用. 什么是 Spring Data JPA 在介绍 Spri ...

  4. JWT认证原理、整合springboot实战应用

    JWT认证原理.整合springboot实战应用 1.什么是JWT 2.JWT能做什么 3.与传统的session认证做对比 4.JWT结构 5.JWT的封装方法 1.什么是JWT JWT(Json ...

  5. springboot springmvc mybatis_深圳嘉华学校之springboot实战教程

    Springboot实战教程 目录 第一章 springBoot概述... 2 href="https://zhuanlan.zhihu.com/write#_Toc508178432&qu ...

  6. SpringBoot实战:设备唯一ID生成【雪花算法、分布式应用】

    目录 SpringBoot实战:设备唯一ID生成[雪花算法.分布式应用] 背景: snowflake(雪花算法)方案: 实现: 雪花算法生成ID: 二维码打包: 多线程优化-批量插入: 二维码识别+扫 ...

  7. SpringBoot实战(十七):Redis Pipeline 轻松实现百倍性能提升(续)

    前言 最近在做业务的时候,需要批量操作Redis,虽然Redis的速度非常快,但是for循环操作Redis还是会有问题,在之前的基础上又对批量操作Redis进行了汇总: 批量操作Redis: 批量Se ...

  8. SpringBoot实战之整合WebSocket之群聊

    SpringBoot实战之整合WebSocket 文章目录 SpringBoot实战之整合WebSocket 前言 一.WebSocket简介 二.WebSocket原理 三.WebSocket特点 ...

  9. SpringBoot 实战 (九) | 整合 Mybatis

    微信公众号:一个优秀的废人 如有问题或建议,请后台留言,我会尽力解决你的问题. 前言 如题,今天介绍 SpringBoot 与 Mybatis 的整合以及 Mybatis 的使用,本文通过注解的形式实 ...

最新文章

  1. iOS项目开发过程中的目录结构(转)
  2. OA中项目关系,实体设计,映射实体,增删改查
  3. node内存配置(--max-old-space-size)
  4. flask 模板 php,Flask四之模板
  5. 编程珠玑读书笔记之磁盘文件排序
  6. Swiper(Swiper master)是目前应用较广泛的移动端网页触摸内容滑动js插件
  7. 安卓APP破解利器之FRIDA
  8. java x锁_基于Java名称的锁?
  9. spring-boot-starter家族成员简介
  10. code vs 集成tfs_10大Python集成开发环境和代码编辑器
  11. linux 多线程学习
  12. TracKit-Ocean:目标跟踪网络(一) -- 环境部署及测试
  13. label之间展示间距_工法样板如何做?碧桂园质量工法样板展示区做法标准
  14. SPSS单因素方差分析流程 分析某因素对试验结果是否有显著影响
  15. 油猴Tampermonkey安装使用教程
  16. python中字符串前的 u, r/R, b的含义
  17. 电脑开机遇到二维码怎么办?
  18. mysql_assoc函数_关于PHP的函数mysql_fetch_assoc的问题
  19. gui界面文本输入存入mysql中_把“文本框输入的内容”全部变成“********”,然后存入数据库,如何做到?...
  20. Oracle 11g使用Net Configuration Assistant工具配置监听程序

热门文章

  1. 阿里每天纳税超 1.4 亿元;余承东:苹果很难和华为竞争;三星 Note 7 爆炸案终审 | 极客头条...
  2. 披着 Chromium 皮的微软 Edge 浏览器到底长什么样?
  3. 程序员如何帮助公司快速上市、获得分红?
  4. 谷歌跟风推微信小程序;中兴解禁后首获订单;Yahoo Messenger正式关闭 | 极客头条...
  5. 一人编程累,加班何人陪?1024 最好的礼物给最牛掰的你
  6. python 图形模块_Python图形模块
  7. 第 18 章 访问者模式
  8. 云服务器选ssd还是hdd_云服务器区域怎么选?
  9. gson和json-lib的区别
  10. python asyncio tcp转发_asyncio不通过tcp发送整个图像数据