作为系统实现者,当我们从一个 FHIR 版本迁移到下一个版本时,我们面临着两难境地。我们开始使用 FHIR 0.0.81,然后于 2014 年 9 月 10 日移至 SVN 修订版 2833,以包含错误修复。按照建议,我们从 SVN 主干下载了 Java 代码,并按照FHIR 构建过程页面上的说明进行操作。
FHIR 0.0.82 不兼容性
现在 FHIR 0.0.82 可用,我们想升级到已发布的版本。然而,在下载 0.0.82 后,我们注意到主干 rev2833 中的一些资源(例如 Appointment)不在 0.0.82 版本中。这引出了我们的第一个问题:
如果主干不包含用于下一个版本的最新代码,它包含什么?
任何人都应该使用后备箱中的东西吗?
是否有从中创建 0.0.82 的发布分支?
中继不兼容
由于我们的代码依赖于trunk上引入但0.0.82不包含的资源,我们必须继续直接从SVN签出FHIR。2014 年 10 月 21 日,我们下载了 SVN 版本 3218 Java 代码。当我们将该代码集成到我们的系统中时,我们发现了许多兼容性问题。这里是其中的一些:
各种 Enum 值从小写变为大写,包括Patient.AdministrativeGender和HumanName.NameUser。尽管遵循 Java 命名约定是个好主意,但更改基本数据类型会破坏编译。
方法名称已更改,也导致编译错误。我们还发现同时发生了名称更改。例如,在HumanName类中,旧的setTextSimple(String)现在是setText(String),旧的setText(StringType)现在是setTextElement(StringType)。setText()的名称和参数类型都发生了变化,这使得迁移容易出错,因为必须在每次使用时决定是更改方法还是更改其参数。
ResourceReference资源类型已更改其类名。仅在 FHIR 模型包中,就有61 个文件中的859 个ResourceReference出现受到影响。这不包括影响其他 FHIR 包的更改,或影响我们的应用程序代码和数据库模式的更改。
我们注意到 rev3218 主干代码中有几个新资源,包括NewBundle。以前,我们建议捆绑包应该是资源,所以很高兴看到这种变化。但是,由于 trunk 不向后兼容 0.0.8x 版本,我不确定我们是否必须同时支持解析和组合 JSON 和 XML 包的新旧方式。
为了更好地说明问题,重要的是要认识到上述一些 FHIR 更改不仅会影响编译,而且很容易在运行时引入细微的错误。此外,FHIR 更改可能需要在某些应用程序中更改数据库架构和数据迁移。例如,我们的应用程序将 JSON 资源流保存在数据库中。将枚举值从“男性”更改为“男性”这样简单的事情需要更新现有数据库内容的迁移实用程序。
往前走
我们正在大力投资 FHIR;我们希望它成功并作为标准被广泛采用。为了实现这一点,需要解决向后兼容性和版本迁移的问题。徒劳无功,任何可以阐明以下问题的信息都将推动我们所有人前进:
0.0.8x 行代码的目的是什么?它的目标用户是谁?
主干代码的目的是什么?它的目标用户是谁?
是否会期望 0.0.8x 的用户迁移到主干代码库?
- 如果是这样,将使用什么迁移策略来解决代码库之间的许多不兼容问题?
每个代码库中代码的弃用政策是什么?
从修订版到修订版中的主干代码,可以预期什么级别的向后兼容性?
是否有系统开发人员可以用来规划自己的开发周期的 FHIR 路线图?
谢谢,富C