有一种给定的方法。我们怎样才能重构呢?
public void foo(Factor o){
if(o.matches(constant1)){
method1();
}else if(o.matches(constant2)){
method2();
}
}else if(o.matches(constant3)){
method3();
}
....
}
答案 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);
}
}
}