Closed. This question is opinion-based。它当前不接受答案。












想改善这个问题吗?更新问题,以便editing this post用事实和引用来回答。

2年前关闭。



Improve this question




假设我有一个名为CommandLineOperation的类。此类访问API资源。因此,我定义了一个类型为APIAccessor的实例成员。
class CommandLineOperation {
    APIAccessor apiAccessor;
    void create() {
        apiAccessor = new APIAccessor(email,password);
        //do work for creation
    }
    void update() {
        apiAccessor = new APIAccessor(email,password);
        //do work for update
    }
}

class APIAccessor {
    String email;
    String password;
    APIAccessor(email,password) {
        this.email = email;
        this.password = password;
    }
}

CommandLine中的操作很少,是在每个操作下实例化APIAccessor还是使用CommandLineOperation类的构造函数创建一次的更好方法。例如
CommandLineOperation(String email,String password) {
    this.apiAccessor = new APIAccessor(email,password);
}

请让我知道或建议好的编码设计模式。或建议任何参考书,以便我可以根据分析结果改进编码标准。提前致谢。

最佳答案

答案是:这取决于-您的上下文/要求。

创建CommandLineOperation实例时一次创建ApiAccessor的优点:

  • ,然后您可以创建不可变对象(通过将该字段定为最终字段)。这样做有很多优点-就像您一直知道的那样,该字段已初始化(理想情况下,您甚至可能希望验证ApiAccessor实际上是有效的并且不包含错误的信息)
  • 您的其他方法可以专注于其直接责任-不用担心该字段是否已初始化
  • 因此,
  • 也更容易进行单元测试-如果需要进行模拟,则只需为提供一次ApiAccessor对象-而不是每次调用CommandLineOperation
  • 的“真实”方法之一时都要对其进行处理

    缺点:
  • 您不能为指定的CommandLineOperation对象
  • “切换” ApiAccessor
  • 如果您有成千上万个这样的对象在您身边闲逛,那您将浪费一些内存

  • 但是,当您考虑时:在现实世界中,这些缺点并不是什么大问题。

    关于所需凭据来自解析文件的评论:归结为依赖项注入!

    含义:CommandLineOperation类应而不是包含构造ApiAccessor实例的代码。该对象应该被注入(通过依赖注入框架)-或例如通过构造函数提供。

    07-26 04:39