2012-01-13 4 views
3

私はクラスとオブジェクトを扱う戦略を改善するために取り組んでいます。プログラミング戦略 - オブジェクトをクラスのチェーンに渡す方法

コードを整理した状態に保つために、オブジェクトを特定のクラスのチェーンに渡す最善の方法は何ですか。

例:ZedGraphオブジェクト(注)を使用して作業していますが、これは最良の例ではないかもしれませんが、それはそのアイデアを全面的に受け取ります。

class Graphhandler 
{ 
    private ZedGraphControl ZGC; 
    private SubGraphController PortionofGraph; 

    public class GraphHandler(ZedGraphControl _ZGC) 
    { 
     ZGC = _ZGC; 
     initializeGraph(); 
    } 

    private void initializeGraph() 
    { 
     // notice I am putting the ZGC Object into another class 
     // and likely that ZGC object will go into another class 
     PortionofGraph = new SubGraphController(ZGC); 
    }   
}  

class SubGraphController 
{ 
    private ZedGraphControl ZGC; 
    private DeeperSubGraphController PortionofGraph; 

    public class SubGraphController(ZedGraphControl _ZGC) 
    { 
     ZGC = _ZGC; 
     initializeSubGraph(); 
    } 

    private void initializeSubGraph() 
    { 
     PortionofGraph = new DeeperSubGraphController(ZGC); 
     // is there a better way? 
    } 

} 

これらのすべての呼び出しを介して、データを操作するためにyopレベルのオブジェクトを渡すより良い方法はありますか?

答えて

3

通常、答えは完全に形成された依存関係をオブジェクトに渡すことです。たとえば、次のようにむしろあなたサブグラフコントローラに直接DeeperSubGraphControllerを構築するよりも

public GraphHandler(SubGraphController portionOfGraph) { 
    this.portionOfGraph = portionOfGraph; 
} 

public SubGraphController(DeeperSubGraphController portionOfGraph) { 
    this.portionOfGraph = portionOfGraph; 
} 


... 

var zedGraphControl = new ZedGraphControl(); 
var deeperSubGraphController = new DeeperSubGraphController(zedGraphControl); 
var subGraphController = new SubGraphController(deeperSubGraphController); 
var graphHandler = new GraphHandler(subGraphController); 

。今日では、通常、依存関係注入フレームワークを使用してこのすべてを調整します。

(参照:Dependency Injection Myth: Reference Passing)を

+0

はい私はこれに同意しますが、私が与えたアプローチは、作業をサブ部分に単純化するためにより良いと思います。グラフのサブ部分のコードで多くの作業を必要とする2つの可能なグラフ結果があるとしたら、ZGCをチェーンに渡して単純にコードに渡したいと思いますか? – Ashitakalax

+0

@ user970011、例を挙げることはできますか? –

+0

Graphオブジェクトがあり、与えられたデータがあるとします。グラフを折れ線グラフまたは棒グラフにすることができます。各グラフには大量のコードがあり、好きなようにグラフをカスタマイズすることができます。したがって、折れ線グラフと棒グラフの操作を扱うクラスを作成します。これらのオブジェクトで作業するには、そのメイングラフオブジェクトにアクセスする必要があります。 – Ashitakalax

0

このシナリオで継承を試すことができます。

+0

は私が間違っている場合は、私を修正している私は非常によくかもしれないが、その作業が唯一のクラスのより高いレベルに行くのではないでしょうか?私は主に下について疑問に思いますか? – Ashitakalax

+0

これは、継承を使用して、問題の逆アプローチに似ています。 –

1

Inversion Of Control(多くの場合、IoCは省略されています)をご覧ください。
基本的にスーパーオブジェクトで、いつでもどこでも他のオブジェクトにアクセスできます。

0

さまざまなコントローラがグラフをどのように制御しますか。一般的に、オブジェクトはメソッドの引数として渡しています。あるオブジェクトが別のオブジェクトを必要としたり使用している場合(contollersがあなたのケースのグラフを制御するため)、異なるメソッド間でそれらが参照オブジェクトのメンバーであると宣言されます。単一のメソッドに必要な場合、それらはパラメータとしてオブジェクトの特定のメソッドに渡されます。

グラフが特定の順序でどのように制御されるかについて、より複雑なスキームがある場合は、chain of responsibilityパターンを参照してください。

関連する問題