2011-05-31 102 views
3

在我的应用程序中,我必须在许多方法中基于变量值执行许多任务(m_iIndex)。 为了实现它,我使用开关case语句中的大多数我的方法用更优雅的代码重构多个switch语句

对于前:

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种方法。我想知道是否有一种方法可以通过减少我所有方法中的switch case语句来使代码更加优雅和简短。

回答

2

尝试使用多态性并为每个操作创建一个类。这被称为Command pattern

我只能猜测你如何设置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(); 
} 

如果你提供更多的情况下,我可以改变我的例子,以更好地满足您的要求。

+0

感谢您的建议。该场景是...基于我的UI类中的菜单项选择,我使用选定的索引值来决定调用不同的方法。在我的情况下,子类化是不是引入了太多的开销? – 2011-05-31 10:36:14

+0

我不知道。这取决于你自己决定。性能开销不是问题。但是,也许它是在像你这样简单的情况下完成工程。但我绝对不会像你用开关盒那样做。您可以为每个索引创建一个类,即一个用于1,一个用于两个,每个用'MathMethod'和一个'StrangeMethod',另一个用于其他10种方法。像这样,你只有4班而不是4 * 12 = 48班。 – 2011-05-31 10:40:46

+1

对不起,我没有得到你推断48班的部分。在我的情况下,从case语句中调用的所有其他方法都驻留在同一个类中。正如你已经指出的那样,这可能是一个非常简单的案例,如我的工程 – 2011-05-31 10:47:51

2

让我们假设您的方法MathMethod()StrangeMethod()以及成员m_iIndex是类YourClass的一部分。尽量消除m_iIndex;相反,使用子类YourClass其中MathMethodStrangeMethod是虚拟的,并在您的子类中被覆盖。

Here 你会发现一个更详细的答案。