2010-12-08 5 views
0

次のC#は抽象的である。これは、私が上記でファイルシステムツリーにこのデザインパターンは論理的ですか?あなたは私が<br> を達成しようとしています何の構造を見ることができるように

interface IComponent 
{ 
    void Render(); 
    void Add(INode); 
    void Remove(INode); 
} 

class Folder : IComponent 
{ 
    List<IComponent> filesAndFolders = new List<IComponent>(); 

    void Render() 
    { 
     Console.WriteLine("This is a folder, num childs: " + 
    } 

    void Add(IComponent add) 
    { 
     filesAndFolders.Add(add); 
    } 

    void Remove(IComponent rem) 
    { 
     filesAndFolders.Remove(rem); 
    } 
} 

class File : IComponent 
{ 
    void Render() 
    { 
     Console.WriteLine("This is a file"); 
    } 

    void Add(IComponent add) 
    { 
    //do nothing... cant add folder to file 
    } 

    void Remove() { } //same as above 
} 

私の問題を表現するために使用していますコンポジット(GoFの)パターンコードは、私ができる
...私は追加と削除が実装されていないファイルを持っている今です:

  1. はアドオンを削除し、コンポーネントから削除し、その後私は、私はパターンAを壊しています信じていますビット。
  2. 補完パターン(デコレータ?)を使用して、葉と複合クラスのAddを変更します。たとえば、Folderに何らかの方法でFolder.AddFileOrFolder(Component)メソッドを持ち、FileにFile.AddSibling(File)メソッドを持たせます。
  3. 別のパターンを見てください。おそらく私はそれを間違っているか、私の要求についてもっと知らなくても何か不可能なことを達成しようとしていますか?例えば、いくつかの質問は、私が使用するパターンがオブジェクトの表示とどのようにやり取りされるべきか、およびユーザ入力がオブジェクトにどのように影響を及ぼすかである。

これらのファイルとフォルダは、実際にはリモートホスト上のオブジェクトの表現であり、ハードディスク上の重要なファイルやフォルダではありません。ユーザーインタラクションの1つは、アプリケーションの「ファイル」がデスクトップにドラッグされ、ファイルがダウンロードされるときです。

質問:
ユーザーが「仮想」ファイルとやりとりすると、結果がより速く表示されるように、アプリケーション内のファイルをキャッシュするのはどのようなトリックまたはテクニックでしょうか。

ありがとうございます。

答えて

2

フォルダとファイルという2つのクラスがあることをお勧めします。フォルダには、フォルダとファイルの2つのコレクションがあります。不適切なパターンで複雑にする必要はありません。ファイルやフォルダにいくつかの一般的なメソッド/プロパティ(Nameなど)がある場合は、共有メソッド/プロパティだけの適切なインターフェイスを作成できます。

+0

私はこの回答を受け入れましたが、質問する前により良い検索を行った可能性があります。私はこれが私が望んだものだと信じています:http://stackoverflow.com/questions/1579520/is-the-composite-pattern-solid –

0

私はインターフェイスを使用するほぼすべてのパターンで同じ問題を認識します。インタフェースメソッドの呼び出し側は、という実装者が特定のタスクを実行するか、まったく何かを行う保証はありません。です。これは私には不満があり、私はこの哲学的問題に対する喜ばしい解決を知っているかどうか分からない。

私が持っていた考えの1つは、すべてのインターフェイスメソッドがクラスのインスタンスを返すことを期待することです。このクラスはプライベートコンストラクタを持ち、作成するメソッドが適切な処理を行っていることを証明するためにそれは、インタフェースの実装者である見知らぬ人が、検証のために呼び出し元に戻ることができるという仕事の「レポート」のようなものです。

一方、インターフェイスのポイントは、ではないため、基礎となる実装について気にする必要があるため、これはアンチパターンと見なすことができます。つまり、呼び出し元のコードではなく、予想される動作を公開しない場合は、実装者の問題になるようにコードを構造化する必要があります。

+0

面白いですが、私が探しているものではありません。私はそれを増やすのではなく、複雑さを減らそうとしています。幸いにも、私は小さな会社のために働いています。だから、私の同僚に「ちょっと、このようなインターフェースを実装しないでください! –

1

@Brianに同意します。私は、ファイルとフォルダの両方に存在する情報を持つインターフェイスを作成します。

理由なしでパターンを使用しようとしないと、物事が複雑になります。

+0

私はこの応答と@Brianが好きです。しかし、私はこれに合ったパターンがあるべきだと感じています。構図が私が探しているものでないなら、私は何か他のものがありますか? –

1

ここでコンポジットパターンを使用すると、ビジターパターンを実装する予定がある場合は特に便利です。言い換えれば、時間の経過とともに、予期しないアクティビティをファイル/フォルダ構造に追加することができます。たとえば、EnvDTEへの参照を含むcsprojファイルのファイルシステムを検査する機能や、長さゼロのファイルの数をカウントする機能が必要であるかどうかは分かりませんでした。これは、これらの2つのパターンの組み合わせで簡単です。場合によってはパターンが便利な場合もあります。時々彼らは歴史の中で「誰かがパターンを学んでいるように見える」と言います。エンジニアリング貿易研究では、より大きなビジネス要件を考慮してください。特に、スケーラビリティや拡張性が必要かどうかを特定し、決定する。

関連する問題