2012-05-01 5 views
2

私は、多くのクラスからなる信号処理経路を持っています。各処理クラスは、より小さいクラスの構成であり、それぞれが独自のパラメータを持っています。プロセスとパラメータを通信するための推奨設計パターンはありますか?

これまで、私は怠惰で、すべての処理パラメータを別のパラメータクラスに格納していました。私はこれをすべての処理クラスのfriendにして、データメンバーに直接アクセスできるようにしました。しかし、これにより、個々のブロックとパラメータクラスの間の結合が非常に強くなり、設計が完全に柔軟でなくなります。

私は、それぞれの小さなプロセスが結合を減らすために必要な独自のプライベートデータメンバーを所有するように、コードを再設計しています。しかし、新しいパラメータセットがロードされた場合、個別の処理ブロックごとに(アクセサー関数を使用して)すべてのパラメータを設定する複雑なメソッドが必要になります。このメソッド内のコマンドは、プロセスに強力に結合されます。この結合を最小限にするには

答えて

1

私はContext Patternのようなものをお勧めします。プロセスの構築時には、コンテキストオブジェクト(複数のプロセスに対して様々なコンテキストを持つことができます)を使用してプロセスをロードします。次に、各プロセスに、指定されたコンテキストオブジェクトから必要なパラメータを要求して取得させます。このようにして、プロセスパラメータをプロセスに完全に設定する責任を移します。言い換えれば、プロセスは必要なパラメータを知っているので、プロセスは指定されたコンテキストオブジェクトからそれらを要求し、非公開で保存されたメンバーを直接設定できます。

コンテキストパターンにはさまざまな種類がありますが、一般的にかなり柔軟な概念です。

+0

これは素晴らしいですね。プロセスが構築された後、コンテキストオブジェクトの値が変更されたとします。どのように私は個々のプロセスが新しい値に従って自分自身を更新することができますか? – learnvst

+0

これは私がこれまでに持っていたものです。FYI:http://stackoverflow.com/questions/10401321/does-this-implementation-of-the-context-pattern-look-ok – learnvst

+1

@learnvstあなたはプロセスを購読することができます)をコンテキスト(パブリッシャ)に渡すため、コンテキストの変更があった場合に自動的にコンテキストによって通知されます。 http://en.wikipedia.org/wiki/Observer_patternを参照してください。パブリッシャ/サブスクライバの責任をコンテキスト自体から切り離すことはできますが、それは難しいかもしれません。 – mloskot

1

一般的なコンテキスト(マップ内のキー/値を使用)、またはすべてのプロセスに共通のパラメータを持つSpecificContextBaseを継承する特定のコンテキストを作成できます。

GenericContextのPROは、パラメータを追加/削除する必要はありませんが、CONは各パラメータにアクセスするための参照コストです。

SpecificContextのPROには、パラメータにアクセスするためのルックアップコストはありませんが、CONはパラメータの追加/削除の変更です。少なくともこのオプションでは、他の何ものにも影響を及ぼさない1つのプロセスに固有の具体的なContextクラスを変更すればよい。