【问题标题】:How to make my code cleaner (return statements)如何让我的代码更干净(返回语句)
【发布时间】:2021-04-20 10:39:32
【问题描述】:

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

现在的例子:

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 {...}

等等。

【问题讨论】:

    标签: java if-statement return state-machine


    【解决方案1】:

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

    所以你改为调用:

    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

    【讨论】:

      【解决方案2】:

      为此使用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;
      }
      
      

      【讨论】:

      • 我目前正在使用大小写开关,所以我的 Main 是干净且可读的 imo,我有一个名为 getState() 的方法,它返回一个枚举状态。 getState 包含状态之间的逻辑。在开关中我这样做:开关(getState)案例:state_1:进程(state_1)。然后在 process 方法中,我使用 if 语句编写需要在特定状态下执行的所有内容。
      猜你喜欢
      • 1970-01-01
      • 2022-08-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-06-01
      • 2021-07-11
      • 2021-04-28
      • 1970-01-01
      相关资源
      最近更新 更多