RFC-0066:程式設計師警示明確的預設設定 | |
---|---|
狀態 | 已接受 |
區域 |
|
說明 | FIDL 規格未指出原始和列舉結構欄位是否具有預設值。這項調整提議我們明確指出不會這麼做。 |
作者 | |
提交日期 (年/月) | 2018-07-20 |
審查日期 (年/月) | 2019-01-14 |
摘要
FIDL 規格未說明原始和列舉結構欄位是否具有預設值。這項調整提議我們明確指出不會這麼做。
提振精神
在某些語言中,需要初始化並不容易,在其他語言中則無法這麼做。本提案讓參與者接受最低的共分母,但也針對更高級別的語言提供政策。
由於某些類型的結構中預設值不夠清楚,導致某些類型不一致。語言繫結在隱含和明確預設值的處理方式不同。請注意,可為空值類型預設為空值,陣列和向量預設為空白,而非其他類型。C++ 繫結的預設原始類型為 false、0 或 0.0,但如果 FIDL 定義中未提供預設值,就會在建構結構體時指定 Dart 繫結值。
零值通常都是很棒的預設設定,但應明確宣告。舉例來說,如果 uint32_t
代表 FTP 號碼,0 是不是有效值,但 FIDL 無法表示呼叫端應指定數字。
設計
這主要只是為了進一步說明說明文件。只會釐清 FIDL 介面中顯示的語意。開啟繫結改善機會,但不會強制要求。
FIDL 語言規格應包含下列資訊,可能以其他格式呈現:
如果結構體中的原始和列舉欄位未在 FIDL 檔案中宣告的預設值,則「必須」在繫結中執行個體化時指定這些欄位。繫結作者 MAY 可能會遵循預設值、如果主機語言允許的話,以及程式設計人員預期是否相當常見和預期該行為。舉例來說,在 Dart 或 C++ 中,經常會有預設值。但 Go 預設會初始化結構,而提供標準初始化的慣用模式則是提供 NewMyStruct() 函式。在 C 中也應該不會初始化,而程式設計師必須明確定義所有欄位。連線至 MACRO 可能較為合適。如果繫結遵循預設值,它們:必須遵循提供的所有預設值,而如果程式設計人員無法初始化非預設欄位,則「必須」回報錯誤。
說明文件與範例
語言規格和教學課程應更新以反映這項變更。
回溯相容性
但現有行為會因語言繫結而異。這項變更允許所有現有行為,並有助於改善日後的行為。
效能
沒有影響。
安全性
這不僅闡明瞭規格,也讓有心人士更難以誤用介面。這些措施有助於確保安全。
測試
不需測試。
缺點、替代方案和未知
替代做法則是正式定義:
struct Foo {
int32 bar;
bool baz;
float32 wux;
};
在語意上等同於:
struct Foo {
int32 bar = 0;
bool baz = false;
float32 wux = 0.0;
};
但如上文所述,這可能無法擷取重要的語意。
本提案的先前的疊代包含字串,但撰寫時仍可為空值,以表示這些 API 為必要或選用。
先前的圖片和參考資料
不適用