Java 如何使我的代码更干净(返回语句)

Java 如何使我的代码更干净(返回语句),java,if-statement,return,state-machine,Java,If Statement,Return,State Machine,我正在编写一个简单的状态机作为练习。 当我有很多州有条件的时候,在我看来,它变得太难理解了。 我想在一眨眼之间看到我正在回到什么状态 现在的示例: if ((currentState.equals(State.s70_SupplyFanStart)) && (/**Some statement*/)); Or ((currentState.equals(State.s80_ControlStart)) && (/**Some statement*

我正在编写一个简单的状态机作为练习。 当我有很多州有条件的时候,在我看来,它变得太难理解了。 我想在一眨眼之间看到我正在回到什么状态

现在的示例:

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  (((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 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 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(); 
}

请参阅示例:

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

所以你改叫:

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(); 
}

请参阅示例:

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

假设
currentState
State
enum的一个实例,则可以重写代码:

boolean otherCondition=false;
开关(当前状态){
s70_电源风扇启动:
otherCondition=/*语句1*/;
打破
s80_控制启动:
otherCondition=/*语句2*/;
打破
s90_限制器监控启动:
otherCondition=/*语句3*/;
打破
s99_故障:
otherCondition=/*语句4*/;
打破
s100_联锁:
otherCondition=/*语句5*/;
打破
}
如果(其他条件){
返回状态:0.s00_备用;
}
// ...
或者使用Java 12+中较短的
开关
语法:

boolean otherCondition=开关(当前状态){
s70_SupplyFanStart->/*语句1*/;
s80_ControlStart->/*语句2*/;
s90_LimitionMonitoringStart->/*声明3*/;
s99_故障->/*语句4*/;
s100_联锁->/*语句5*/;
默认->假;
}
如果(其他条件){
返回状态:0.s00_备用;
}

使用
switch
语句是否更方便

假设
currentState
State
enum的一个实例,则可以重写代码:

boolean otherCondition=false;
开关(当前状态){
s70_电源风扇启动:
otherCondition=/*语句1*/;
打破
s80_控制启动:
otherCondition=/*语句2*/;
打破
s90_限制器监控启动:
otherCondition=/*语句3*/;
打破
s99_故障:
otherCondition=/*语句4*/;
打破
s100_联锁:
otherCondition=/*语句5*/;
打破
}
如果(其他条件){
返回状态:0.s00_备用;
}
// ...
或者使用Java 12+中较短的
开关
语法:

boolean otherCondition=开关(当前状态){
s70_SupplyFanStart->/*语句1*/;
s80_ControlStart->/*语句2*/;
s90_LimitionMonitoringStart->/*声明3*/;
s99_故障->/*语句4*/;
s100_联锁->/*语句5*/;
默认->假;
}
如果(其他条件){
返回状态:0.s00_备用;
}

我目前正在使用一个case开关来执行此操作,因此我的Main是干净且可读的。在我看来,我有一个名为getState()的方法,它返回一个枚举状态。getState包含状态之间的逻辑。在switch中,我执行以下操作:switch(getState)case:state_1:process(state_1)。然后在process方法中,我用if语句对需要在特定状态下执行的所有内容进行编码。我目前使用case开关进行编码,因此我的Main是干净且可读的。在我看来,我有一个名为getState()的方法,它返回枚举状态。getState包含状态之间的逻辑。在switch中,我执行以下操作:switch(getState)case:state_1:process(state_1)。然后在process方法中,我用if语句编写了在特定状态下需要执行的所有代码。谢谢,我将尝试一下!谢谢你,我会试试的!