我如何重构重复代码?

时间:2016-04-06 06:59:09

标签: java loops refactoring

为糟糕的头衔道歉,但我真的不能想到这个有用的标题。

我会在这里直截了当地说:

setName(); // set the name field
validate(); // submit the form and check if form has error

setName();
setAge();
validate();

setName();
setAge();
setHeight();
validate();

setName();
setAge();
setHeight();
setGender();
validate();

// the list goes on...

我正在测试网站上的表单,表单不应该允许任何空字段,但是在提交按钮上单击我输入之前输入清除的任何字段,这就是为什么我需要像上面的代码一样重新设置前面的字段。

写这个更优雅的方式是什么?我在考虑一个循环,但后来我想不出正确的条件......

2 个答案:

答案 0 :(得分:2)

您可以为每个操作创建一个Runnable实例,并将它们放在一个列表中。

  • 在Java 8 +中:

    List<Runnable> runnables = new ArrayList<>();
    runnables.add(() -> setName());
    runnables.add(() -> setAge());
    runnables.add(() -> setHeight());
    // ... etc
    
  • 对于早期版本的Java,您可以使用匿名类:

    runnables.add(new Runnable() { @Override public void run() { setName(); } });
    // ... etc
    

然后执行Runnable

子列表中的runnables个实例
for (int i = 0; i < runnables.size(); ++i) {
  for (Runnable fn : runnables.subList(0, i + 1)) {
    fn.run();
  }
  validate();
}

Demo

答案 1 :(得分:1)

我不确定我是否完全理解你的问题(也许是一个关于工作示例的粘贴器会有所帮助),但是也许你可以为每个字段设置一个布尔值来检查字段是否已被修改,因为最后检查,然后根据这些布尔值的状态设置字段?

然后检查方法会将所有布尔值重置为false(或者实际提交更改的任何方法)。