我想重构一个几乎有5000行的现有类,但我在构造函数方面遇到了困难。现在它有点像以下(这里的方法实际上是10-30个代码块)
public MyClass( MyObject o ) {
if ( o.name.equalsIgnoreCase("a") ) {
doSomething()
} else {
doSomethingElse()
}
commonCode()
if (o.name.equalsIgnoreCase("a") ) {
doSecondThing()
} else {
doOtherSecondThing() //almost identical to doSecondThing but with some extra steps that absolutely have to be done in this sequence
}
// more of the same
}
我考虑过使用继承并将其分解为函数,这些函数在必要时会被覆盖,但这对我来说很混乱。有适合这种用例的模式吗?顺便说一句,任何关于重构遗留代码的建议都是非常受欢迎的。
你说得很对。如您所描述的重构称为用多态性替换条件性。此外,您还可以查看责任链、指挥或战略设计模式。
如果每个对象都遵循以下模式:
if(conditionA)
DoA();
else
DoElse();
Common();
if(conditionA2)
DoA2();
else if(conditionB2)
DoB2();
else
DoElse2();
Common2();
我建议您使用一个公共类来收集具有条件的处理程序。这大致就是我的意思(伪代码而非java):
public interface IConditionalHandler
{
bool Condition();
void Action();
}
public class ActionHandler
{
private List<IConditionalHandler> m_FirstHandlers;
private List<IConditionalHandler> m_SecondHandlers; //Or possibly use a list of lists
public ActionHandler()
{
m_FirstHandlers = new ArrayList<>();
m_FirstHandlers.add(new HandlerA1());
m_FirstHandlers.add(new HandlerB1());
m_SecondHandlers = new ArrayList<>();
m_SecondHandlers.add(new HandlerA1());
m_SecondHandlers.add(new HandlerB1());
}
void DoStuff()
{
for(IConditionHandler handler : m_FirstHandlers)
{
if(handler.Condition())
{
handler.Action();
break;
}
}
CommonA();
for(IConditionHandler handler : m_SecondHandlers)
{
if(handler.Condition())
{
handler.Action();
break;
}
}
}
}
如果您有很多段,那么列表列表可以包含作为出口处理程序的公共代码,并包含所有逻辑。您将逻辑委托给实现类,并缩短类中的实际代码。然而,就效率而言,您将同时杀死指令和数据缓存。如果这不是你想要的,那么很可能是:责任链模式-维基百科