0

「データホルダー」オブジェクトを作成するクラスがあり、このオブジェクトを次のような修飾子クラスで変更します。

public class Process {
    public void Run() {
        var dataHolder = new DataHolder();

        var firstModification = new FirstModification(dataHolder);
        firstModification.Run();

        var secondModification = new SecondModification(dataHolder);
        secondModification.Run();

        //etc.
    }
}

public class FirstModification {

    DataHolder data_holder;

    public FirstModification (DataHolder dh) {
        data_holder = dh;
    }

    public void Run() {
        // do something with data_holder
    }
}

public class SecondModification {
    // etc.
}

このコードでは、各変更コンストラクターはdataHolder、パラメーターとして、対応するボイラープレートと共に、修飾子クラス内の重複したコードを受け取る必要があります。

したがって、可能であれば、および/または推奨される場合は、各修飾子オブジェクトがメソッドdataHolder内の生きているオブジェクトの存在について「すでに知っている」ことを望みます (つまりProcess.Run()、「親スコープ」)。パラメータを修飾子コンストラクタに渡します。

編集:ここここで説明されている内容に触発された、パイプライン(別名パイプとフィルター)デザインパターンを実装しようとしています。

助けてくれてありがとう!

4

4 に答える 4

3

したがって、可能であれば、および/または推奨される場合は、各モディファイアオブジェクトがProcess.Run()メソッド(つまり「親スコープ」)内の生きているdataHolderオブジェクトの存在について「すでに知っている」ことを望みます。これをパラメーターとして修飾子コンストラクターに渡す必要があります。

可能?はい、スレッドローカル変数を介して「DataHolderこのスレッドの現在の状態」を維持します(または単純な静的変数でも)。

おすすめされた?いいえ、そうは言いません。現時点であなたが持っている問題は何もありません。すべてを暗黙的にすることでどのような利点が得られると思いますか。

ただし、スタックを遡って呼び出し元のメソッドでローカル変数を見つけることができるものはありません...

于 2013-02-22T20:20:37.473 に答える
1

何らかの方法でインスタンスを関連付ける必要があります

var firstModification = new FirstModification()

など、実際のデータで。

現在のアプローチは悪いものではありません。変更インスタンスに「親スコープ」へのアクセスを許可する場合は、親オブジェクト参照をそれらに渡す必要があります。これにより、実際に必要以上に親オブジェクトにアクセスできるようになりますが、これはお勧めできません。

于 2013-02-22T20:21:36.837 に答える
0

refパラメータにキーワードを使用します。

...
var firstModification = new FirstModification(ref dataHolder);
...
public FirstModification (ref dataHolder dh) {
    // Make changes to dh
}
...

これにより、dataHolderオブジェクトへの参照がProcessクラスからFirstModificationメソッドに渡されます。

于 2013-02-22T20:21:05.573 に答える
0

Modifierクラスをスーパークラス化し、DataHolderオブジェクトをProcessクラスから静的変数として使用できるようにするのはどうですか?

public class SuperModifierClass
{
    DataHolder dataHolder;

    public SuperModifierClass()
    {
        dataHolder = Process.DataHolder;
    }
}

public class FirstModifier
{
    public FirstModifier() : base() // Is base called implicitly by default? I forgot...
    {
    }
}

もう1つのオプションは、MEFやUnity(これらの用語をグーグルで検索)などのフレームワークを介した制御の反転を調べることです。これらが本質的にできることは、パラメータとしてそれらを持つ新しいクラスをインスタンス化するときに自動的にロードできるオブジェクトを登録することです。「誰かがDataHolderオブジェクトを必要とする場合は、これを使用してください」と言うことになります。このようなフレームワークを介して変更クラスをインスタンス化すると、呼び出される「コンテナ」は、登録されているかどうかを確認してパラメータを取得することで、実際にパラメータを解決します。登録されたインスタンス。

于 2013-02-22T20:28:42.230 に答える