矩阵操作代码的最佳实践
本文关键字:最佳 代码 操作 | 更新日期: 2023-09-27 18:06:54
下面是一个函数,包含在我用来对矩阵执行操作的类中。函数返回一个布尔值,如果第一个IF语句不是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;
}
}
}
}
像这样的"Early return"逻辑非常常见,在"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;
}
当然,您是对的,return语句将在此时停止函数的执行,并且不会执行for循环。
我不认为不使用else语句是糟糕的风格,但它可能会更清楚地表明,只有在条件失败时才会执行循环。
我喜欢这段代码的地方是它将break逻辑从。从技术上讲,if(this.IsSquareMatrix()){ <loop> }; return false;
应该是等价的,但由于这是一个递归函数,因此断点条件被清楚地表示出来,并且少了一个缩进级别:)
所以我假设一旦它返回了这个值函数的其余部分就不会执行了因为它已经返回了一个值
正确。事实上,当你使用像Resharper这样的IDE生产力插件时,它会提示你以这种方式构建代码,以防止过多的嵌套(这会导致代码异味)。