2010-12-17 3 views
0

あなたはクラスZipFileとクラスのコンテンツと言ってください。
ZipFileには、zipアーカイブ内のすべてのファイルの内容を読み込んでContentオブジェクトに格納するload()メソッドがあります。
最も適切なOOPデザインは何ですか?ファクトリデザインではないときにオブジェクトが別のオブジェクトを生成するのはクリーンですか?

1)ZipFile.load())コンテンツオブジェクト

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を作成します

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(); 

を埋めるためにZIPファイルのコンストラクタに内容物を与える基本的には、それが優れていますオブジェクトを分離する(疎結合)? 旧式の手続き型プログラマとして、私はOOPを設計するいくつかの方法に疑問を呈することはできません。私はOOPこのへの最善の方法は何か」に多くの時間を失う。それを通じ考える何かアドバイスを?ブック?サイト?あなたの助けを

おかげ

+0

コンストラクタの代わりに 'Content'オブジェクトを' load'関数に渡してみませんか?これは最初の例と同等です。 – lijie

+0

各ZipFileにはContentがあるので、コンテンツはZipFileの一部として見えるかもしれないので、コンストラクタに渡します。しかし、私の質問は、各ソリューションの賛否両論についてです。 – Antoine

答えて

2

一般化2例のためには、異なっています:

最初のケースは、その内容の具体的なクラスを知ること、およびインタフェースの一部の実装を返すZipFileに一般

第二ケースは、その内容のためのインターフェースを知るZipFileに一般化、及びコンクリートのを受けます。 teクラス(後で初期化する??)。

最初のケースは、ZipFileと具体的なコンテンツクラスが何であれ結合します。第2のクライアントは、クライアントZipFileと具体的なコンテンツクラスを結合します。

ZipFileは具体的な具体的なクラスをコンテンツに含める可能性が高いため、最初の一般化はおそらくより自然なものです。

関連する問題