最近在项目中经常遇到软件版本升级后不兼容旧版本的问题,本文根据以往经验,从软件接口设计、实现等方面整理了一些兼容性设计思路。

1. 优化设计

1)接口返回值的定义

有的人喜欢用0、1等较小的数字标记返回码或其他一些常量含义,比如我接触过几个项目,使用整型常量0作为成功的返回码,在以后的使用中,可能遇到的问题是整型的缺省值为0,这种情况下逻辑上无法区分没有返回值还是返回了0,如果某天出现了此类问题,也很隐蔽很难排查。一旦这些常量定义下来,想要修改的代价会非常大或无法修改。所以,在定义这些常量时,要尽可能的考虑到各种可能的情况,不防将数字宽度放大点,预留出扩展空间。

2)版本号处理

初始设计时,应当在消息中保留版本号字段。这样一来,当未来需要做出重大设计改变时,还可以通过引入新的版本号,来实现对旧版本的兼容。当收到消息时,首先通过版本号区分出消息的版本,按照版本号对应的效果处理,从而实现兼容。

3)客户端分类

服务端通常需要接收不同终端发过来的请求,如APP、微信、网页端、cs客户端等。设计者不得不考虑的问题是在初版本中功能、实现可能都完全一致,但是不能保证未来有些客户端需要区别对待。

有些设计者会针对不同的客户端同样的功能分开处理、实现多次的设计方式,这种方式固然清晰,相互之间不影响,但带来了代码、工作量的冗余,初版本实现需要写多份,升级修改时也需要修改多处,代码维护效率低,程序员的时间是宝贵的,并且这种方式生成的成果物也是臃肿了很多。虽然如此,也比完全不考虑调用者差异性要进步了很多。

这类问题,加上调用者的类型就能很快解决此问题了,如增加platForm参数,定义常量如“weChat”、“app”、“web”、“cs”、“others”标记就能轻松解决了,遇到需要区别对待的客户端可能以最快的方式处理。

4)新增参数

在软件开发时,不可避免的会遇到新增接口参数等问题,如果在新版本的接口中暴力的增加了必填参数,就需要所有调用此接口的老客户端都需要重新改动,新旧版本完全不兼容。

对于新增参数,设计者应处理为旧版本非必填参数,结合版本号在新版本可以设置为必填。而对于那些未设计版本号的接口,一定要非必填。

2. 优化实现

1)新增参数

在软件升级开发时,不可避免的会遇到新增接口参数等问题,对于新增参数,处理为非必填参数,可适当增加判空处理,必要时处理为缺省默认值。

如采用json传参,针对值获取,有以下几种异常情况需要注意(适用于java开发):

根据上述表格,不难总结出,判空使用json.get("param")最合适,故可参考如下代码实现:

if(StringUtils.isNotBlank(json.get("param"))) {

param= json.get("param").toString();

}else{

//默认常量

param= DEFAULT_PARAM;

}

2)参数类型发生变化

如果旧版本参数类型设计得不够合理,或者随着时间的推移,功能的升级,需要改变参数类型时,合适的代码也是有办法做到兼容的,比如:

人脸查询或布控的相似度参数,最初的设计者只要考虑到值范围为80-90(相似度80%-90%之间,传参最小相似度80,最大相似度90)这样的情景,采用整型传参,随着算法升级、应用场景更高要求等情况,出现80.5-90.5这样的应用需求,代码可这样处理,先转字符串再转换为需要的类型:

Double.parseDouble(json.get("similar").toString())

在版本升级时采用上面方式处理之后无论接口传参为整型还是浮点型都能够正常接收,实现版本兼容。

    3. 总结

本文总结了一些项目开发中的经验,提出的设计思路和实现方式都很简单,还有其它的设计思路、好的实现方式有待补充。谋事在人,关键在于设计者和开发实现者考虑问题的全面性。

优秀的软件设计会放远目光,考虑到未来的发展方向,预留扩展空间;优秀的代码是基石,就像建房子,设计稿画得再漂亮,材料劣质,也是白白耽误了设计成本。二者结合,高质量的设计,高质量的实现,必能提高效率,降低风险,避免无意义的重复劳动,事半功倍,以此共勉!




软件接口设计中的版本兼容问题处理相关推荐

  1. 【RESTful风格】软件接口设计中RESTful风格

    REST = Representational State Transfer 表述性状态转移,是一种软甲接口设计风格.总之就是一种风格 REST基于:HTTP.HTML.JSON.XML.URI 这些 ...

  2. PHP/TP5 接口设计中异常处理

    PHP提供 Exception 类来处理异常 new Exception('错误信息(默认为空)','错误代码(默认0)','异常链中前一个异常') 然后可以通过 e -> getMessage ...

  3. 接口设计中,如何封装对json格式的数据签名

    目录 一.背景介绍 二.遇到的问题 三.解决方案 1.设计一个HttpServletRequestWrapper 2.设计一个filter 四.其他辅助设计 1.定义一个注解 2.定义一个拦截器 一. ...

  4. 计算机辅助设计技术的应用研究,计算机辅助设计软件在室内设计中的应用研究...

    摘要:本文以计算机辅助设计软件的基本认识为切入点,分析计算机辅助软件所具有的作用,重点研究和讨论计算机辅助设计软件在室内设计中的应用. 关键词:计算机辅助设计软件:室内设计:应用研究 随着科学技术的不 ...

  5. 软件接口设计_基于PREEvision的AUTOSAR Adaptive设计——上篇

    AUTOSAR Adaptive概述 2003年,汽车行业的高端玩家们发起了汽车嵌入式系统软件架构标准化项目--AUTOSAR(汽车开放系统架构).2017年,为适应汽车的发展趋势(智能化.网联化等) ...

  6. 软件接口设计 六大原则

    转载自 http://www.cnblogs.com/zfc2201/p/3423370.html 一.单一职责原则 Single Responsibility Principle, 简称SRP. 定 ...

  7. 计算机软件与plc兼容,触摸屏传程序的时候显示电脑里的软件和hmi中的不兼容

    传程序的时候显示里的软件和中的不兼容,让我升级,升级后会丢失数据么? 答:不会丢失,但是为了保险起见,最好对触摸屏程序做好备份,比如如果触摸屏程序有源程序备份,就不需要上载或者prosave备份. 提 ...

  8. 软件接口设计 六大原则

    转载自 http://www.cnblogs.com/zfc2201/p/3423370.html 一.单一职责原则 Single Responsibility Principle, 简称SRP. 定 ...

  9. API 接口设计中 Token 类型的分类与设计

    在实际的网站设计中我们经常会遇到用户数据的验证和加密的问题,如果实现单点,如果保证数据准确,如何放着重放,如何防止CSRF等等 其中,在所有的服务设计中,都不可避免的涉及到Token的设计. 目前,基 ...

最新文章

  1. 深度估计相关原理(计算机视觉和深度学习基础)
  2. python 笔记 之 sqlalchemy操作数据库-创建表
  3. 五十八种网络故障及其解决办法
  4. Ehcache存储策略总结
  5. golang 结构体断言_Golang中的reflect原理
  6. iis服务器修改内存,修改IIS的虚拟内存
  7. Java 设计模式六大原则
  8. Repository(资源库)模式
  9. spring thymeleaf 自定义标签
  10. c语言输出七个换行6,多样例输出,如何去掉最后一个回车
  11. 广西计算机一级机试考试试题,2010年12月广西区计算机一级考试机试试题
  12. 学linux哪个版本号,初学Linux哪个发行版本好?这些更合适!
  13. 软件如何上传虚拟服务器,本地软件传到虚拟机上
  14. API在公司全业务快速使用给信息安全带来了巨大挑战
  15. 海康威视 0day_清华紫光原厂3D TLC颗粒初体验,海康威视C2000 PRO 2TB版体验
  16. 怎么把PDF翻译成中文?教你便捷翻译方法
  17. 解决Vue Disconnected from UI server errno: -4058, syscall: ‘scandir‘, code: ‘ENOENT‘,
  18. 设置 IDEA走easyconnect代理
  19. 自学Python第九天- 模块、包、编码、文件操作、OS 模块、打包
  20. 带音效的计算机软件,音效增强软件哪个好用?好用的音效增强软件推荐

热门文章

  1. 基于jquery仿360网站图片选项卡切换代码
  2. Google Play Store谷歌应用商店游戏数据分析
  3. android crosswalk 集成
  4. 曙光服务器型号es2630v3,06200199 16GB 2Rx4 PC3L-12800R RH5885V3 华为服务器内存
  5. spoj7258 Lexicographical Substring Search(后缀自动机)
  6. 无法访问工作组部分计算机,无法访问工作组计算机的解决方法
  7. 一个普普通通的计算机研究生找工作的感悟
  8. java校园共享单车管理系统
  9. 产品经历、运营人员必看:高效产品帮助文档撰写指南
  10. Keil MDK使用第16篇---call stack +locals 调用堆栈值