0

フィルターのリストがあります。すべてのフィルターには異なる責任があり、さまざまな入力パラメーターを受け入れます。インターフェイスは次のようになります。

void doFilter(Context context);

そして私はそれを実行します:

void main(){
  context.setA(input_for_filter_a);
  context.setB(input_for_filter_b);
  context.setC(input_for_filter_c);
  //...
  firstFilter.doFilter(context);
}

フィルターを追加するには、

  1. Context を変更します。たとえば、getter と setter を使用してプライベート フィールドを追加します。

  2. main() を更新して、新しい入力パラメータを埋めます。

これらすべての入力パラメーターを分離して、異なるフィルターが知る必要のある各パラメーターに集中できるようにする方法はありますか? main() のコードが安定することを願っています。ありがとう!

PS 一部のフィルターには、入力パラメーターがない場合があります。

4

2 に答える 2

0

ContextFilter実装の詳細の間に危険な依存関係を作成しています。Contextこのように結合度が高いと、を追加または変更するたびにを変更する必要があるなど、すでに気づいている問題に悩まされますFilter

Context知っておくべきことはFilter、実装の詳細を実行する public メソッドがあることです。そして、それ以上のものはありません!このメソッドはFilterインターフェースで定義されています。

Filterの存在に依存しContextます。また、パラメータの処理方法も知っています。

一連の責任を実装するためにContext、一連のFilterオブジェクトを使用できます。これらのオブジェクトを反復処理して、インターフェイスで定義されたフィルタリング メソッドを呼び出すことができます。

擬似コードでは、次のようになります。

class Filter {
  function Filter(context, params) {
    // initializes a filter object with a context and its specific parameters
  }

  function run() {
    // run is the method defined by the Filter interface
    // here goes the implementation details for this filter
  }
}


class Context {
  array filters = [];

  function applyFilter(filter) {
    filters.push(filter);
  }

  function run() {
    for filter in filters {
      // all a context needs to know is how to execute a filter
      filter.run
    }
  }
}

void main() {    
  context  = new Context();
  filter_a = new Filter(context, params_a);
  filter_b = new Filter(context, params_b);

  context.applyFilter(filter_a);
  context.applyFilter(filter_b);

  context.run();
}

疑似コードについては、あらかじめお詫び申し上げます。あなたの例の構文に基づいて、Java またはおそらく C++ を使用していると思います。どちらもわかりませんが、同じ構文に従おうとしました。

これが問題に光を当てることを願っています。何か明確にすることができるかどうか教えてください。

一番!

于 2014-09-02T17:37:10.663 に答える