矩阵运算代码的最佳实践

时间:2013-04-01 10:45:54

标签: c# if-statement

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

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

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;
            }
        }
    }
}

3 个答案:

答案 0 :(得分: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;
}

答案 1 :(得分:1)

你是对的,return语句在那一点停止执行函数,并且不会执行for循环。

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

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

答案 2 :(得分:0)

  

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

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