您当前的位置:首页 > 电脑百科 > 程序开发 > 编程百科

软件如何优雅地向前兼容?

时间:2020-10-16 10:45:11  来源:  作者:

大家好,我是Z哥。

应该有不少程序员受过这样的困扰,特别是做后端的。项目一直在持续不断的迭代,但是呢老版本的代码还不能直接删掉,因为不一定所有的调用端都能在同一时间点完成升级。

你是怎么处理这种情况的呢?

方法上增加参数?方法实现里增加if else?

论难度的话,这个问题是不难,肯定每个人都有办法解决。但是解决的是否优雅?是否会给后续带来更大的成本?有这考虑的人可能就不多了。

 

我看到过一些项目里做兼容的方法是真的粗暴,直接怼if else。

比如,原本创建一笔交易的时候,我们需要的数据是用户的姓名、收货地址、邮编。现在迭代的一个新版本需要增加手机号信息,并且不需要邮编了。

粗暴的写法怎么写呢?

if(postData != null ){

if(postData.mobile != null){

//新版本的处理方式

}

else{

//旧版本的处理方式

}

}

如果以后再新加了一个参数呢?if else再多嵌套一层……

你见过类似上面那样的代码吗?

这可能是最容易想到的改法,但针对向前兼容不仅仅只有这一种方式。容我一个个来说。

 

/01 通过接口上增加版本号/

最常用的增加版本号的方式是直接加到接口上。比如,

http://api.xxx.com/1/user/login

如果后续的改动完全是新业务的追加,那么可以继续沿用这个1版本的接口。如果有做删减,那么可以新增一个版本2的接口,调整后的业务逻辑在这个版本的接口里实现。

http://api.xxx.com/2/user/login

这样一来,你的项目中就同时存在了两个版本的接口。新的客户端调用2版本的,老的客户端调用1版本的。

在这个期间,让客户端尽快都升级到2版本,然后后续就把1版本的接口删掉。

 

有的人有代码洁癖,觉得一个项目里同时存在两个相同业务逻辑的接口不太舒服,那么可以试试下面这个方法。

 

/02 一个前端版本对应一个后端版本/

与上面的区别就是,在项目的代码里,你不用新增加一个接口出来,直接把原先的接口修改成新的业务逻辑即可。

但是呢,新版本上线的时候,老版本不能被全部替换掉,需要保留一段时间给旧版本的客户端使用。这件事的逻辑与前面一样,给客户端一段时间来升级。

 

其实所谓的「服务发现」或者说「服务治理」就是这类思想的体现,只是玩的更加体系化。

在服务发现的服务端,针对不同的服务本身就有版本的概念,比如:

OrderService/v1 : 192.168.0.1:8000 , 192.168.0.1:8001

OrderService/v2 : 192.168.0.1:8100 , 192.168.0.1:8101

UserService/v1 : 192.168.0.1:9000 , 192.168.0.1:9001

UserService/v2 : 192.168.0.1:9100 , 192.168.0.1:9101

……

客户端调用的时候,根据其传入的版本号,自动路由到对应版本的服务目标地址。

 

当然这个方案有一个问题是,由于产生环境同时运行着多个版本的程序,所以数据库的字段只能增加,不能删除,并且增加的字段需要给上默认值。

删除字段只能随着后续旧版本的去除进行。

 

除了以上两种方案外,我们还可以做一些其他的工作以保障向前兼容更好地进行。

 

/01 数据库设计预留扩展字段/

我们在设计数据表的时候,如果对后续业务预判会扩展。那么可以在做数据表设计的时候预留几个扩展字段(ext1,ext2,ext3,……)。

这样的话配合上面提到的方案2能更好地进行,因为后续新增的字段可以暂时存在这些扩展字段里,不需要对表结构作出变更。

 

/02 App提供强制更新功能/

如果是针对APP的向前兼容,那么务必在APP里留出一个强制更新的口子。以免有些用户长期不升级,导致你的旧版本迟迟无法去除。

针对你可以承受的多版本情况,可以给予提示性的更新提醒,由用户自行选择是否更新。如果针对少数隔了多个版本还未升级的用户,可以给出强制性的更新,让其无法继续在旧版本上操作。

强制更新也分局部更新和全量更新。现在针对局部更新的「热更新」受到了一些应用市场的限制,所以在用「热更新」之前谨慎了解对应平台的规则。

 

另外,向前兼容不可能是无止境,不丢掉一些包袱,不断的新增包袱只会让后续的维护成本不堪重负。

所以需要做好对各个版本使用情况的监控,一旦某个版本的使用量低于某个值,就应该给予强制更新的提醒。

其实类似的向前兼容问题,除了api之外,在对外提供的三方库SDK、公司内给其他项目调用的二方库SDK中,也有一样的情况。

他们的解决思路也是类似的。

 

最后我建议你多看一些知名的开源项目,从中你可以学到很多优雅的编程技巧和代码设计理念。

 

好了,总结一下。

这篇呢Z哥和你分享了软件向前兼容的一些方法。除了粗暴的if else之外,你可以尝试一下以下两种方法:

  1. 通过接口上增加版本号
  2. 一个前端版本对应一个后端版本

除此之外,以下这两件事也对做好向前兼容有很大帮助。

  1. 数据库设计预留扩展字段
  2. APP提供强制更新功能

希望对你有所帮助。

不要光顾收藏,记得用起来哦。



Tags:软件   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,如有任何标注错误或版权侵犯请与我们联系(Email:2595517585@qq.com),我们将及时更正、删除,谢谢。
▌相关推荐
说到远程控制,首先你会想到的是什么?是TeamViewer 还是向日葵?抑或是QQ远程还是anydesk?对,就在不久前,我们熟知的都是以上的产品,但是只2020年开始,一款新的远控产品ToDesk进入到我...【详细内容】
2021-12-27  Tags: 软件  点击:(1)  评论:(0)  加入收藏
手机用了一段时间后会发现,速度越来越慢,这是怎么回事儿呢?这就是我们今天要讲的内容,手机后台运行的软件过多,会直接拖慢手机速度,所以一定要定期清理手机中不必要的后台运行软件...【详细内容】
2021-12-24  Tags: 软件  点击:(6)  评论:(0)  加入收藏
MacBook上有不少像IINA、Downie等强大的神器,有像预览、文档编辑等基础软件,也有一些像快捷指令、Automator以及活动监视器等这样一些效率工具软件。 但是在大部分时候,Mac上自...【详细内容】
2021-12-23  Tags: 软件  点击:(16)  评论:(0)  加入收藏
昨日谷歌宣布,自2022年12月19日开始停止对OnHub的软件支持,OnHub路由器仍将提供Wi-Fi信号,但用户无法用谷歌Home应用程序管理它。无法更新Wi-Fi网络设置、添加额外的Wifi设备或...【详细内容】
2021-12-22  Tags: 软件  点击:(5)  评论:(0)  加入收藏
已经观察到一种新的基于JavaScript的远程访问木马(RAT)利用社会工程学传播,采用隐蔽的"无文件"技术作为其逃避检测和分析的方法。该恶意软件由Prevalyion的对抗性反情报团队(PA...【详细内容】
2021-12-17  Tags: 软件  点击:(13)  评论:(0)  加入收藏
作为一位经常出差的职场打工人,花式打车可是我们的职场必修技能! 如何能又快又实惠的打车?保证安全的同时又能保证方便快捷。 滴滴下架后,我又发现了这5个便宜又好用的打车软件...【详细内容】
2021-12-17  Tags: 软件  点击:(11)  评论:(0)  加入收藏
推荐12款不用安装就能免费用的神仙软件,每一款都是百里挑一! 一、文件存储与传输1.不限量网盘地址:https://transferkit.io/一个在线云存储网盘,它提供了不限量的云存储空间,单文...【详细内容】
2021-12-17  Tags: 软件  点击:(15)  评论:(0)  加入收藏
什么是性能调优?(what) 为什么需要性能调优?(why) 什么时候需要性能调优?(when) 什么地方需要性能调优?(where) 什么时候来进行性能调优?(who) 怎么样进行性能调优?(How) 硬件配...【详细内容】
2021-12-16  Tags: 软件  点击:(19)  评论:(0)  加入收藏
给电脑安装软件,最让人担心的就是安装到“拖家带口”的,而这样的手法正是国产软件惯用的!全家桶自动安装、软文弹窗等等,这些让我们讨厌的却是软件的直接收入来源。 那么在你安...【详细内容】
2021-12-15  Tags: 软件  点击:(18)  评论:(0)  加入收藏
手机越用越卡,后台经常提醒内存不足,相信很多朋友都有这种体验,就是我们的手机用的时间久了,手机里装满了各式各样的应用软件。这其中就有许多不常用或者干脆没用的软件,这些应用...【详细内容】
2021-12-08  Tags: 软件  点击:(14)  评论:(0)  加入收藏
▌简易百科推荐
摘 要 (OF作品展示)OF之前介绍了用python实现数据可视化、数据分析及一些小项目,但基本都是后端的知识。想要做一个好看的可视化大屏,我们还要学一些前端的知识(vue),网上有很多比...【详细内容】
2021-12-27  项目与数据管理    Tags:Vue   点击:(1)  评论:(0)  加入收藏
程序是如何被执行的  程序是如何被执行的?许多开发者可能也没法回答这个问题,大多数人更注重的是如何编写程序,却不会太注意编写好的程序是如何被运行,这并不是一个好...【详细内容】
2021-12-23  IT学习日记    Tags:程序   点击:(9)  评论:(0)  加入收藏
阅读收获✔️1. 了解单点登录实现原理✔️2. 掌握快速使用xxl-sso接入单点登录功能一、早期的多系统登录解决方案 单系统登录解决方案的核心是cookie,cookie携带会话id在浏览器...【详细内容】
2021-12-23  程序yuan    Tags:单点登录(   点击:(8)  评论:(0)  加入收藏
下载Eclipse RCP IDE如果你电脑上还没有安装Eclipse,那么请到这里下载对应版本的软件进行安装。具体的安装步骤就不在这赘述了。创建第一个标准Eclipse RCP应用(总共分为六步)1...【详细内容】
2021-12-22  阿福ChrisYuan    Tags:RCP应用   点击:(7)  评论:(0)  加入收藏
今天想简单聊一聊 Token 的 Value Capture,就是币的价值问题。首先说明啊,这个话题包含的内容非常之光,Token 的经济学设计也可以包含诸多问题,所以几乎不可能把这个问题说的清...【详细内容】
2021-12-21  唐少华TSH    Tags:Token   点击:(9)  评论:(0)  加入收藏
实现效果:假如有10条数据,分组展示,默认在当前页面展示4个,点击换一批,从第5个开始继续展示,到最后一组,再重新返回到第一组 data() { return { qList: [], //处理后...【详细内容】
2021-12-17  Mason程    Tags:VUE   点击:(14)  评论:(0)  加入收藏
什么是性能调优?(what) 为什么需要性能调优?(why) 什么时候需要性能调优?(when) 什么地方需要性能调优?(where) 什么时候来进行性能调优?(who) 怎么样进行性能调优?(How) 硬件配...【详细内容】
2021-12-16  软件测试小p    Tags:性能调优   点击:(19)  评论:(0)  加入收藏
Tasker 是一款适用于 Android 设备的高级自动化应用,它可以通过脚本让重复性的操作自动运行,提高效率。 不知道从哪里听说的抖音 app 会导致 OLED 屏幕烧屏。于是就现学现卖,自...【详细内容】
2021-12-15  ITBang    Tags:抖音防烧屏   点击:(23)  评论:(0)  加入收藏
11 月 23 日,Rust Moderation Team(审核团队)在 GitHub 上发布了辞职公告,即刻生效。根据公告,审核团队集体辞职是为了抗议 Rust 核心团队(Core team)在执行社区行为准则和标准上...【详细内容】
2021-12-15  InfoQ    Tags:Rust   点击:(24)  评论:(0)  加入收藏
一个项目的大部分API,测试用例在参数和参数值等信息会有很多相似的地方。我们可以复制API,复制用例来快速生成,然后做细微调整既可以满足我们的测试需求1.复制API:在菜单发布单...【详细内容】
2021-12-14  AutoMeter    Tags:AutoMeter   点击:(20)  评论:(0)  加入收藏
最新更新
栏目热门
栏目头条