我想重构一个近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
}
我考虑过使用继承并将其分解为必要时会被覆盖的函数,但这对我来说感觉很麻烦。是否有适合此用例的模式?顺便提一下,任何关于重构遗留代码的建议都会受到欢迎。
答案 0 :(得分:2)
你是完全正确的。像你描述的重构被称为 Replace Conditional with Polymorphism。 您还可以查看Chain-of-responsibility,Command或Strategy设计模式。
答案 1 :(得分:1)
如果每个对象都遵循以下模式:
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;
}
}
}
}
如果你有很多段,列表列表可以包含你的公共代码作为退出处理程序并包含所有逻辑。您将逻辑委托给实现类,并缩短类中的实际代码。 但是,就效率而言,你将杀死指令和数据缓存。如果这不是你想要的,那么很可能是:Chain-of-Responsibility Pattern - Wikipedia