怎么重构这个方法?

时间:2015-04-06 10:06:14

标签: java

有一种给定的方法。我们怎样才能重构呢?

public void foo(Factor o){
    if(o.matches(constant1)){
          method1(); 
    }else if(o.matches(constant2)){
          method2(); 
    }
    }else if(o.matches(constant3)){
          method3(); 
    }
    ....
}

2 个答案:

答案 0 :(得分:2)

这就是所谓的代码气味。您可能希望使用所谓的“命令模式”,这是一种重构此代码的设计模式。现在在移动设备上,当我今天到达我的办公桌时会更新一个例子。

编辑:我们走了。

因此命令模式是用于此确切方案的设计模式。您首先需要创建一个命令接口。

public interface MyCommand {
    public void execute();
}

大。接下来,创建包含所有方法数据的Command对象。

public class Method1Command implements MyCommand {
    public MyVariable var;

    public Method1Command(<your arguments to create method>)
    {
        // instantiate your command
    }

    public void execute()
    {
        // what your current method1() is;
    }
}

然后你只需在Main中创建一些私有类来创建所有命令的HashMap,并以“ConstantX”的值键入。

private static Map<String, MyCommand> getMyCommands()
{
    Map<String, MyCommand> commandList = new HashMap<String, MyCommand>();
    MyCommand c;

    c = new Method1Command();
    commandList.put("constant1", c);

    c = new Method2Command();
    commandList.put("constant2", c);

    c = new Method3Command();
    commandList.put("constant3", c);

    return commandList();
}

然后,在重构方法中,您只需执行以下操作:

public void foo(Factor o)
{
    cl.get(o).execute();
}

然而,这假设o在其中有某种toString方法,或者如果你在o中有一些用来获取命令的方法,它将是这样的:cl.get(o.getMyCommand()).execute();

答案 1 :(得分:1)

您可以创建一个包含常量的数组,并且Map包含常量字符串对(String是方法的名称),使用反射并执行以下操作:

public void foo(Factor o) {
    for(int i = 0; i < constans.length; i++) {
        if(o.matches(constant)) {
            Method method = 
               YourClass.class.getMethod(myMap.get(constant), null);

            method.invoke(null);
        }
    }
}