Несколько методов или параметров? - PullRequest
3 голосов
/ 26 июня 2009

Хорошо, я создаю здесь класс, и у меня есть два варианта. Я могу написать несколько методов или один метод, скажем, Enum.

Я пытаюсь найти лучший способ сделать это.

Давайте рассмотрим пример:

public class myClass
{ ...
    public void DoStuff1()
    { ... Do Stuff ... }

    public void DoStuff2()
    { ... Do Stuff ... }

    public void DoStuff3()
    { ... Do Stuff ... }
}

Хорошо, все имеет смысл, теперь альтернативный способ будет:

public class myClass
{ ...

    public Enum Option
    {
        Option1,
        Option2,
        Option3
    }

    public void DoStuff(Option option)
    { ... Do Stuff ... }
}

С точки зрения DRY они не так уж и плохи, потому что код в любом случае вызывает внутренние методы, так что пользователь может выбирать только то, что он видит.

Итак, что вы предпочитаете, почему, и есть ли какие-то рекомендации по этому поводу?

Ответы [ 7 ]

3 голосов
/ 26 июня 2009

Был ли это только я, или я на самом деле чувствую запах Шаблон проектирования команд здесь?

2 голосов
/ 26 июня 2009

Несколько методов это для меня.

  • Со стороны разработчика, мне не нужно поддерживать перечисление методов / командных кодов и регистр переключателя внутри DoStuff ()
  • Я думаю, что со стороны клиента это не имеет большого значения.

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

0 голосов
/ 26 июня 2009

Если бы методы DoStuffX () имели общую функциональность, я бы использовал перечисления. Если нет ничего общего, то я бы использовал отдельные методы, чтобы избежать stmts if-else / switch.

0 голосов
/ 26 июня 2009

Во втором случае, если DoStuff выглядит так

public void DoStuff(Option option)
{ 
  switch (option)
  {
     case Option1: /* Stuff 1 */ break;
     case Option2: /* Stuff 2 */ break;
     case Option3: /* Stuff 3 */ break;
  }
}

тогда это, вероятно, не очень хорошая идея. Но самый важный аспект: какой из них делает API лучше для других классов, использующих этот класс? Трудно сказать, так как это абстрактный пример. Если второй вариант имеет больше смысла, вы все равно можете реализовать первый метод (сделать DoStuff1..DoStuff3 закрытым или защищенным) и реализовать DoStuff как в

public void DoStuff(Option option)
{ 
  switch (option)
  {
     case Option1: DoStuff1(); break;
     case Option2: DoStuff2(); break;
     case Option3: DoStuff3(); break;
  }
}
0 голосов
/ 26 июня 2009

Вам необходимо принять во внимание назначение каждого пути выполнения. Является ли поведение вариантов 1, 2 и 3 очень похожим, изменяясь лишь незначительно? Или все три варианта различны, меняются более значимыми способами? Даже если каждая опция похожа, как лучше представить операции для этих опций? Перечисление со значениями Option1, Option2 и Option3 довольно смело.

Вы также должны спросить себя ... я остановлюсь на трех вариантах? Какова вероятность того, что в будущем понадобится более трех? Тебе понадобится еще много? Возможно, нужен более объектно-ориентированный подход.

Существует множество инструментов, которые помогут вам решить, что вам нужно для решения вашей проблемы. Шаблоны проектирования , анти-шаблоны и, вероятно, книги по рефакторингу могут помочь в поиске решения проблем.

0 голосов
/ 26 июня 2009

Я бы использовал второй параметр (т. Е. Параметры) только тогда, когда большая часть кода в методах каким-то образом связана, а параметр enum указывает лишь небольшое изменение в поведении метода. Когда опция резко изменит эффект функции, лучше использовать отдельный метод. Это делает код намного более читабельным, и в любом случае вы, вероятно, будете использовать какой-то оператор case в функции, эффективно усложняя вещи, чем они должны быть.

Я думаю, что хорошим примером использования параметров параметров является функция «GetData», в которой параметр параметров указывает только, откуда поступают данные (то есть из текущей базы данных или из архивов), но остальная механика та же самая. для обоих случаев.

0 голосов
/ 26 июня 2009

Это зависит от того, насколько похожи ваши варианты. В том смысле, что если ваш алгоритм / метод будет сильно меняться в зависимости от варианта, то лучше использовать несколько методов. Если это относительно похоже, тогда иди с перечислением.

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