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

在先技术和参考文档

不适用