| RFC-0063:OrdinalRange | |
|---|---|
| 狀態 | 已遭拒 |
| 區域 |
|
| 說明 | 在介面中新增選用的 [OrdinalRange] 屬性。如果存在,介面定義的序數必須落在宣告的範圍內。 |
| 作者 | |
| 提交日期 (年-月-日) | 2018-07-31 |
| 審查日期 (年-月-日) | 2018-10-04 |
拒絕原因
我們已多次討論介面的演進方式,以及如何讓介面可繼承。舉例來說,在介面上導入序數,與方法序數一起可專門用於判斷要叫用的方法。因此,我們將拒絕[OrdinalRange]提案。
不過,我們瞭解控制項繼承的需求,因為目前的模式可能會造成問題:定義的介面可能會在程式庫作者不知情的情況下遭到繼承,導致引入新方法時,繼承者會無法修復地中斷。
因此,我們將暫時導入一項規定 (直到有更好的解決方案為止),凡是需要繼承的介面都必須使用 [FragileBase] 註解。
與其他 RFC 的關係
這項 RFC 已由下列項目取代:
摘要
在介面中新增選用的 [OrdinalRange] 屬性。
如果存在,介面定義的序數必須落在宣告的範圍內。除非介面宣告 [OrdinalRange],否則無法從中繼承介面,且子介面不得使用其超級介面所聲明的範圍中的任何序數。
提振精神
在 FIDL 中,介面可以從另一個介面繼承。 FIDL 編譯器會防止兩個介面將不同的語意指派給相同的序數,但超級介面沒有機制可保留序數以供日後使用。如目前所定義,在任何介面中新增序數,可能會導致從該介面繼承並指派序數的其他 (未顯示) 介面中斷。
FIDL 樣式評量表建議在註解中記錄保留的序數範圍 (至少針對預期會從中繼承的介面),解決這個問題。這項 FTP 建議將這些預留項目放在介面上的 [OrdinalRange] 屬性中。
設計
這項變更只會影響 FIDL 來源語言。 這不會影響線路格式或任何產生的繫結。實作作業完全可以在 FIDL 前端編譯器中進行。
- 為介面導入選用的
[OrdinalRange]屬性。 如果提供這項屬性,其值必須符合下列文法:NUMERIC-LITERAL, "-",NUMERIC-LITERAL
- 如有定義,介面定義的所有序數都必須在指定範圍內 (含)。
- 除非第二個介面具有
[OrdinalRange]屬性,否則介面無法從另一個介面繼承。 - 介面的所有超級介面都必須有定義不相交範圍的屬性。
[OrdinalRange] - 介面無法定義屬於任何超級介面
[OrdinalRange]的序數。
如果違反任何這些不變量,FIDL 前端必須產生錯誤。
將 FIDL 樣式評量表中建議使用註解的段落,替換為要求使用 [OrdinalRange] 屬性的段落。
說明文件和範例
這項功能將在 FIDL 樣式評量標準中記錄 (並提供範例)。
回溯相容性
這項功能不具回溯相容性,因為現有的繼承用法會編譯失敗,直到我們將 [OrdinalRange] 屬性新增至超級介面為止。不過,我們很少使用繼承,因此更新所有超級介面會很簡單。
效能
這項提案不會影響成效。
安全性
這項提案不會影響安全性。
測試
fuchsia.io 程式庫會提供正向的編譯測試。
缺點、替代方案和未知事項
實作這項提案的主要缺點是,在介面之間建立繼承關係時,需要額外的儀式。不過,關於保留序數範圍的註解,其實就是一種儀式。
替代做法是繼續使用註解,非正式地保留序數範圍。
既有技術和參考資料
我們假設其他類似系統也會採取類似做法,但尚未進行相關研究。