1. ホーム
  2. c#

[解決済み] if文を反転させて入れ子を減らす

2022-02-27 15:25:01

質問

を実行すると ReSharper を私のコードに適用した場合、例えば

    if (some condition)
    {
        Some code...            
    }

ReSharperは上記の警告(Invert "if" statement to reduce nesting)を出し、以下の修正を提案してくれました。

   if (!some condition) return;
   Some code...

なぜその方がいいのか、理解したいです。メソッドの途中で "return" を使うのは、どこか "goto" のように問題があるとずっと思っていたのです。

どのように解決するのですか?

メソッドの途中でリターンすることは、必ずしも悪いことではありません。コードの意図が明確になるのであれば、すぐにreturnした方がよいかもしれません。例えば

double getPayAmount() {
    double result;
    if (_isDead) result = deadAmount();
    else {
        if (_isSeparated) result = separatedAmount();
        else {
            if (_isRetired) result = retiredAmount();
            else result = normalPayAmount();
        };
    }
     return result;
};

この場合、もし _isDead が真であれば、すぐにこのメソッドから抜け出すことができます。代わりにこのように構成した方がいいかもしれません。

double getPayAmount() {
    if (_isDead)      return deadAmount();
    if (_isSeparated) return separatedAmount();
    if (_isRetired)   return retiredAmount();

    return normalPayAmount();
};   

このコードは リファクタリングカタログ . この具体的なリファクタリングはというと ネストされた条件式をガード節に置き換える。