我想请求帮助和一些建议如何重构我收到的源代码。 这是我的方法的伪代码:
public void generalMethod(String type) {
InputParameters params = new InputParameters();
if (type.equals("someKey1"){
decodeSomeKey1(params);
} else if (type.equals("someKey2"){
decodeSomeKey2(params);
} else if (type.equals("someKey3"){
decodeSomeKey3(params);
} else if (type.equals("someKey4"){
etc...
}
}
}
所有方法都具有相同的输入参数。在第一步中,我创建了新的接口,并为每个方法创建了单独的类,它实现了创建的接口。
interface ISomeInterfaceDecoder {
void decode(InputParameters params);
}
class DecodeSomeKey1 implements ISomeInterfaceDecoder {
@Override
public void decode(InputParameters params) {
// some implementation
}
}
class DecodeSomeKey2 implements ISomeInterfaceDecoder {
@Override
public void decode(InputParameters params) {
// some implementation
}
}
然后我按如下方式创建了工厂类:
班级工厂{
ISomeInterfaceDecoder getDecoder(String type) {
if (type.equals("someKey1"){
return new DecodeSomeKey1();
} else if (type.equals("someKey2"){
return new DecodeSomeKey2();
} else if (type.equals("someKey3"){
return new DecodeSomeKey3());
} else if (type.equals("someKey3"){
etc...
}
}
}
}
在这些更改之后,代码如下所示:
class SomeClass {
Factory factory = new Factory();
public void generalMethod(String type) {
InputParameters params = new InputParameters();
ISomeInterfaceDecoder decoder = factory.getDecoder(type);
decoder.decode(params);
}
}
这种方法的代码看起来更好但是...... 非常经常调用此方法。每次创建给定类的新实例时。这可能会导致性能问题。所以,我认为这不是解决这个问题的好办法。 你能给我一些建议我应该如何重构这段代码吗? 在此先感谢您的帮助。
答案 0 :(得分:2)
不要将键作为String,而是将其作为枚举。然后在枚举中你可以像这样实现decode()方法:
public enum MyKeyEnum {
VALUE1 {
public void decode(InputParameters ip) {
// do specific decoding for VALUE1
}
},
VALUE2 {
public void decode(InputParameters ip) {
// do specific decoding for VALUE2
}
}
...
;
public abstract void decode(InputParameters ip);
}
现在在调用代码中你可以这样做:
public void generalMethod(MyKeyEnum type) {
InputParameters params = new InputParameters();
type.decode(params);
}
优点是所有的解码方法都是1枚,你不需要每个解码器的特定类。此外,当一个新值添加到枚举时,您不能忘记实现解码方法(或者它不会编译)。
答案 1 :(得分:1)
你能给我一些建议我应该如何重构这段代码吗?
我没有提到自动化回归测试,这是我迈出的第一步,在进一步推进测试套件之前(通过JUnit或TestNG)。
之后,我可能会向Map
个对象引入String
Decoder
个密钥。
但是先将测试框架放在首位。否则你永远不会真正知道你是否引入了错误或不同的操作模式。
答案 2 :(得分:0)
在工厂中引入缓存/单例,只返回一次算法。另外,让你的工厂成为单身人士。
创建一个静态Map<String, ISomeInterfaceDecoder>
,您可以将标识符映射到执行调用的算法,这意味着没有工厂类,也没有算法实例化。如果您有无状态算法,则仅适用。