Задать вопрос

Перегрузки методов без дублирования кода в C#?

Добрый день,
разные перегрузки метода делают почти одно и тоже в зависимости от наличия некоторых аргументов. То есть аргументов может быть 10, а может быть 8. Соответственно 2 перегрузки. Но код работы над этими аргументами на 80% совпадает. Остальное можно развести в if. Причем код не меленький - запросы к БД, вычисления, запись в БД, возврат и др. Строк на 40.
Что вы делаете в таком случае? Дублируете код для разных перегрузок? Разбиваете внутренности метода на отдельные методы и выносите их отдельно, обращаясь к ним в каждой из перегрузок? Так можно тоже наплодить длинных цепочек вызовов.

Заранее спасибо!
  • Вопрос задан
  • 1203 просмотра
Подписаться 4 Оценить Комментировать
Решения вопроса 1
Gorily
@Gorily
В случаях, когда код это позволяет, можно вынести основной функционал в один из методов (базовый для вас) и вызывать его из других перегрузок:
string GenerateText(string text)
{
 return GenerateText(text, "Без заголовка");
}

string GenerateText(string title, string text)
{
 return title + Environment.NewLine + text;
}

Можно использовать необязательные аргументы, они как раз должны хорошо подойти в случае 1-3 различающихся параметров:
string GenerateText(string title, string text = "Без заголовка")
{
 return title + Environment.NewLine + text;
 }

Никто не может запретить вам передавать вместо не используемых аргументов null и обрабатывать в коде:
string GenerateText(string title, string text)
{
 return title + Environment.NewLine + (text ?? "Без заголовка");
}

А в случае неопределённого числа однотипных аргументов используем params:
string GenerateText(string title, params string[] text)
{
 return title + Environment.NewLine + string.Join(Environment.NewLine, text);
}

Комбинируйте этот базовый набор и его должно быть вполне достаточно для аккуратного кода. И само собой, выделяйте повторяемый функционал в методы и классы для последующего повторного использования.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 3
@tex0
Что вы делаете в таком случае?...Разбиваете внутренности метода на отдельные методы и выносите их отдельно, обращаясь к ним в каждой из перегрузок?

This!
Это лучше чем дублировать код, от которого потом рябит в глазах=).
Лично я, имея длинный метод, всегда разрезаю его на подзадачи, тем самым выделяя основной функционал, а весь остальной обвес получается как частные случаи (это ещё и полезно для развития навыка классификации данных).
Ответ написан
Комментировать
DmitryITWorksMakarov
@DmitryITWorksMakarov
Выделяю общую функциональность в отдельный метод. Вызываю методы друг из друга. Еще есть значения параметров по умолчанию.
Ответ написан
Комментировать
Mrrl
@Mrrl
Заводчик кардиганов
Пишу общий метод (возможно, со слегка другим набором параметров), который вызываю из каждой из перегрузок. Впрочем, чаще удаётся обойтись вызовом второго метода из первого.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы