如何使我的代码更清晰(return 语句)

How to make my code cleaner (return statements)

我正在编写一个简单的状态机作为练习。 当我有很多有条件的状态时,我认为它变得太不可读了。 我想在眨眼之间看到我处于什么状态 returning。

例如现在的情况:

if  ((currentState.equals(State.s70_SupplyFanStart)) && (/**Some statement*/)); Or
        ((currentState.equals(State.s80_ControlStart)) && (/**Some statement*/)); Or
        ((currentState.equals(State.s90_LimitMonitoringStart)) && (/**Some statement*/)); Or
        ((currentState.equals(State.s99_Fault)) && (/**Some statement*/)); Or
        ((currentState.equals(State.s100_Interlocked)) && (/**Some statement*/));{
            return State.s00_StandBy;
}
    

以上代码不能正常折叠,只有return是文件夹。所以,你继续看到这一切:

if  (((currentState.equals(State.s70_SupplyFanStart)) && (/**Some statement*/)); Or
    ((currentState.equals(State.s80_ControlStart)) && (/**Some statement*/)); Or
    ((currentState.equals(State.s90_LimitMonitoringStart)) && (/**Some statement*/)); Or
    ((currentState.equals(State.s99_Fault)) && (/**Some statement*/)); Or
    ((currentState.equals(State.s100_Interlocked)) && (/**Some statement*/)); {...}
       

例如我想看到的是这样的:

return State.s00_StandBy IF {
    /**statement_1 = true or */
        /**statement_2 = true or
            /**statement_3 = true;*
}

所以如果你折叠它,你只会看到这样的东西:

return State.StandBy IF {...}

最后找到某些状态时这样排列会更好:

return State.StandBy IF {...}

return State.s70_SupplyFanStart IF {...}

return State.s80_ControlStart IF {...}

return State.s90_LimitMonitoringStart IF {...}

等..

您可以将状态建模为枚举,并将转换逻辑封装在枚举中。

所以你改为调用:

return currentState.nextState();

您的枚举类似于:

public enum State {

    s70_SupplyFanStart {
        @Override
        public State nextState() {
            // if...
            return ...;
        }
    },
    s80_ControlStart {
        @Override
        public State nextState() {
            // if ...
            return ....;
        }
    },
    ....

    public abstract State nextState(); 
}

参见示例:https://www.baeldung.com/java-enum-simple-state-machine

为此使用 switch 语句不是更方便吗?

假设currentStateState枚举的一个实例,代码可能会重写:

boolean otherCondition = false;
switch (currentState) {
    s70_SupplyFanStart:
        otherCondition = /*statement 1*/; 
        break;
    s80_ControlStart:
        otherCondition = /*statement 2*/; 
        break;
    s90_LimitMonitoringStart:
        otherCondition = /*statement 3*/; 
        break;
    s99_Fault:
        otherCondition = /*statement 4*/; 
        break;
    s100_Interlocked:
        otherCondition = /*statement 5*/; 
        break;
}
if (otherCondition) {
    return State.s00_StandBy;
}
// ...

或者使用来自 Java 12+ 的更短的 switch 语法:

boolean otherCondition = switch (currentState) {
    s70_SupplyFanStart -> /*statement 1*/; 
    s80_ControlStart -> /* statement 2*/;
    s90_LimitMonitoringStart -> /*statement 3*/;
    s99_Fault -> /*statement 4*/;
    s100_Interlocked -> /*statement 5*/;
    default -> false;
}
if (otherCondition) {
    return State.s00_StandBy;
}