[英]C++ sugar syntax for if (!result) return false;
重構某些代碼時,我經常會遇到以下問題:
bool highLevelFunc foo()
{
// ...
bool result = LesserLevelFunc();
if (!result) return false;
// ... Keep having fun if we didn't return
}
有什么辦法可以使它更加性感和不那么冗長? 當然沒有任何開銷或陷阱。
我可以想到一個宏
#define FORWARD_IF_FALSE(r) if (!r) return r;
bool highLevelFunc foo()
{
// ...
FORWARD_IF_FALSE(LesserLevelFunc());
// ...
}
還有沒有更好的東西,即沒有預處理器宏?
對我來說,“可讀”代碼很性感。 我發現原始代碼比您的建議更具可讀性,因為原始代碼使用標准的C ++語法,而后者則使用了我必須查找的宏。
如果您想更加明確,可以說出if (result == false)
(或者更好的是if (false == result)
以防止可能的賦值比較錯誤),但請理解!
我認為運算符是一個合理的期望。
也就是說,沒有理由將返回值分配給臨時變量。 您可以輕松地說:
if (!LesserLevelFunc()) return false;
這對我來說很容易理解。
編輯 :您還可以考慮使用異常而不是返回值來傳達故障。 如果LesserLevelFunc()
拋出異常,則無需在highLevelFunc()
編寫任何特殊代碼即可檢查是否成功。 異常會通過調用者向上傳播到最接近的匹配catch
塊。
因為如果LesserLevelFunc
返回true,您可能會繼續,所以建議將其保持與現在的狀態非常接近:
if (!LesserLevelFunc())
return false;
首先介紹宏,這會使代碼不安全。 此外,您的宏無效。
取反運算符后的表達式應放在括號中。
#define FORWARD_IF_FALSE(r) if (!( r ) ) return r;
其次,宏調用兩次r。 有時,一個函數的兩次調用不等同於同一函數的一次調用。 例如,該函數可能具有一些副作用或在每次調用該函數時打開/關閉的內部標志。
因此,我將在不引入宏的情況下將代碼保持原樣,因為該宏不等同於原始代碼的對稱性。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.