for-ifアンチパターンについてこのブログ投稿を読んでいましたが、なぜそれがアンチパターンであるのか理解できません。
foreach (string filename in Directory.GetFiles("."))
{
if (filename.Equals("desktop.ini", StringComparison.OrdinalIgnoreCase))
{
return new StreamReader(filename);
}
}
質問1:
それが理由であるreturn new StreamReader(filename);
内部for loop
?または、for
この場合ループが必要ないという事実ですか?
ブログの作者が指摘したように、これのクレイジーでないバージョンは次のとおりです:
if (File.Exists("desktop.ini"))
{
return new StreamReader("desktop.ini");
}
の作成前にファイルが削除されるとStreamReader
、を取得するため、どちらも競合状態になりますFileNotFoundException
。
質問2:
2番目の例を修正するには、ifステートメントなしで書き直し、代わりにをStreamReader
try-catchブロックで囲み、それがスローされるFileNotFoundException
場合は、それにcatch
応じてブロックで処理しますか?
To fix the second example, would you re-write it without the if statement, and instead surround the StreamReader with a try-catch block, and if it throws a FileNotFoundException you handle it in the catch block accordingly?
-はい、それはまさに私がすることです。競合状態を解決することは、「制御フローとしての例外」という概念よりも重要であり、エレガントかつクリーンに解決します。
null
ますか?通常、LINQを使用して、例のコードのようなコードをクリーンアップできます。2つのLINQ呼び出しの間の演算子にreturn Directory.GetFiles(".").FirstOrDefault(fileName => fileName.Equals("desktop.ini", StringComparison.OrdinalIgnoreCase))?.Select(fileName => new StreamReader(filename));
注意してください?.
。また、人々は、このようなオブジェクトの作成はLINQの最も適切な使用法ではないと主張するかもしれませんが、ここでは問題ないと思います。これはあなたの質問への答えではありませんが、その一部について余談です。