RFC-0063:OrdinalRange

RFC-0063:OrdinalRange
状态已拒绝
区域
  • FIDL
说明

向接口添加了可选的 [OrdinalRange] 属性。如果存在,则接口定义的序号必须在声明的范围内。

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

拒绝理由

我们多次讨论了如何让接口不断发展,并实现可继承性。 例如,在接口上引入序号,这样一来,方法序号就可以与接口序号一起唯一确定正在调用的方法。因此,我们将拒绝此[OrdinalRange]提案。

不过,我们认识到需要控制继承,因为我们目前的模式可能会带来问题:在库作者不知情的情况下,定义的接口可能会被继承,这样一来,引入新方法就会对继承者造成无法弥补的破坏。

因此,我们将暂时引入一项要求(直到我们找到更好的解决方案):任何需要继承的接口都必须使用 [FragileBase] 进行注释。

与其他 RFC 的关系

此 RFC 已被以下 RFC 取代:

摘要

为接口添加了可选的 [OrdinalRange] 属性。 如果存在,则接口定义的序号必须在声明的范围内。 除非接口声明了 [OrdinalRange],否则无法从该接口继承;并且子接口不能使用其超接口声明的范围内的任何序号。

设计初衷

在 FIDL 中,接口可以继承自其他接口。FIDL 编译器会阻止这两个接口为同一序号分配不同的语义,但没有机制可让超级接口预留序号以供将来使用。根据目前的定义,向任何接口添加序号可能会破坏继承自该接口并分配该序号的其他(未见)接口。

FIDL 样式评分标准建议通过在注释中记录预留的序号范围来解决此问题(至少对于预期会被继承的接口是这样)。此 FTP 建议将这些预留放在接口的 [OrdinalRange] 属性中。

设计

此更改仅影响 FIDL 源语言。 它不会影响有线格式或任何生成的绑定。 实现可以完全在 FIDL 前端编译器中进行。

  1. 为接口引入了可选的 [OrdinalRange] 属性。 如果存在,此属性的值必须符合以下语法:
    1. NUMERIC-LITERAL、“-”、NUMERIC-LITERAL
  2. 如果存在,接口定义的所有序号都必须在指定范围内(含)。
  3. 除非第二个接口具有 [OrdinalRange] 属性,否则一个接口无法继承自另一个接口。
  4. 接口的所有超接口都必须具有定义不相交范围的 [OrdinalRange] 属性。
  5. 接口不能定义属于其任何超接口的 [OrdinalRange] 的序号。

如果违反了上述任何不变量,FIDL 前端必须生成错误。

FIDL 样式评分标准中建议使用注释来实现此目的的段落替换为要求使用 [OrdinalRange] 属性来实现此目的的段落。

文档和示例

此功能将在 FIDL 样式评分标准中进行说明(并提供示例)。

向后兼容性

此功能不向后兼容,因为在我们将 [OrdinalRange] 属性添加到超接口之前,对继承的现有使用将无法编译。不过,我们很少使用继承,因此更新所有超接口会很容易。

性能

此提案对性能没有影响。

安全

此提案对安全性没有影响。

测试

fuchsia.io 库将提供正面的编译测试结果。

缺点、替代方案和未知因素

实现此提案的主要缺点是,在接口之间创建继承关系时需要额外的仪式。不过,这种仪式已经存在,以有关预留序号范围的注释的形式存在。

另一种方法是继续使用注释来非正式地预留序号范围。

在先技术和参考资料

我们假设其他类似系统也会执行类似操作,但并未对此进行研究。