RFC-0021:方法的软转换添加和移除

RFC-0021:方法添加和移除的软过渡
状态已接受
区域
  • FIDL
说明

我们建议声明一个新属性,以允许无论是否实现了该方法,代码都可以构建。

作者
提交日期(年-月-日)2018-10-31
审核日期(年-月-日)2018-11-01

摘要

我们建议声明一个新属性,以允许无论是否实现了该方法,代码都可以构建。

设计初衷

自从将 Fuchsia 树移至全局集成的花朵模型以来,进行破坏性更改变得非常困难。这是因为,若要在绑定中实现 FIDL 接口,开发者必须在其具体实现中完全实现 FIDL 接口中定义的一组方法。这意味着,如果在一个花瓣中向接口添加或从接口中移除方法,则全局集成将失败。

设计

我们应声明一个新属性 [Transitional="description"],用于指示绑定生成的代码无论是否实现该方法,都能成功构建。

调用过渡方法由实现定义 - 它可能会按文档所述运行,也可能永远无法完成,甚至可能导致调用方或被调用方崩溃。它不得干扰其他方法的运行,并且必须能够实现该方法。FIDL 前端编译器完全不需要更改,只需更改语言绑定即可。

C

  • 在 C 绑定中未能实现方法并不是构建时错误,因此您无需执行任何操作。

C++

  • 请勿将方法声明为纯虚函数,而应使用仅输出错误的具体基准实现来声明这些方法。

Dart

  • 请勿声明没有正文的方法,而应声明具有正文的方法,该正文会返回失败的 Future 或抛出异常(具体取决于绑定样式)。

Go

  • 过渡方法可以在新引入的结构体“InterfaceStubBase”上具有默认实现,该结构体可嵌入到实际实现结构体中,以提供向前/向后兼容性。

Rust

  • 待定

实施策略

一旦我们找到长期演进的方法,便会从 FIDL 中移除此功能。

文档和示例

向后兼容性

请参阅下文中的缺点

性能

不使用时不会影响性能。通过对 [Transitional] 方法使用动态调度(而不是更直接的调用策略),可能会导致额外的间接调用。

安全

无影响,过渡方法会快速失败。

测试

在库之前/期间/之后生成代码,以模拟使用 [Transitional] 属性添加或移除方法和事件,并确保编译成功。

缺点、替代方案和未知情况

这并不能为 FIDL 接口的长期演变提供前进方向。它不支持重命名方法或更改其签名,但可以作为多阶段流程的一部分来实现这些操作。但无法解决向联合体添加变体的问题。

在先技术和参考文档

不适用