ifのelseとして特別なケースのコードがないという事実を覆い隠すので、私はあなたがアンチパターンと呼ぶ "explicit else"プラクティスを呼び出します。
読みやすさ/保守性は一般に、必要なコードフロー構造だけがほとんどなく、それらを最小限にすると改善されます。つまり、elseが冗長であり、関数全体にスコープが追加されるifを使用すると、関数の追跡と維持が困難になります。
たとえば、次の関数があるとします。
public void ConfigureOblogon(Oblogon oblogonToConfigure)
{
if (_validColors.Contains(oblogonToConfigure.Color))
{
oblogonToConfigure.ColorIndex = _validColors.IndexOf(oblogonToConfigure.Color);
}
else
{
oblogonToConfigure.Color = _validColors[0];
oblogonToConfigure.ColorIndex = 0;
}
}
要件は、構成時にoblogonのタイプ/タイプインデックスも指定する必要があるということです。誰かがそのコードを配置して、無効なコードで終わる可能性がある複数のスコープがあります。
public void ConfigureOblogon(Oblogon oblogonToConfigure)
{
if (!_validOblogons.Contains(oblogonToConfigure.Type))
{
oblogonToConfigure.Type = _validOblogons[0];
oblogonToConfigure.TypeIndex = 0;
if (_validColors.Contains(oblogonToConfigure.Color))
{
oblogonToConfigure.ColorIndex = _validColors.IndexOf(oblogonToConfigure.Color);
}
else
{
oblogonToConfigure.Color = _validColors[0];
oblogonToConfigure.ColorIndex = 0;
}
}
else
{
oblogonToConfigure.TypeIndex = _validOblogons.IndexOf(oblogonToConfigure.Type);
}
}
これを、元のコードが必要最小限の制御フロー構成で作成され、そのときに最小化された構成と比較してください。
public void ConfigureOblogon(Oblogon oblogonToConfigure)
{
if (!_validColors.Contains(oblogonToConfigure.Color))
{
oblogonToConfigure.Color = _validColors[0];
}
oblogonToConfigure.ColorIndex = _validColors.IndexOf(oblogonToConfigure.Color);
}
誤ったスコープに誤って何かを入れたり、スコープを肥大化させたりして、この機能の長期的な成長と維持の重複を引き起こすことは、はるかに困難になります。加えて、この関数を通過する可能性のあるフローが明らかであるため、読みやすさが向上します。
私は知っています、例は少し工夫されていますが、私は何度も見ました
SomeFunction()
{
if (isvalid)
{
/* ENTIRE FUNCTION */
}
/* Nothing should go here but something does on accident, and an invalid scenario is created. */
}
したがって、制御フロー構造に関するこれらのルールを形式化すると、人々がそのようなコードを書き始めたときに何かを嗅ぐために必要な直感を開発するのに役立つと思います。それから彼らは書き始めます。
SomeFunction()
{
if (!isvalid)
{
/* Nothing should go here, and it's so small no one will likely accidentally put something here */
return;
}
/* ENTIRE FUNCTION */
}
else
は偽物に思えます。多くの場合、else
後ろに曲がらない限り、ブロックに入れるものはありません。