如何避免方法之间的依赖关系?

时间:2015-09-09 14:52:23

标签: java design-patterns

我有以下方法:

protected ArrayList<String> prepInstaller(RemoteSession session) {
    ArrayList<String> installCommand = new ArrayList<String>();
    installer.setInstallOption(getCommand());
    installer.setInstallProperties(generateInstallProperties());
    installer.setTestHome(getTestHome(session));

    switch (installer.getInstallOption()) {
    case ("addon"):
        installer.setAddOnScriptPath(getAddOnScriptPath(session, true));
        installer.setAddOnImageLocation(getAddOnPath(session, true));
        installCommand.add(installer.getInstallCommand());
        break;
    case ("install"):
        installer.setImageLocation(getImageLocation(session, true));
        installCommand.add(installer.getInstallCommand());
        break;
    case ("patch"):
    case ("rollback"):
        installer.setPatchLocationPath(getPatchPath(session, true));
        for(String currentPatch: installer.getPatches()) {
            installCommand.add(installer.getInstallCommand(currentPatch));
        }
        break;
    }

    return installCommand;
}

我的问题是这一行:

installCommand.add(installer.getInstallCommand());

包含installer.getInstallCommand(),它将包含空对象,除非运行以下命令:

installer.setInstallOption(getCommand());
installer.setInstallProperties(generateInstallProperties());
installer.setTestHome(getTestHome(session));

其中......该方法依赖于以前运行的方法,这是不可取的。我已将installer定义为静态工厂:

public static InstallData getInstance() {
    if (instance == null) {
        instance = new InstallData();
    }
    return instance;
}

我已经看过使用构建器模式,但它似乎有点笨拙。我无法找到它的整洁版本。我不想使用构造函数,因为它会很混乱,我需要它们中的几个。

我还尝试构造一个包含所有set方法的对象,然后将该对象传递给一个返回getInstallCommand()的新类,但这也很混乱。

欢迎提示:)

1 个答案:

答案 0 :(得分:1)

正如在问题中指出的那样,在对象处于非法状态时,实例化对象或调用方法不是理想的行为。在大多数情况下,对象创建需要4个或更多参数但是其中一些参数可以有合理的默认值,可以通过要求必要的参数并替换可选的参数来使用伸缩构造函数(反)模式。

在其他情况下,特别是如果参数类似/相同类型,则使用构建器模式。它们不是一次指定所有参数,而是逐个设置,最后Builder对象用于实例化所需的类。

这个问题涉及&#34;凌乱&#34;代码有几次。虽然对于任意代码都是如此,但设计模式is

  

对一个常见问题的一般可重用解决方案   在软件设计中给出了上下文。

因此,如果正确实施,它既可以用于用例,也可以不用,但它不应该是#34;凌乱&#34;。我还建议您查看常用design patterns的java实现。也许,可以找到一个更适合于问题域的替代方案。