如何重构循环?

时间:2011-11-01 20:52:23

标签: java refactoring for-loop

我有一个for循环,它在很多类中使用,但for循环中的任务是不同的。例如,Class Foo使用以下

for(Pojoclass a : listofPojo){
    if(a.getX().equals(b)){
        methos(a.getX());
    }
 }

和类Bar使用以下内容:

for(Pojoclass a : listofpojo){
    if(a.getX().equals(x)){
        methos(a.getX());
    } // or some other logic
 }

我在我的项目中发现了许多这样的循环,它们迭代相同的对象但做了不同的行为。我如何重新考虑这个因素?

编辑:我没有处理字符串,我正在处理POJO类

3 个答案:

答案 0 :(得分:3)

你没有重构这种东西 - 它已经很好又整洁。

重构旨在替换相同的冗余(重复)代码,但只需使用不同的参数。在你的情况下,代码是不同的,所以你不能(也不应该)重构代码。

例如,如果您反复将字节数组转换为十六进制字符串,则应该创建一个函数,而不是在任何地方重复相同的代码。

答案 1 :(得分:2)

你实际上有解决方案:)每当我听到'不同的行为'时,我会立即想到Strategy pattern! 我建议你做以下事情:

public void forLoopReplacement(IActionStrategy strategy, IList<Pojoclass> projo){
   for(Pojoclass a : listofPojo){
      strategy.doActionOn(a);
   }
}

public interface IActionStrategy {
   public void doAction(Pojoclass param);
}

您在应用程序中定义的任何新行为都可以封装在实现IActionStrategy的类中。

我希望这会有所帮助。 问候,

答案 2 :(得分:0)

您可以使用Google Guava及其filtertransform方法。首先筛选出与谓词不匹配的元素,然后将函数应用于剩余的谓词。这是一些代码,但为您提供了很大的灵活性。

Predicate<Pojoclass> predicate = new Predicate<Pojoclass>() {
    public boolean apply(Pojoclass a) {
        return a.getX().equals(b);
    }
};

Function<Pojoclass, Void> function = new Function<Pojoclass, Void>() {
    public Void apply(Pojoclass p) {
        methos(p.getX());
        return null;
    }
};

Collections2.transform(Collections2.filter(listofPojo, predicate), function).toArray();

(对于重复使用,谓词和函数应该很好地重构。)