Перегрузки методов и продвижение дублирования кода - PullRequest
4 голосов
/ 09 февраля 2010

Перегруженные методы имеют тенденцию поощрять привычку дублировать код между всеми методами группы методов. Например, я могу объединить строку, записать ее в файл и т. Д. Одним методом, но затем сделать то же самое в другом методе, но с добавлением дополнительного параметра (Создание перегрузки).

Сами методы могут идти в базовом классе, что сделает конкретный класс более чистым, но тогда у базового класса будет проблема (работа вокруг проблемы). Ключевое слово params кажется решением, но я могу себе представить, что если я действительно обдумаю эту идею (используя параметры, а не отдельные параметры), возникнет какая-то другая проблема.

Поэтому я единственный, кто считает, что перегрузки способствуют дублированию кода?

Спасибо

Ответы [ 4 ]

11 голосов
/ 09 февраля 2010

Обычно у меня будет фактическая реализация в перегрузке с большинством параметров, и другие перегрузки будут вызывать эту, передавая значения по умолчанию для параметров, которые не установлены.

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

3 голосов
/ 09 февраля 2010

В дополнение к вышеперечисленным опциям в новой версии c # появятся возможности параметров по умолчанию, которые по сути являются просто синтетическим сахаром для того, что предложил Уинстон.

public string WriteToFile(string file, bool overWrite = false){
}
2 голосов
/ 09 февраля 2010

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

string WriteToFile(string fileName, bool overwrite) {
   // implementation
}

string WriteToFile(string fileName) {
   WriteToFile(fileName, false);
}

Таким образом, существует только одна реализация.

1 голос
/ 09 февраля 2010

Если все перегрузки используют один и тот же код, они просто обрабатывают его немного по-разному, возможно, вам следует либо создать другую функцию, которую вызывает каждая перегрузка, либо, если одна из них является базовой, универсальной версией, то каждая из других перегрузок следует назвать универсальный.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...