| 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 接口的长期演进提供前进的方向。 它不提供重命名方法或更改其签名,但可以作为多阶段流程的一部分使用。 它无法解决向联合添加变体的问题。
在先技术和参考文档
不适用