【问题标题】:Constructor vs method vs factory构造函数 vs 方法 vs 工厂
【发布时间】:2014-05-24 16:20:13
【问题描述】:

假设您想将某个 Document 导出到 File 中(以某种格式...比如说 XML)。

为此,我有 XmlExporter 类,问题是......将 Document 和 File 传递给此类的最佳方法是什么?

选项 1: 导出器是无状态的,所以如果我想导出不同的文档或导出到不同的文件中,我只需更改参数即可。缺点是我必须在每个方法中传递文件(或者更确切地说是 OutputStream)(在复杂文档的情况下可能会很多)

class XmlExporter {
    public function export(Document document, File file) {
        this.writeHeader(document.header, file);
        this.writeSomeOtherStuff(document.somethingElse, file);
        // and more ...
    }

    private function writeHeader(DocumentHeader header, File file) {
        writeName(header.name, file); // passing file over and over again
    }
}

选项 2: 源和目标都存储在实例中。如果我想更改文件,我必须创建一个新对象,但现在我不必担心传递所有必要的数据。

class XmlExporter {
    private final Document document;
    private final File file;
    public XmlExporter(Document document, File file) {
        this.document = document;
        this.file = file;
    }
    public function export() {
        this.writeHeader(this.document.header);
    }
    private function writeHeader(DocumentHeader header) {
        this.writeName(header.name);
    }
    private function writeName(String name) {
        // ...
    }
}

选项 3: 两者结合

class DocumentExporter {
    public static function exportToXml(Document document, File file) {
        XmlExporter exporter = new XmlExporter(document, file);
        exporter.export();
    }
    // the rest same as Option 2, probably with private constructor
}

基本上,从编写类的角度来看,第二个选择对我来说最有意义,因为我不需要传递目标文件/流;但是从实际使用它的角度来看,我觉得第一个选择会更有意义。如果我想将其导出到标准输出而不是文件,或者导出多个文档怎么办?

【问题讨论】:

  • 我个人会选择第二个,因为对我来说它基本上类似于当前使用装饰器模式处理文件的方式,但我不会将此作为答案提交。在我看来,这三者之间的选择很大程度上取决于当时什么是合适的
  • 如何使用流畅的表示法,new XmlExporter().document(d).file(f).export();如果你想写入多个文件,file() 方法可能依赖于一个集合。

标签: java oop design-patterns coding-style


【解决方案1】:

首先,我会选择选项2,以支持以后导出过程的扩展(在实例中存储状态、进度等)。如果您希望它们是可更改的,您可以为文件和文档添加公共属性。

如果我想将它导出到标准输出而不是文件,或者 导出多个文档?

尝试解耦 XmlExporter 类的功能。 XmlExporter 应该是 Director,其职责是解析 Document 并在运行时通知附加的 Handler(接口)——一个 Handler 实现可以将数据写入 File,另一个可以写入 Console。

查看构建器设计模式:http://www.blackwasp.co.uk/Builder.aspx

【讨论】:

    【解决方案2】:

    没有。 Exporter(以及“经理”、“控制器”或任何其他以“-er”结尾的名称)是错误设计的指标。相反,您的Document 应该知道如何将自己导出到File

    document.exportTo(file);
    

    【讨论】:

    • 我认为这个观点太强烈了。我个人不喜欢Document 知道如何将自己导出到File将是一个糟糕的设计。
    • 这就像你想要一个Box 能够将自己加载到TruckDocument 将具有对 File 的编译时依赖性,这会产生不需要的紧密耦合
    • 这是一个典型的 OOP 视角。然而,在企业系统中,我们往往会回避这些原则,而是将关注点分离到单独的类和层中。
    • 设计不佳的企业系统中:(
    • 不,添加 extra 将自身导出到 document 的责任是 糟糕设计 的一个属性。无论是在 OOP 设计中还是在企业系统中。
    猜你喜欢
    • 2010-11-09
    • 1970-01-01
    • 1970-01-01
    • 2016-01-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-12
    相关资源
    最近更新 更多