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 程式庫會提供正面編譯測試。

缺點、替代方案和未知事項

實作這項提案的主要缺點,是需要額外的儀式來建立介面之間的繼承關係。不過,該儀式已以保留序數範圍的註解形式存在。

另一種做法是繼續使用註解,以非正式方式保留序數範圍。

既有技術與參考資料

我們假設其他類似系統也會執行類似的操作,但尚未進行相關研究。