替换条件 If 语句
Replace conditional If statements
需要为resetCredentialsMachineOne
、resetCredentialsMachineTwo
等不同机器实例化多个PauseTransition实例。对于每台机器,都会重复一个 PauseTransition
实例创建代码,如下所示。 expireCredentialsForMachine()
重置 Credentials
对象,以便用户被迫重新登录:
resetCredentialsMachineOne = new PauseTransition(Duration.minutes(2));
resetCredentialsMachineOne.setOnFinished(e -> expireCredentialsForMachine(machineOne));
resetCredentialsMachineTwo = new PauseTransition(Duration.minutes(2));
resetCredentialsMachineTwo.setOnFinished(e -> expireCredentialsForMachine(machineTwo));
.....
当用户登录时,每个 PauseTransition
实例将具有以下 conditional
代码:
if(machineOneLogsIn)
resetCredentialsMachineOne.playFromStart();
else if(machineTwoLogsIn)
resetCredentialsMachineTwo.playFromStart();
...
寻找一种以更好的方式设计代码的方法,而不是一堆 if 语句。这看起来像是多态性或工厂用例,但如果他们对此有任何意见,我想听听他们的意见
使用枚举很容易实现。
来自:
if(machineOneLogsIn)
resetCredentialsMachineOne.playFromStart();
else if(machineTwoLogsIn)
resetCredentialsMachineTwo.playFromStart();
至:
enum LoginType {
MachineOneLogsIn
{
@Override
public void playFromStart() {
...
}
},
MachineTwoLogsIn
{
@Override
public void playFromStart() {
...
}
};
public abstract void playFromStart();
}
method doPlay(LoginType type){
type.playFromStart()
}
让我知道这是有道理的...
不确定您的应用程序是如何设计的,我个人会这样设计:
public class Machine {
private final PauseTransition resetCredentials = new PauseTransition(Duration.minutes(2));
public Machine() {
resetCredentials.setOnFinished(e -> expireCredentials());
}
public final void logIn() {
resetCredentials.playFromStart();
}
public final void expireCredentials() {
// Your implementation
}
// Other things that you may need, e.g. credentialsExpired boolean field
}
为什么这是有道理的:
- 每台机器都有自己需要跟踪的个人状态。
- 反正每台机器都能登录
- 每台机器都使用
PauseTransition
来倒计时凭证有效性。
与其将所有这些东西分开并尝试混合搭配,不如将它们移动到一个共同的 class 中。这个 class 是模型还是控制器,取决于你如何从这里修改。您可以将状态移动到另一个模型中 class,并让逻辑保持为控制器。
根据 SOLID 原则查看以下 class。
- 它对扩展开放但对修改关闭,
- 将转换逻辑抽象到管理器中
- 解耦机器对象和转换逻辑
public class MachinePauseTransitionManager {
private static final Map<Machine, PauseTransition> MACHINE_PAUSE_TRANSITIONS = new HashMap<> ();
public void createPauseTransition(Machine machine) {
PauseTransition resetCredentialsMachine = new PauseTransition(Duration.minutes(2));
resetCredentialsMachine.setOnFinished(e -> expireCredentialsForMachine(machine));
MACHINE_PAUSE_TRANSITIONS.put(machine, resetCredentialsMachine)
}
public void login(Machine machine) {
MACHINE_PAUSE_TRANSITIONS.get(machine).playFromStart();
}
}
使用方法:
MachinePauseTransitionManager manager = new MachinePauseTransitionManager();
Machine machineOne = ..
Machine machineTwo = ..
// creating pause transitions
manager.createPauseTransition(machineOne);
manager.createPauseTransition(machineTwo);
.
.
.
// when perticular machine logs in
manager.login(machineOne);
manager.login(machineTwo);
需要为resetCredentialsMachineOne
、resetCredentialsMachineTwo
等不同机器实例化多个PauseTransition实例。对于每台机器,都会重复一个 PauseTransition
实例创建代码,如下所示。 expireCredentialsForMachine()
重置 Credentials
对象,以便用户被迫重新登录:
resetCredentialsMachineOne = new PauseTransition(Duration.minutes(2));
resetCredentialsMachineOne.setOnFinished(e -> expireCredentialsForMachine(machineOne));
resetCredentialsMachineTwo = new PauseTransition(Duration.minutes(2));
resetCredentialsMachineTwo.setOnFinished(e -> expireCredentialsForMachine(machineTwo));
.....
当用户登录时,每个 PauseTransition
实例将具有以下 conditional
代码:
if(machineOneLogsIn)
resetCredentialsMachineOne.playFromStart();
else if(machineTwoLogsIn)
resetCredentialsMachineTwo.playFromStart();
...
寻找一种以更好的方式设计代码的方法,而不是一堆 if 语句。这看起来像是多态性或工厂用例,但如果他们对此有任何意见,我想听听他们的意见
使用枚举很容易实现。
来自:
if(machineOneLogsIn)
resetCredentialsMachineOne.playFromStart();
else if(machineTwoLogsIn)
resetCredentialsMachineTwo.playFromStart();
至:
enum LoginType {
MachineOneLogsIn
{
@Override
public void playFromStart() {
...
}
},
MachineTwoLogsIn
{
@Override
public void playFromStart() {
...
}
};
public abstract void playFromStart();
}
method doPlay(LoginType type){
type.playFromStart()
}
让我知道这是有道理的...
不确定您的应用程序是如何设计的,我个人会这样设计:
public class Machine {
private final PauseTransition resetCredentials = new PauseTransition(Duration.minutes(2));
public Machine() {
resetCredentials.setOnFinished(e -> expireCredentials());
}
public final void logIn() {
resetCredentials.playFromStart();
}
public final void expireCredentials() {
// Your implementation
}
// Other things that you may need, e.g. credentialsExpired boolean field
}
为什么这是有道理的:
- 每台机器都有自己需要跟踪的个人状态。
- 反正每台机器都能登录
- 每台机器都使用
PauseTransition
来倒计时凭证有效性。
与其将所有这些东西分开并尝试混合搭配,不如将它们移动到一个共同的 class 中。这个 class 是模型还是控制器,取决于你如何从这里修改。您可以将状态移动到另一个模型中 class,并让逻辑保持为控制器。
根据 SOLID 原则查看以下 class。
- 它对扩展开放但对修改关闭,
- 将转换逻辑抽象到管理器中
- 解耦机器对象和转换逻辑
public class MachinePauseTransitionManager {
private static final Map<Machine, PauseTransition> MACHINE_PAUSE_TRANSITIONS = new HashMap<> ();
public void createPauseTransition(Machine machine) {
PauseTransition resetCredentialsMachine = new PauseTransition(Duration.minutes(2));
resetCredentialsMachine.setOnFinished(e -> expireCredentialsForMachine(machine));
MACHINE_PAUSE_TRANSITIONS.put(machine, resetCredentialsMachine)
}
public void login(Machine machine) {
MACHINE_PAUSE_TRANSITIONS.get(machine).playFromStart();
}
}
使用方法:
MachinePauseTransitionManager manager = new MachinePauseTransitionManager();
Machine machineOne = ..
Machine machineTwo = ..
// creating pause transitions
manager.createPauseTransition(machineOne);
manager.createPauseTransition(machineTwo);
.
.
.
// when perticular machine logs in
manager.login(machineOne);
manager.login(machineTwo);