我有一个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类
答案 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及其filter
和transform
方法。首先筛选出与谓词不匹配的元素,然后将函数应用于剩余的谓词。这是一些代码,但为您提供了很大的灵活性。
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();
(对于重复使用,谓词和函数应该很好地重构。)