RFC-0021:方法添加和移除的软过渡 | |
---|---|
状态 | 已接受 |
区域 |
|
说明 | 我们建议声明一个新属性,以允许无论是否实现了该方法,代码都可以构建。 |
作者 | |
提交日期(年-月-日) | 2018-10-31 |
审核日期(年-月-日) | 2018-11-01 |
摘要
我们建议声明一个新属性,以允许无论是否实现了该方法,代码都可以构建。
设计初衷
自从将 Fuchsia 树移至全局集成的花朵模型以来,进行破坏性更改变得非常困难。这是因为,若要在绑定中实现 FIDL 接口,开发者必须在其具体实现中完全实现 FIDL 接口中定义的一组方法。这意味着,如果在一个花瓣中向接口添加或从接口中移除方法,则全局集成将失败。
设计
我们应声明一个新属性 [Transitional="description"]
,用于指示绑定生成的代码无论是否实现该方法,都能成功构建。
调用过渡方法由实现定义 - 它可能会按文档所述运行,也可能永远无法完成,甚至可能导致调用方或被调用方崩溃。它不得干扰其他方法的运行,并且必须能够实现该方法。FIDL 前端编译器完全不需要更改,只需更改语言绑定即可。
C
- 在 C 绑定中未能实现方法并不是构建时错误,因此您无需执行任何操作。
C++
- 请勿将方法声明为纯虚函数,而应使用仅输出错误的具体基准实现来声明这些方法。
Dart
- 请勿声明没有正文的方法,而应声明具有正文的方法,该正文会返回失败的 Future 或抛出异常(具体取决于绑定样式)。
Go
- 过渡方法可以在新引入的结构体“InterfaceStubBase”上具有默认实现,该结构体可嵌入到实际实现结构体中,以提供向前/向后兼容性。
Rust
- 待定
实施策略
一旦我们找到长期演进的方法,便会从 FIDL 中移除此功能。
文档和示例
向后兼容性
请参阅下文中的缺点。
性能
不使用时不会影响性能。通过对 [Transitional]
方法使用动态调度(而不是更直接的调用策略),可能会导致额外的间接调用。
安全
无影响,过渡方法会快速失败。
测试
在库之前/期间/之后生成代码,以模拟使用 [Transitional]
属性添加或移除方法和事件,并确保编译成功。
缺点、替代方案和未知情况
这并不能为 FIDL 接口的长期演变提供前进方向。它不支持重命名方法或更改其签名,但可以作为多阶段流程的一部分来实现这些操作。但无法解决向联合体添加变体的问题。
在先技术和参考文档
不适用