0

以下は、行列の操作を実行するために使用しているクラスに含まれていた関数です。関数はブール値を返します。最初の IF ステートメントが 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;
            }
        }
    }
}
4

3 に答える 3

2

このような「アーリー リターン」ロジックは非常に一般的であり、メソッドの残りの部分を「else」でインデントしないのが普通です。これは、「早期返品」にのみ適用される傾向があり、これらはすべてメソッドの先頭に次々と配置されます。

厳密に言えば、メソッドを 2 つに分割し、読みやすくするために少し再編成することができます (もちろん、これは主観的なステートメントです!)。

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 ステートメントを使用しないことは悪いスタイルだとは思いませんが、条件が失敗した場合にのみループが実行されることがより明確になったかもしれません。

このコードで私が気に入っているのは、ブレーク ロジックが分離されていることです。技術的にif(this.IsSquareMatrix()){ <loop> }; return false;は同等でしたが、これは再帰関数であるため、ブレーク条件が明確に示され、さらにインデント レベルが 1 つ少なくなります :)

于 2013-04-01T10:54:59.230 に答える
0

したがって、この値を返すと、すでに値を返しているため、関数の残りの部分は実行されないと思います

それは正しいです。実際、Resharper などの IDE 生産性アドインを使用すると、過度のネスト (コードの臭いにつながる可能性があります) を防ぐために、この方法でコードを構造化するように求められます。

于 2013-04-01T10:56:05.710 に答える