2009-06-26 2 views
3

Хорошо, поэтому я разрабатываю класс здесь, и у меня есть два варианта. Я могу либо написать несколько методов, либо один метод, который принимает слово 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, они не так уж плохо, потому что код довольно многие вызовы внутренние методы, так что это только то, что видно пользователю для их выбора.

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

+0

Не могли бы вы привести более конкретный пример для вашего примера - особенно характер опций и DoStuff? По крайней мере, это дает догадки дать вам лучший ответ. –

ответ

0

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

0

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

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

3

Это был только я, или я действительно чувствую запах Command design pattern здесь?

+0

+1 Я тоже поднял этот запах. – Gishu

2

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

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

Update: Если этот класс не делает фактическую работу и более экспедитора/делегатов работают на правый объект, то я хотел бы посмотреть на реализацию Command Design Pattern, как кто-то справедливо указал здесь.

0

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

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

Существует множество инструментов, которые помогут вам решить, что вам нужно для решения вашей проблемы.Design patterns, anti-patterns и, возможно, books on refactoring могут помочь в решении некоторых проблемных задач.

0

Во втором случае, если 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

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

Смежные вопросы