Подтвердить что ты не робот

Является ли это плохой практикой при перегрузке метода?

У меня был такой метод, который его потребители называют:

static public void DisplayOrderComments(param1, param2, param3, param4)

Теперь я добавил перегрузку для него следующим образом:

static public void DisplayOrderComments(param1, param2, param3, param4, param5)
{
    DisplayOrderComments(param1, param2, param3, param4);
    param5.Foo();
}

Это плохая практика? Есть ли лучшие способы сделать это?

4b9b3361

Ответ 1

Это абсолютно нормально - он сохраняет код DRY и избегает ненужного дублирования.

Это не плохая практика, а практика хорошая.


Если вы используете С# 4.0 и выше (VS 2010+), вы можете использовать необязательный аргумент для своего param5 вместо перегрузка, поскольку Майки Маус упоминает в этом ответе.

Ответ 2

Хороший вопрос.

Я бы сказал, нет, это нормальная перегрузка. но я буду изменять его как таковой (всегда реализуем в одном с большинством параметров):

static public void DisplayOrderComments(param1, param2, param3, param4)
{
   DisplayOrderComments(param1, param2, param3, param4, null);
}

static public void DisplayOrderComments(param1, param2, param3, param4, param5)
{
  ... // do the work
  if(param5!=null)
     param5.Foo();
}

Ответ 3

Да, я не говорю это плохо, но если вы используете С# 4.0, я бы рекомендовал сделать последний параметр необязательным.

Вы можете прочитать все о em здесь http://msdn.microsoft.com/en-us/library/dd264739.aspx

Ответ 4

Совсем нет. Это вполне приемлемо, но есть две проблемы.

  • param5 может быть передан как Null - вы можете написать некоторый код для проверки этого условия и выполнить соответствующую задачу.
  • Это предотвратит использование дополнительных параметров позже. Но вам может это не понравиться.

Кстати, codereview.stackexchange.com может быть лучшим местом для такого рода вопросов.

Ответ 5

Это также обычная практика для упрощения использования API для интерфейса. Сохраняет небольшой интерфейс с помощью метода с несколькими параметрами, но использует несколько методов расширений (иногда с тем же именем), которые упрощают использование API без загрязняющего интерфейса:

interface ILog
{
   void Log(string message, int someNumber, float anotherParam, object moreParams);
}

public static class LogExtensions
{
   public void Log(ILog this log, message)
   {
      log.Log(message, 42, 0, null); 
   }
// more methods using ILog.Log like LogFormat that takes format string...
}

Ответ 6

Я бы сказал, что это зависит от того, что делают DisplayOrderComments и param5.Foo(). Если он имеет param.Foo() для параметров с 1 по 4, то абсолютно, если это не так, вы делаете что-то дополнительное, что, возможно, стоит собственного имени.

Вы изменяете, что делают DisplayOrerComments или побочные эффекты, или просто условия, в которых он работает? Если вы вводите новые побочные эффекты, это может стоить того, что у него есть функция/имя, которое затем вызывает DisplayOrderComments.