Что было бы хорошим дизайном, чтобы избежать методов с большим количеством параметров? - PullRequest
1 голос
/ 07 января 2012

У меня небольшая проблема с дизайном. То, над чем я работаю, это перетаскивание в настольном приложении C #. Я использую древовидный элемент управления .NET и стороннюю сетку (не важно). Я использую эту операцию перетаскивания файловой системы в более чем одном месте, поэтому я создал статический класс для обработки этого. Теперь это не просто обычная файловая система. Древовидная структура представляет собой представление каталогов, а сетка содержит файлы. Сложная часть заключается в том, что существует логическая файловая система, поэтому все это также хранится в базе данных. Я объясняю все это только потому, что хотел объяснить, почему у меня проблема. Поскольку в этот момент я работаю с несколькими объектами, все мои статические методы имеют большое количество параметров. Все мои статические методы почти все используют одни и те же параметры. Могу ли я что-нибудь сделать, чтобы избежать этого?

Ответы [ 3 ]

6 голосов
/ 07 января 2012

Сократите ваши параметры, заключив эти поля в общие объекты, например,

Вместо:

void DoSomething(string first, string middle, string last);

Вы можете иметь:

void DoSomething(Name name);

Где Имя может быть представлено,

public class Name
{
   string First {get; set;}
   string Middle {get; set;}
   string Last {get; set;}
}
2 голосов
/ 07 января 2012

Как только мы доберемся до определенного числа параметров метода (3-5), мы создадим класс для хранения аргументов параметров, а затем просто передадим экземпляр этого класса в качестве аргумента.

Это особенно полезно, если у вас несколько методов с практически одинаковыми аргументами.

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

Кроме того, в качестве дополнительного преимущества это значительно упрощает передачу параметров потокам / фоновым работникам, поскольку у вас уже есть параметры в объекте класса.

1 голос
/ 07 января 2012

Здесь вы идентифицируете известный "неприятный запах", помеченный long parameter list. Описано очень хорошо на этом сайте .

Я считаю, что самое простое решение - ввести параметр объекта .

Другие упомянутые шаги рефакторинга:

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

...