在项目中透明地引入特性开关

在前几期的InfoQ专栏中刊登了一篇名为“使用功能开关更好地实现持续部署”的文章,文中讲解了 特性开关与Spring的集成应用。但如果项目没有依赖Spring,又该如何更好地使用特性开关呢?同时, 又该如何透明地引入,使得项目不至于完全依赖特性开关呢?

接下来我将结合我们在项目中实 际运用特性开关的经验,从另一个角度为大家介绍如何使用特性开关透明地实现功能屏蔽。

问 题

我们的团队正在开发一款在线保险产品,该产品下包括若干品牌,每个品牌有不同的目标用 户群,但提供的服务基本相同。当第一个品牌正式上线后,我们就面临一个很大挑战——既要修正上线 后发现的Bug,又要继续为其它品牌添加新特性,且这些特性暂时不能反映到已上线的品牌中。我们并 不愿意为这种多品牌开发的业务创建分支版本,因为它对于版本维护而言,无疑是一场灾难。因而,我 们决定选择特性开关来解决这个问题。

若要快速地解决这一问题,我们当然可以选择 if… else… 这种简单的特性开关模型;然而,随之却会引入其它问题:

条件式特型开关会对现有的业务结构产生影响

清晰的业务逻辑,简单的代码结构是保证项目可维护性的基础。如果特性开关的添加使业务逻辑变 得复杂而不易理解,那么特性开关就在一定程度上破坏了项目的可维护性。

添加特性开关前的代码如下:

inputVehicleDetails();
createQuote();
inputPersonalDetails();
buyInsurance();

添加特性开关后:

inputVehicleDetails();
if (brandA.isActive()) {    // 条件式特性开关
    createQuote();
}
inputPersonalDetails();
buyInsurance();
  

可以看到,简单的条件分支虽然实现了特性开关——部分代码只有在满足条件时才会执行,但却破 坏了原有清晰的业务结构??

当前程序中如果已存在了某些类似特性开关的判断,条件式特性开关会造成逻辑混淆

添加特性开关前:

inputVehicleDetails();
createQuote();
if (currentBrand == brandB) {    // 原有依赖于品牌的条件判断
    inputPersonalDetails();
}
buyInsurance();
  

添加特性开关后:

inputVehicleDetails();
if (brandA.isActive()) {                // 特性开关
    createQuote();
}
if (currentBrand == brandB) {    // 原有依赖于品牌的条件判断
    inputPersonalDetails();
}
buyInsurance();
  

可以看到,新加入的条件式特性开关 brandA.isActive() 与原有业务判定逻辑 currentBrand == brashA 十分相似,很难区分,在使用过程中更是特别容易混淆。更糟的是,随着项目的不断深入,越 来越多的条件式特性开关会被放置在代码中,代码中会充满“坏味道 “,使得混淆的情况进一步恶化 !

条件式特性开关并不具有可扩展性    

条件式特性开关通常只是简单的条件判断,并不具有可扩展性。添加第一个条件判断与添加第十个 需要写同样多的代码,并且随着判断逻辑的增多,会令添加代码所用的时间和维护成本持续增加。

例如:

if (brandA.isActive()) {        // 特性开关
    inputVehicleDetails();
}
if (brandB.isActive()) {        // 特性开关
    createQuote();
}
if (brandC.isActive()) {        // 特性开关
    inputPersonalDetails();
}
if (brandD.isActive()) {        // 特性开关
    buyInsurance();
}
  

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索代码混淆
, 上线项目
, 逻辑题
, 代码
, 项目
, 开关
, 特性
, 品牌
多条件判断
高压开关特性测试仪、高压开关动特性测试仪、开关特性测试仪、三极管的开关特性、开关特性,以便于您获取更多的相关知识。

时间: 2024-11-02 18:42:37

在项目中透明地引入特性开关的相关文章

javaweb+activiti-JavaWeb项目中,如何引入Activiti引擎?

问题描述 JavaWeb项目中,如何引入Activiti引擎? 请问:JavaWeb项目中,如何引入Activiti引擎? 请问:JavaWeb项目中,如何引入Activiti引擎?

Puppet发布Blueshift项目中专门针对Docker的特性

于Ubuntu Xenial Puppet代理程序包,另一个基于简化版的Alpine. Blueshift演示了异构软件管理问题的解决方案,使用Puppet作为新软件栈的统一管理方式.Blueshift包含Puppet社区中关于如何集成Consul.CoreOS和Mesos等技术的信息.Blueshift还包含Puppet的内部工程. Puppet还提供了如何在Docker中使用Puppet的例子.目前,这些例子展示了如何在VMware Photon OS.Red Hat CentOS Atom

程序-如何在项目中引入 密钥 使项目可以用https访问?

问题描述 如何在项目中引入 密钥 使项目可以用https访问? 求助,在java web程序中,如何实现在项目中导入一个密钥来实现https通信??注意,不是在服务器配置.求大神,着急啊 解决方案 http://blog.csdn.net/huaishuming/article/details/8965597 解决方案二: openssl生成,可以你生成,你把密钥和key文件给他们.

像npm一样在Andriod项目中引入Gradle依赖

  一.前言 作为 Android 开发人员,有没有羡慕过 node.js 的导入三方库的方式,node.js 社区为开发者准备了一个快速可靠的依赖管理库.这样的依赖管理库,让 node.js 导入依赖库,非常的方便,一行代码就搞定了,npm install <library>. 为了搞定这个问题,一个国外的程序员 @cesarferreira 做了一个库来支持这样的功能 drone. Github 地址: https://github.com/cesarferreira/drone 接下来我

spring mvc-SpringMVC web项目中如何引入js,css等文件

问题描述 SpringMVC web项目中如何引入js,css等文件 在springmvc的web项目中,如何在html文件中引入本地的jscss等文件,试了很多种方法,发现路经都不对,都报404 Notfound的错.项目的目录结构:同时在springmvc-servlet.xml中添加了配置:在index.html中如此引用js: 然后每次都说找不到这个js文件. 解决方案 web项目js css静态文件缓存解决引入外部css ,js文件 解决方案二: 貌似要放在WebRoot底下新建一个文

json json-rpc 如何在项目中便宜引入Ajax框架 (Joyrock开源项目)

 Joyrock简介:      Joyrock是一个基于LGPL协议的开源项目,实现了JSON和JSON-RPC,支持微软ASP.NET框架.它方便我们读取从浏览器流向服务器的JSON对象,也方便在响应流中写入JSON对象.    Jayrock 远程方法要求写在一个ashx中,页面请求这个ashx的时候,在ProcessRequest 中根据Request对象中的参数信息,确定请求的服务器端方法名称和参数,然后进行调用,并返回结果.    博客url:http://www.cnblogs.c

jsp-为什么项目中引入本地的jquery库会报404路径错误

问题描述 为什么项目中引入本地的jquery库会报404路径错误 做项目时,jsp页面引入本地jquery库报路径404错误,为什么求指点? 解决方案 提醒一下,静态文件别放WEB-INF下面,找不到 解决方案二: 是找不到jsp页面还是jquery没加载? 解决方案三: 页面按 F12看调试工具的控制台有没有报错信息 检查一下jquery路径对不对 或者把jquery引入项目再导入 解决方案四: jquery路径不对,修改一下配置文件,修改一下页面文件中开头导入的JQUERY的路径 解决方案五

html5的特性,主要体现在项目中哪些方面?

问题描述 html5的特性,主要体现在项目中哪些方面? html5的特性,主要体现在项目中哪些方面? html5的特性,主要体现在项目中哪些方面? html5的特性,主要体现在项目中哪些方面? 解决方案 (1) websocket 和服务器连续双向通讯 (2) css3,原生2d绘图,比如制作统计图和网页游戏很方便 (3) 内置对gps.摄像头.视频.录音等支持,更简化web应用的开发,提高体验 (4) webgl 3d游戏 (5) localstorage 本地存储数据 解决方案二: html

viewpager-viewPager的包都引入到项目中了,怎么eclispse就是显示没有啊?求大神帮忙啊!

问题描述 viewPager的包都引入到项目中了,怎么eclispse就是显示没有啊?求大神帮忙啊! 解决方案 引入的包和你之前layout中用的可能不是一个版本的 解决方案二: 清理一下工程试试:菜单栏 Project - clean 解决方案三: 哈哈!不好意思是单词拼错了,真是能把人气死!