0

下面是一个包含在我用来对矩阵执行操作的类中的函数。该函数返回一个布尔值,第一个 IF 语句如果 NOT TRUE,它返回一个 false 值,所以我假设一旦它返回这个值,函数的其余部分就不会执行,因为它已经返回了一个值。

如果我编写了该函数,我会将 FOR 循环包含在附加到原始 IF 语句的 ELSE 构造中。我不是专业程序员,所以如果答案很明显,我深表歉意,我只是不会以这种方式编写代码,而且我很好奇以这种方式编写的所有函数是否值得更改。

public bool IsIdentityMatrix()
{
    if (!this.IsSquareMatrix())
    {
        return false;
    }

    for (int i = 0; i < this.RowCount; i++)
    {
        for (int j = 0; j < this.ColumnCount; j++)
        {
            decimal checkValue = 0;
            if (i == j)
            {
                checkValue = 1;
            }

            if (mInnerMatrix[i, j] != checkValue)
            {
                return false;
            }
        }
    }
}
4

3 回答 3

2

像这样的“提前返回”逻辑很常见,在“else”中不缩进方法的其余部分是很正常的。这确实往往只适用于“早期回报”,它应该一个接一个地位于方法的顶部。

严格来说,该方法可以分成两部分并稍微重新组织以使其更具可读性(这当然是主观陈述!):

public bool IsIdentityMatrix()
{
    if (IsSquareMatrix())
        return checkSquareMatrixForIdentity();
    else
        return false;
}

private bool checkSquareMatrixForIdentity()
{
    for (int i = 0; i < this.RowCount; i++)
    {
        for (int j = 0; j < this.ColumnCount; j++)
        {
            decimal checkValue = 0;
            if (i == j)
            {
                checkValue = 1;
            }

            if (mInnerMatrix[i, j] != checkValue)
            {
                return false;
            }
        }
    }

    return true;
}
于 2013-04-01T11:01:15.690 回答
1

您当然是对的,return 语句在该点停止执行函数,并且不会执行 for 循环。

我不会认为不使用 else 语句是不好的风格,但它可能更清楚地表明只有在条件失败时才会执行循环。

我喜欢代码的地方在于它将中断逻辑与它分开。从技术上讲,anif(this.IsSquareMatrix()){ <loop> }; return false;是等价的,但由于这是一个递归函数,因此清楚地表示了中断条件,而且还少了一个缩进级别 :)

于 2013-04-01T10:54:59.230 回答
0

所以我假设一旦它返回这个值,函数的其余部分就不会执行,因为它已经返回了一个值

那是对的。事实上,当您使用像 Resharper 这样的 IDE 生产力插件时,它会提示您以这种方式构建代码以防止过度嵌套(这会导致代码异味)。

于 2013-04-01T10:56:05.710 回答