面向向下兼容设计

209 阅读2分钟

如果一个软件是“有外部状态“的,那么设计和迭代这个软件时必须需要考虑 向下兼容,除非它只是一个玩具。

几乎所有的软件都是有外部状态的

  • Word 软件的外部状态是 .docx 文件,.docx 文件不是存储在程序代码中,而是存储在外部,不受 Word 程序控制。
  • 微信的外部状态是手机中的微信客户端,微信服务器无法控制用户在使用哪个版本。
  • 操作系统的外部状态是操作系统中的 App.
  • 纯 Web App 可能没有外部状态,因为 Web 端和服务端程序都是集中控制。

服务方和消费方

当一个软件有外部状态时,可以把自己理解为服务方,外部状态理解为消费方。

  • 服务方(自己):提供环境,处理请求,响应请求,处理数据
  • 消费方(外部):使用环境,请求服务,处理响应,提供数据

有外部状态的软件具体可分为 4 大类

  • Client-Server: 消费方是 Client, 服务方是 Server. 关系为 一对多,比如微信服务端和微信客户端。 因为一定是 server 先升级,所以 Client 直接请求即可,不需要根据 Server 的版本发请求.
  • OS (操作系统): 消费方是 App, 服务方是 OS. 比如 iOS 操作系统和 iOS App. OS 和 App 不一定谁先升级,因为 OS 和 App 都是去中心化的。
  • Tool (工具): 消费方是各种数据,比如代码,url, 文件等。服务方是处理数据的软件,比如编译器,解析器,浏览器,编辑器。消费方是死的,永远不会升级。
  • Decentralized Client-Server: 和 OS 一样,不一定谁先升级。关系为多对多

向下兼容设计原则

  • 服务方升级时,需要兼容旧版的消费方。
    • 通常实现方式是只添加新的字段不破坏旧的字段。等所有消费方升级后,再去掉旧字段。
  • 去中心化 服务方 给消费方的 sdk 升级时,sdk 要兼容旧版的自己
    • 因为用户手中的服务方可能还是旧版,比如在低版本的手机中安装高版本的微信。
  • 使用去中心化服务的 消费方,升级时也要兼容旧版服务方。
    • 因为 App 不知道运行环境(比如操作系统或浏览器)的版本。
  • 工具在创建数据或提供开放接口时,要格外谨慎,因为数据是死的,一旦创建就改不了了。
    • 为什么有些编程语言或软件会存在“经典的缺陷 ” 不修复呢?因为要兼容外部的旧代码啊。
  • 消费方服务方都可控时,可以强制消费方和服务方同步升级,这样更简单。
    • 比如公司或团队内部的系统。