重构前一代码

时间:2014-03-06 12:33:17

标签: java refactoring

我想请求帮助和一些建议如何重构我收到的源代码。 这是我的方法的伪代码:

    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);
       }
}

这种方法的代码看起来更好但是...... 非常经常调用此方法。每次创建给定类的新实例时。这可能会导致性能问题。所以,我认为这不是解决这个问题的好办法。 你能给我一些建议我应该如何重构这段代码吗? 在此先感谢您的帮助。

3 个答案:

答案 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)

  1. 在工厂中引入缓存/单例,只返回一次算法。另外,让你的工厂成为单身人士。

  2. 创建一个静态Map<String, ISomeInterfaceDecoder>,您可以将标识符映射到执行调用的算法,这意味着没有工厂类,也没有算法实例化。如果您有无状态算法,则仅适用。