RFC-0021:適用於新增和移除方法的軟式轉換

RFC-0021:新增和移除方法的軟轉換
狀態已接受
區域
  • FIDL
說明

我們建議宣告新屬性,讓程式碼無論方法是否已實作,都能建構。

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

摘要

我們建議宣告新屬性,讓程式碼能夠建構,無論方法是否已實作都沒問題。

提振精神

自從將 Fuchsia 樹狀結構移至全球整合的「花朵」模型後,重大中斷性變更就變得...困難。 這是因為如要在繫結中實作 FIDL 介面,開發人員必須在具體實作中,實作 FIDL 介面定義的確切方法集。也就是說,如果某個方法新增至或移除自某個花瓣的介面,全域整合就會失敗。

設計

我們應宣告新的 [Transitional="description"] 屬性,指示繫結產生程式碼,無論方法是否實作,都能成功建構。

呼叫過渡方法是由實作定義,可能如文件所述運作、可能永遠不會完成,甚至可能導致呼叫端或被呼叫端當機。不得干擾其他方法的運作,且必須能夠實作該方法。FIDL 前端編譯器完全不需要變更,只需要變更語言繫結。

C

  • 在 C 繫結中無法實作方法並非建構時間錯誤,因此這裡不需要採取任何行動。

C++

  • 請改為使用具體的基本實作項目宣告方法,而非將方法宣告為純虛擬函式,因為這樣只會列印錯誤。

Dart

  • 請勿宣告沒有主體的方法,而是宣告有主體的方法,並傳回失敗的 Future 或擲回例外狀況 (視繫結樣式而定)。

查看

  • 過渡方法可以在新導入的結構體「InterfaceStubBase」上採用預設實作,並嵌入實際的實作結構體,以提供向前/向後相容性。

荒漠油廠

  • 未定

導入策略

我們制定長期演進方法後,就會從 FIDL 移除這項功能。

說明文件和範例

回溯相容性

請參閱下方的「缺點」一節。

效能

未使用時不會影響效能。 使用動態調度 [Transitional] 方法,而非更直接的呼叫策略,可能會導致額外的間接性。

安全性

沒有影響,過渡方法會快速失敗。

測試

在程式庫之前/期間/之後產生程式碼,模擬使用 [Transitional] 屬性新增或移除方法和事件,並確保編譯成功。

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

這無法為 FIDL 介面的長期演進提供前進方向。 不過,這項功能可用於多階段程序,以重新命名方法或變更簽章。但無法解決將變體新增至聯集的問題。

既有技術和參考資料

不適用