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