What is the best practice concerning overload

Refresh

December 2018

Views

1.8k time

3

I wonder what is the best practice or at least what is more standar about overload. I'm using c# 3.5 so I don't have optional parameter. Let say I have the following method :

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

And that I need an overload with another parameter, let say an sqltransaction

Foo(string param1, string param2, SqlTransaction trans)

The second method would basically be the same but it would do the operation in a transaction

Now I'm wondering what should I do? Only 1 method that accep a null argurment as the transaction and in that case don't use any or 2 methods but pretty mutch copy/paste the code in except for the transaction?

What is considered the best practice for that kind of thing?

EDIT : I think the general idea seem to do the chaining between overload. But I still wonder in that case isn't accepting null argument in a method is a kind of bad thing?

3 answers

0

давайте предположим , что функция принимать аргументы х. С помощью всего лишь одной функции , то вы будете нуждаться , x if elseчтобы проверить , что делать , если конкретное значение аргумента равно нулю или нет.

Метод перегрузка более значительно чиста и читаемая.

1

Я думаю , что перегрузка яснее , чем прохождение nullдля некоторых аргументов. Я бы реализовать это следующим образом :

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

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

Таким образом, вы не должны копировать код.

12

Судя по СУХОЙ принципе , вы никогда не должны копировать-вставить код.

Поэтому, имея два способа, как это, вы должны всегда иметь какое-то цепочку.

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
}

Обновление относительно параметров по умолчанию

Поставляя параметр по умолчанию с помощью одного метода вместо перегрузки можно считать плохой практику в некоторых ситуациях, особенно при написании библиотеки:

//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).

Теперь предположим, что мы хотим изменить значение по умолчанию для c4 и обновления assembly1.dll без изменения assembly2.dll.

Мы ожидали бы назвать , Foo(1,2,4)но на самом деле, Foo(1,2,3)все еще употребляется, так как значение по умолчанию хранится в месте вызывающего абонента!

При использовании перегрузок, значение по умолчанию 3сохраняются в assembly1.dll, где она принадлежит.

Bas