3

ベストプラクティスは何か、または少なくとも過負荷についてより標準的なものは何なのだろうか。私はC#3.5を使用しているので、オプションのパラメーターはありません。次の方法があるとしましょう:

Foo(string param1, string param2)
{
    SqlConnection connection = SM.Program.GetConnection();
    SqlCommand command = connection.CreateCommand();

    command.CommandText = "UPDATE Table" +
                          "SET Pla = @pla " +
                          "WHERE Foo = @foo";

    try
    {
        command.Parameters.AddWithValue("@pla", param1);
        command.Parameters.AddWithValue("@foo", param2);
        connection.Open();
        command.ExecuteNonQuery();
    }
    finally
    {
        connection.Dispose();
        command.Dispose();
    }
}

そして、別のパラメーターを使用したオーバーロードが必要であること、たとえば sqltransaction としましょう

Foo(string param1, string param2, SqlTransaction trans)

2番目の方法は基本的に同じですが、トランザクションで操作を行います

今、私は何をすべきか疑問に思っていますか?null引数をトランザクションとして受け入れるメソッドは1つだけで、その場合は1つまたは2つのメソッドを使用せず、トランザクションを除いてコードをかなりコピー/ペーストしますか?

そのようなことのベストプラクティスと考えられるものは何ですか?

編集:一般的な考え方は、オーバーロード間のチェーンを行うように思われると思います。しかし、その場合、メソッドでnull引数を受け入れないのは一種の悪いことなのだろうか?

4

3 に答える 3

15

DRY の原則に従い、コードをコピーして貼り付けてはなりません。

したがって、このような 2 つのメソッドがある場合は、常に何らかの連鎖が必要です。

public void Foo(string param1, param2) {
       Foo(param1, param2, null);
}

public void Foo(string param1, string param2, SqlTransaction trans) {
      //do stuff, handle null value for trans
}

デフォルトパラメータに関する更新

オーバーロードの代わりに 1 つのメソッドでデフォルト パラメータを提供することは、状況によっては、特にライブラリを作成する場合に、悪い習慣と見なされる可能性があります。

//assembly1.dll
public void Foo(int a, int b, int c = 3) { ... }

//assembly2.dll
void Bar() {
     Foo(1,2);
}

何が起こるかというと、コンパイラが呼び出しFoo(1,2)を に置き換えますFoo(1,2,3)

ここで、デフォルトcを 4 に変更し、assembly2.dll を変更せずに assembly1.dll を更新するとします。

呼び出すことを期待しますFoo(1,2,4)が、実際にFoo(1,2,3)はまだ呼び出されます。これは、既定値が呼び出し元の場所に格納されているためです。

オーバーロードを使用することにより、既定値3はそれが属する assembly1.dll に格納されます。

于 2013-06-27T12:06:03.240 に答える
1

nullオーバーロードは、いくつかの引数を渡すよりも明確だと思います。私は次のように実装します:

Foo(string param1, string param2)
{
    Foo("param", "param", null);
}

Foo(string param1, string param2, SqlTransaction trans)
{
    //Do stuff...
}

この方法では、コードをコピーして貼り付ける必要はありません。

于 2013-06-27T12:06:31.230 に答える
0

関数が x 個の引数を取るとします。関数が 1 つだけのx if else場合、特定の引数値が null かどうかを確認する必要があります。

メソッドのオーバーロードは、よりクリーンで読みやすくなっています。

于 2013-06-27T12:08:51.580 に答える