| RFC-0021:新增和移除方法的軟轉換 | |
|---|---|
| 狀態 | 已接受 |
| 區域 |
|
| 說明 | 我們建議宣告新屬性,讓程式碼無論方法是否已實作,都能建構。 |
| 作者 | |
| 提交日期 (年-月-日) | 2018-10-31 |
| 審查日期 (年-月-日) | 2018-11-01 |
摘要
我們建議宣告新屬性,讓程式碼能夠建構,無論方法是否已實作都沒問題。
提振精神
自從將 Fuchsia 樹狀結構移至全球整合的「花朵」模型後,重大中斷性變更就變得...困難。 這是因為如要在繫結中實作 FIDL 介面,開發人員必須在具體實作中,實作 FIDL 介面定義的確切方法集。也就是說,如果某個方法新增至或移除自某個花瓣的介面,全域整合就會失敗。
設計
我們應宣告新的 [Transitional="description"] 屬性,指示繫結產生程式碼,無論方法是否實作,都能成功建構。
呼叫過渡方法是由實作定義,可能如文件所述運作、可能永遠不會完成,甚至可能導致呼叫端或被呼叫端當機。不得干擾其他方法的運作,且必須能夠實作該方法。FIDL 前端編譯器完全不需要變更,只需要變更語言繫結。
C
- 在 C 繫結中無法實作方法並非建構時間錯誤,因此這裡不需要採取任何行動。
C++
- 請改為使用具體的基本實作項目宣告方法,而非將方法宣告為純虛擬函式,因為這樣只會列印錯誤。
Dart
- 請勿宣告沒有主體的方法,而是宣告有主體的方法,並傳回失敗的 Future 或擲回例外狀況 (視繫結樣式而定)。
查看
- 過渡方法可以在新導入的結構體「InterfaceStubBase」上採用預設實作,並嵌入實際的實作結構體,以提供向前/向後相容性。
荒漠油廠
- 未定
導入策略
我們制定長期演進方法後,就會從 FIDL 移除這項功能。
說明文件和範例
回溯相容性
請參閱下方的「缺點」一節。
效能
未使用時不會影響效能。
使用動態調度 [Transitional] 方法,而非更直接的呼叫策略,可能會導致額外的間接性。
安全性
沒有影響,過渡方法會快速失敗。
測試
在程式庫之前/期間/之後產生程式碼,模擬使用 [Transitional] 屬性新增或移除方法和事件,並確保編譯成功。
缺點、替代方案和未知事項
這無法為 FIDL 介面的長期演進提供前進方向。 不過,這項功能可用於多階段程序,以重新命名方法或變更簽章。但無法解決將變體新增至聯集的問題。
既有技術和參考資料
不適用