我正在尝试重构一些看起来与下面的代码相似的代码。我认为应该有一种更简单的方法来完成它的工作。我主要关心的是在(!dataA.isEmpty())条件的if和else块中对getDataB()的调用。
DataA dataA = getDataA();
if (!dataA.isEmpty()) {
if (dataA.getStatus() == Status.FINAL) {
// process finalized dataA
}
if (dataA.getStatus() == Status.RECEIVED) {
DataB dataB = getDataB();
if (!dataB.isEmpty()) {
dataA.setStatus(dataB.getStatus());
// process dataA with updated status from dataB
}
}
if (dataA.getStatus() == STATUS.IN_PROGRESS) {
// process in progress dataA
}
// empty dataA
} else {
Datab dataB = getDataB();
if (!dataB.isEmpty()) {
// process dataB
}
}
答案 0 :(得分:1)
仍有改进的空间,但是作为初始重构,您可以执行以下操作:
// I like to get rid of the negations, assuming that DataA and DataB are your objects.
// I would normally declare a method with more meaning, like hasData(), otherwise just use the negation and the isEmpty.
DataA dataA = getDataA();
DataB dataB = getDataB();
// When DataA has data
if (dataA.hasData()) {
Status statusA = dataA.getStatus();
switch(statusA) {
case Status.FINAL:
// process finalized dataA
break;
case Status.RECEIVED:
if (dataB.hasData()) {
dataA.setStatus(dataB.getStatus());
// process dataA with updated status from dataB
}
break; // If you want to process dataA in progress after setting the dataB status in A, then remove this break.
case Status.IN_PROGRESS:
// process in progress dataA
break;
}
// When DataB has data
} else if (dataB.hasData()) {
// process dataB
}
答案 1 :(得分:1)
首先,将dataB
(在代码底部的其他位置)的处理以其自身的功能进行:
private void processDataB() {
DataB dataB = getDataB();
if (dataB.isEmpty()) return;
// process dataB
}
请注意,如果if
为空,我们如何反转dataB
条件以从方法返回。
接下来,对主代码应用相同的if
取反。新代码如下所示:
DataA dataA = getDataA();
if (dataA.isEmpty()) { //Inverted the test.
processDataB();
return;
}
if (dataA.getStatus() == Status.FINAL) {
// process finalized dataA
}
if (dataA.getStatus() == Status.RECEIVED) {
DataB dataB = getDataB();
if (!dataB.isEmpty()) {
dataA.setStatus(dataB.getStatus());
// process dataA with updated status from dataB
}
}
if (dataA.getStatus() == STATUS.IN_PROGRESS) {
// process in progress dataA
}
答案 2 :(得分:0)
您可以将重复的逻辑移至接受lambda的方法:
void processDataB(Consumer<DataB> action) {
DataB dataB = getDataB();
if (!dataB.isEmpty()) {
action.accept(dataB);
}
}
然后这样称呼它:
//...
if (dataA.getStatus() == Status.RECEIVED) {
processDataB(dataB -> {
dataA.setStatus(dataB.getStatus());
// process dataA with updated status from dataB
});
}
//...
} else {
processDataB(dataB ->
// process dataB
});
}