簡體   English   中英

if(!result)返回false的C ++糖語法;

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM