Является ли это плохой практикой при перегрузке метода?
У меня был такой метод, который его потребители называют:
static public void DisplayOrderComments(param1, param2, param3, param4)
Теперь я добавил перегрузку для него следующим образом:
static public void DisplayOrderComments(param1, param2, param3, param4, param5)
{
DisplayOrderComments(param1, param2, param3, param4);
param5.Foo();
}
Это плохая практика? Есть ли лучшие способы сделать это?
Ответы
Ответ 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.