1

我有以下代码块:

if (x > 5)
{
    if (!DateTime.TryParse(y, out z))
        break;
    if (w.CompareTo(z) == -1)
        break;
}

其中 x 是整数,y 是字符串,z 和 w 是 DateTime 变量。的原因break;是整个块驻留在循环中。

有什么方法可以简化它以使其更易于阅读?

4

7 回答 7

3

不需要multilpeif块来执行代码,因为您只做两件事之一,执行循环或不执行循环(一个 if 和一个 else)。如此处所示您可以使用单个布尔表达式来表示是否应该跳过该循环迭代。

(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”或它实际代表的任何名称。

如果您的验证逻辑很复杂(这有点复杂),它允许您添加注释和解释,而不会弄乱更复杂的循环。

于 2012-09-27T19:10:55.150 回答
2
if (x > 5)
{
    if(!DateTime.TryParse(y,out z) || w.CompareTo(z) == -1)
        break;
}

由于两个条件句具有相同的结果,因此可以将它们合并为一个。

于 2012-09-27T17:42:11.340 回答
2
if ((x > 5) && (!DateTime.TryParse(y, out z) || w.CompareTo(z) == -1))
    break;
于 2012-09-27T17:42:51.713 回答
2

“简化”并不意味着更容易阅读。

您可以通过以下方式使您的代码更易于阅读(并且在各种编码规则方面更安全):

1) 总是对 if 语句和类似语句使用括号

2)避免使用'!' ('== false' 更加明确)

3) 使用明确这些变量是什么的变量名。

4)避免多个break语句。相反,请使用在 while 条件中评估的标志。

5)如果您的代码仍然难以阅读:使用注释!

于 2012-09-27T18:14:32.057 回答
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;
    }
}
于 2012-09-27T18:03:07.733 回答
1

这是另一个版本。

var Break = x > 5 ? ((!DateTime.TryParse(y, out z) || w.CompareTo(z) == -1) ? true : false) : false;

简短但妨碍了可读性。

于 2012-09-27T18:40:38.783 回答
0
if ( x > 5 ){
    if (!DateTime.TryParse(y, out z) || w.CompareTo(z) == -1) break;
}
于 2012-09-27T17:54:07.887 回答