如何使我的代码更清晰(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
语句不是更方便吗?
假设currentState
是State
枚举的一个实例,代码可能会重写:
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;
}
我正在编写一个简单的状态机作为练习。 当我有很多有条件的状态时,我认为它变得太不可读了。 我想在眨眼之间看到我处于什么状态 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
语句不是更方便吗?
假设currentState
是State
枚举的一个实例,代码可能会重写:
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;
}