【问题标题】:How to refactor recurring for loop?如何重构循环的循环?
【发布时间】:2011-11-01 20:52:22
【问题描述】:

我有一个用于许多类的 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 类

【问题讨论】:

  • 通常,您定义一个类来执行“不同的行为”并将该类的实例传递给通用函数。您可以使用显式类来做到这一点,但是有一些方法可以使用“匿名内部类”来做到这一点,这在某些方面更优雅(尽管通常更容易混淆)。当然,所有做“不同行为”的类都必须是给定类的子类或实现相同的接口,以便公共代码仅引用一个超类/接口。
  • 你的意思是a.equals(b)?除非,你真的想测试对象身份......
  • @mark Byers: do this is a method with parameter a

标签: java refactoring for-loop


【解决方案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 的类中。

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

    【讨论】:

    • 每当我听到“不同的行为”时,我都会想到 lambda、函数指针、委托、事件、信号、继续传递、策略。马上。哦等等,其中一些甚至存在于 Java 中
    • 同意,我实际上正要发布一个使用 Lambda 演算的解决方案,但我改用了策略模式。许多普通的 Joe 程序员根本不知道 Lambda 是什么。建议一些我们大多数人都可以理解的东西总是更好,而无需花几个小时去谷歌:)
    【解决方案3】:

    您可以使用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();
    

    (谓词和函数应该被很好地重构以便重用。)

    【讨论】:

      猜你喜欢
      • 2011-11-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-11-01
      • 2021-11-17
      • 2015-05-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多