替换条件 If 语句

Replace conditional If statements

需要为resetCredentialsMachineOneresetCredentialsMachineTwo等不同机器实例化多个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);