次のコードブロックがあります。
if (x > 5)
{
if (!DateTime.TryParse(y, out z))
break;
if (w.CompareTo(z) == -1)
break;
}
x は整数、y は文字列、z と w は DateTime 変数です。その理由は、break;
ブロック全体がループ内にあるためです。
これを単純化して読みやすくする方法はありますか?
次のコードブロックがあります。
if (x > 5)
{
if (!DateTime.TryParse(y, out z))
break;
if (w.CompareTo(z) == -1)
break;
}
x は整数、y は文字列、z と w は DateTime 変数です。その理由は、break;
ブロック全体がループ内にあるためです。
これを単純化して読みやすくする方法はありますか?
コードを実行するために複数のブロックは必要ありませんif
。ループを実行するか、ループを実行しないか (if と else) の 2 つのうちの 1 つだけを実行するためです。ここに示すように、単一のブール式を使用して、そのループの反復をスキップするかどうかを表すことができます。
(x > 5) && (!DateTime.TryParse(y, out z) || w.CompareTo(z) == -1)
そうは言っても、このような複雑な条件をループ内に含めると、可読性が損なわれる可能性があります。個人的には、ループが次のようになるように、この条件をメソッドに抽出するだけです。
while(!done) // or whatever the while loop condition is
{
if(itemIsValid(x, y, w, out z))
{
//the rest of your loop
}
}
//it may make sense for x, y, w, and possibly z to be wrapped in an object, or that already may be the case. Consider modifying as appropriate.
//if any of the variables are instance fields they could also be omitted as parameters
//also don't add z as an out parameter if it's not used outside of this function; I included it because I wasn't sure if it was needed elsewhere
private bool itemIsValid(int x, string y, DateTime w, out DateTime z)
{
return (x > 5)
&& (!DateTime.TryParse(y, out z) || w.CompareTo(z) == -1)
}
これにはいくつかの利点があります。まず、コメントを必要とせずにコードを自己文書化する方法です。ループを見ると、「私が終わっていない間に、アイテムが有効な場合は、このすべてを実行してください」と読むことができます。有効性がどのように定義されているかに興味がある場合は、メソッドを調べてください。そうでない場合はスキップしてください。メソッドの名前を「isReservationSlotFree」など、より具体的なものに変更することも、これが実際に表しているものに変更することもできます。
検証ロジックが複雑な場合 (これは多少複雑です)、より複雑なループを乱雑にすることなく、コメントや説明を追加できます。
「簡略化」とは、読みやすいという意味ではありません。
次の方法で、コードを読みやすくする (そして、さまざまなコーディング ルールに関してより安全にする) ことができます。
1) if ステートメントなどには常に角かっこを使用する
2) 「!」の使用を避ける (「== false」の方がより明確です)
3) それらの変数が何であるかを明示する変数名を使用します。
4) 複数の break ステートメントを避ける。代わりに、while の条件で評価されるフラグを使用します。
5) コードがまだ読みにくい場合: コメントを使用してください。
if (x > 5)
{
if(!DateTime.TryParse(y,out z) || w.CompareTo(z) == -1)
break;
}
2 つの条件は同じ結果になるため、1 つに結合できます。
if ((x > 5) && (!DateTime.TryParse(y, out z) || w.CompareTo(z) == -1))
break;
さらに重要: 説明的な変数名を使用w, x, y, z
してください (うまくいけば、これらの名前は単なる例です):
の代わりに、小なりまたは大なり演算子を使用することもできますCompareTo
。
if (x > 5)
{
bool isValidDate = DateTime.TryParse(y, out z);
if (!isValidDate || z > w)
{
// comment like: stop processing if the current date
// is after the reference date, or if there was a parsing error
break;
}
}
これがもう1つのバージョンです。
var Break = x > 5 ? ((!DateTime.TryParse(y, out z) || w.CompareTo(z) == -1) ? true : false) : false;
短いが可読性を妨げる。
if ( x > 5 ){
if (!DateTime.TryParse(y, out z) || w.CompareTo(z) == -1) break;
}