我有以下代码块:
if (x > 5)
{
if (!DateTime.TryParse(y, out z))
break;
if (w.CompareTo(z) == -1)
break;
}
其中x是整数,y是字符串,z和w是DateTime变量。
break;
的原因是整个块都在一个循环中。
有没有什么方法可以简化它以便于阅读?
答案 0 :(得分:3)
你不需要需要多个if
块来执行代码,因为你只做两件事之一,执行循环或不执行循环(一个if和一个其他)。如图here所示,您可以使用单个布尔表达式来表示是否应该跳过该循环迭代。
(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 :(得分:2)
if (x > 5)
{
if(!DateTime.TryParse(y,out z) || w.CompareTo(z) == -1)
break;
}
由于两个条件具有相同的结果,因此它们可以合并为一个。
答案 2 :(得分:2)
if ((x > 5) && (!DateTime.TryParse(y, out z) || w.CompareTo(z) == -1))
break;
答案 3 :(得分:2)
'简化'并不意味着更容易阅读。
您可以通过以下方式使代码更易于阅读(并且在各种编码规则方面更加安全):
1)总是使用if语句和alikes的括号
2)避免使用'!' ('== false'更明确)
3)使用变量名来明确这些变量是什么。
4)避免多个break语句。相反,请使用在while条件下计算的标志。
5)如果你的代码仍然难以阅读:使用评论!
答案 4 :(得分:1)
更重要的是:为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;
}
}
答案 5 :(得分:1)
这是另外一个版本。
var Break = x > 5 ? ((!DateTime.TryParse(y, out z) || w.CompareTo(z) == -1) ? true : false) : false;
简短但妨碍了可读性。
答案 6 :(得分:0)
if ( x > 5 ){
if (!DateTime.TryParse(y, out z) || w.CompareTo(z) == -1) break;
}