RFC-0063:OrdinalRange

RFC-0063:OrdinalRange
狀態已遭拒
區域
  • FIDL
說明

在介面中新增選用的 [OrdinalRange] 屬性。如果存在,介面定義的序數必須落在宣告的範圍內。

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

拒絕原因

我們已多次討論介面的演進方式,以及如何讓介面可繼承。舉例來說,在介面上導入序數,與方法序數一起可專門用於判斷要叫用的方法。因此,我們將拒絕[OrdinalRange]提案。

不過,我們瞭解控制項繼承的需求,因為目前的模式可能會造成問題:定義的介面可能會在程式庫作者不知情的情況下遭到繼承,導致引入新方法時,繼承者會無法修復地中斷。

因此,我們將暫時導入一項規定 (直到有更好的解決方案為止),凡是需要繼承的介面都必須使用 [FragileBase] 註解。

與其他 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 程式庫會提供正向的編譯測試。

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

實作這項提案的主要缺點是,在介面之間建立繼承關係時,需要額外的儀式。不過,關於保留序數範圍的註解,其實就是一種儀式。

替代做法是繼續使用註解,非正式地保留序數範圍。

既有技術和參考資料

我們假設其他類似系統也會採取類似做法,但尚未進行相關研究。