我将如何重构重复代码?
How would I refactor repetitive code?
为糟糕的标题道歉,但我真的想不出一个信息丰富的标题。
我会在这里直截了当:
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...
我正在网站上测试一个表单,该表单不应允许任何空字段,但是在提交按钮上单击我在清除之前输入的任何字段,这就是为什么我需要像上面的代码一样重新设置以前的字段。
什么是更优雅的写法?我在想一个循环,但后来我想不出合适的条件...
我不确定我是否完全理解你的问题(也许关于工作示例的 pastebin 会有所帮助),但是也许你可以为每个字段设置一个布尔值来检查该字段是否已被修改自上次检查以来,然后您根据这些布尔值的状态设置字段?
然后检查方法会将所有布尔值重置为 false(或任何实际提交更改的方法)。
您可以为每个操作创建一个 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
然后执行 runnables
:
子列表中的 Runnable
个实例
for (int i = 0; i < runnables.size(); ++i) {
for (Runnable fn : runnables.subList(0, i + 1)) {
fn.run();
}
validate();
}
为糟糕的标题道歉,但我真的想不出一个信息丰富的标题。
我会在这里直截了当:
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...
我正在网站上测试一个表单,该表单不应允许任何空字段,但是在提交按钮上单击我在清除之前输入的任何字段,这就是为什么我需要像上面的代码一样重新设置以前的字段。
什么是更优雅的写法?我在想一个循环,但后来我想不出合适的条件...
我不确定我是否完全理解你的问题(也许关于工作示例的 pastebin 会有所帮助),但是也许你可以为每个字段设置一个布尔值来检查该字段是否已被修改自上次检查以来,然后您根据这些布尔值的状态设置字段?
然后检查方法会将所有布尔值重置为 false(或任何实际提交更改的方法)。
您可以为每个操作创建一个 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
然后执行 runnables
:
Runnable
个实例
for (int i = 0; i < runnables.size(); ++i) {
for (Runnable fn : runnables.subList(0, i + 1)) {
fn.run();
}
validate();
}