Рефакторинг нескольких операторов switch с более элегантным кодом - PullRequest
3 голосов
/ 31 мая 2011

В моем приложении мне приходится выполнять много задач на основе значения переменной ( m_iIndex ) во многих моих методах.Для достижения этого я использую операторы переключения регистра в большинстве моих методов

Например:

MathMethod()
{
   switch(m_iIndex)
   {
    case 0 : CallAddition(); break; 
    case 1 : CallSubtraction(); break;
    case 2 : CallMultiplication(); break;
    case 3 : CallDivision(); break;
   }
}


StrangeMethod()
{
   switch(m_iIndex)
   {
    case 0 : CallStrange(10,"John"); break; 
    case 1 : CallStrange(20,"Paul"); break;
    case 2 : CallStrange(30,"Kurt"); break;
    case 3 : CallStrange(40,"Mark"); break;
   }
}

Это продолжается еще для 10 методов.Мне было интересно, есть ли способ сделать этот код более элегантным и коротким, сократив операторы регистра переключателей во всех моих методах.

Ответы [ 2 ]

2 голосов
/ 31 мая 2011

Предположим, что ваши методы MathMethod() и StrangeMethod(), а также член m_iIndex являются частью класса YourClass.Попробуйте устранить m_iIndex;вместо этого используйте подклассы YourClass, где MathMethod и StrangeMethod являются виртуальными и переопределите в ваших подклассах.

Здесь вы найдете более сложный ответ.

2 голосов
/ 31 мая 2011

Попробуйте использовать полиморфизм и создайте класс для каждой операции. Это называется Шаблон команды .

Я могу только догадываться о том, как вы установили m_iIndex, но следующий пример демонстрирует, что я имею в виду:

abstract class Operation
{
    abstract void Execute();
}

class Addition : Operation
{
    public override void Execute()
    {
      // ...
    }
}

// same for Subtraction etc.

void OnAdditionButtonClicked(...)
{
    // Instead of setting m_iIndex to 0, use this instead:
    _operation = new Addition();
}

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

...