重构嵌套的if语句

时间:2019-08-28 19:47:38

标签: java if-statement nested refactoring

我正在尝试重构一些看起来与下面的代码相似的代码。我认为应该有一种更简单的方法来完成它的工作。我主要关心的是在(!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
        }
    }

3 个答案:

答案 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
    });
}
相关问题