【问题标题】:Is it clean for an object to generate another object when not in a factory design?当不在工厂设计中时,一个对象生成另一个对象是否干净?
【发布时间】:2010-12-17 18:12:17
【问题描述】:

假设你有一个 ZipFile 类和一个 Content 类。
ZipFile 有一个 load() 方法,用于读取 zip 存档中所有文件的内容并将其放入 Content 对象中。
什么是最合适的 OOP 设计?

1) ZipFile.load() 将创建一个 Content 对象

class ZipFile
{
    public function load()
    {
        // Load all files in zip
        // ...
        Content content = new Content();
        content->set(data);
        return( content );
    }
}
ZipFile zf = new ZipFile();
Content ct = zf->load();
ct->print();

B) 给 ZipFile 构造函数一个 Content 对象来填充

class ZipFile
{
    private Content content;

    public function ZipFile(content) // constructor
    {
        this->content = content;
    }    
    public function load()
    {
        // Load all files in zip 
        // ...
        this->content->set(data);
    }
}
Content ct = new Content();
ZipFile zf = new ZipFile(ct);
zf->load();
ct->print();

基本上,分离对象(松散耦合)更好吗? 作为一个老派的程序程序员,我不能停止质疑设计 OOP 的几种方法。我浪费了很多时间在“OOP 这个的最佳方法是什么。有什么建议可以考虑一下吗?书?网站?

感谢您的帮助

【问题讨论】:

  • 为什么不把Content对象给load函数而不是构造函数呢?这将更等同于第一个示例。
  • Content 可能被视为 ZipFile 的一部分,因为每个 ZipFile 都有一个 Content,所以我将它交给构造函数。但我的问题更多是关于每种解决方案的优缺点。

标签: oop coupling


【解决方案1】:

这两种情况的概括是不同的:

第一种情况泛化为ZipFile 知道其内容的具体类,并返回某个接口的实现。

第二种情况概括为ZipFile 知道其内容的接口,并接收具体类(稍后初始化??)。

换一种说法,第一种情况结合ZipFile 和具体的内容类是什么。第二个将ZipFile的客户端和具体的内容类结合起来。

鉴于ZipFile 很可能会为其内容使用特定的具体类,因此第一个概括可能更自然。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-11-28
    • 1970-01-01
    • 1970-01-01
    • 2011-04-03
    • 1970-01-01
    • 2021-08-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多