java - OOD - 将配置传递给外部类的最佳方法

标签 java oop

在我的主要方法中,我需要执行系统命令。我正在创建一个外部类来执行命令,以保持我的主要方法和应用程序类干净。我不确定最好或最干净的方法是否是在主方法中对命令进行设置,或者只是将类传递给配置读取器并让它提取所需的必要内容。

如果我只是将外部配置读取器传递给我的 SystemCommand 类,是否会使我的应用程序耦合更紧密,或者不遵循良好的设计实践?

例如 - 从主方法进行设置的方法一:

public static void main (String[] args) {

String[] command = { 
    config.getString("program"),
    config.getString("audit.script.name"),
    config.getString("audit.script.config")
    };
String workingDir = config.getString("audit.directory");
SystemCommand runAudit = new SystemCommand(command, workingDir);
runAudit.start();
}
或者,我可以通过传递对配置的引用并让类从那里提取它需要的内容来使 main 方法更简单。看来这种方法在概念上仍然很简单:

public static void main (String[] args) {
SystemCommand runAudit = new SystemCommand(config);
runAudit.start();
}

还有一个配置输出和日志记录指定位置的问题,但我还没有想到这一点。

最佳答案

保持 main() 方法简单。您的 main() 方法不应该了解程序中其他类的内部细节。这是因为它是一个入口点,通常入口点应该关注简约的初始化和任何其他内务管理任务。解决您的用例的最佳方法是:

创建一个类SystemCommandFactory,它将接收Config实例作为构造函数参数,我假设下面的SystemCommand是一个可以具有多种实现:

public class SystemCommandFactory
{
     private final Config config;

     public SystemCommandFactory(Config config)
     {
        this.config = config;
     }

    //assume we have a ping system command
    public SystemCommand getPingCommand()
    {
        //build system command
        SystemCommand command1 = buildSystemCommand(); 
        return command;
    }

    //assume we have a copy system command
    public SystemCommand getCopyCommand()
    {
        //build system command
        SystemCommand command2 = buildSystemCommand(); 
        return command;
    }
}

现在您的主要方法将非常简单:

public static void main(String[] args)
{
   SystemCommandFactory factory = new SystemCommandFactory(new Config());

   //execute command 1
   factory.getPingCommand().execute();
   //execute command 2
   factory.getCopyCommand().execute();
}

这样你就可以看到 main() 方法简单干净,而且这种设计绝对是可扩展的。添加新命令 MoveCommand 非常简单:

  1. 为新的 SystemCommand 接口(interface)创建一个实现 命令。
  2. 在工厂中公开一个新方法来获取这个新的 MoveCommand
  3. main() 中调用这个新工厂方法来获取新命令并 在其中调用执行。

希望这有帮助。

关于java - OOD - 将配置传递给外部类的最佳方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35196300/

相关文章:

c++ - 使用原始指针或智能指针在 C++ 中组合?

Javascript 类似 oop 的失败(?!?)

java - LibGDX - 增量时间导致 Sprite 有时在曲线移动时表现得很奇怪

c++ - 面向对象 : How to Choose from a Number of Implementations

java - 在 Commons Daemon 中正确使用 Procrun 中的 DependsOn 选项

Java 相当于 C# Big Rational

java - 纪念品模式的缺点

python - 对象生成器模式

java - Spring AOP 与多线程

Java Swing Gridbag 面板不会 colspan