0

List<Elements>メモリ内にありList<Files>、それぞれがのシリアル化された表現であるとします。List<Elements>

目標は、各要素に対して同じアルゴリズムを実行することです。

仕事は要素を数えることだとしましょう

int i = 0;
for (Element e : list) {
       ++i;
}

for (File f : directory()) {
    for (Element e : listWeSomehowGetFromTheFile) {
           ++i;
    }
}

これをどうにかしてさらに抽象化できますか?基本的に、アルゴリズムは同じです(++i)。これをクリーンアップする方法はありますか?

私は確かにそれ自身のクラスを持つことができます、それはリストのアルゴを実行するメソッドをCounter(List<Element>)持っています。count ()このようにして、次のことができます。

 i+=Counter.count(list);
 for (File f : directory()) {
   i+=Counter.count(listWeSomehowGetFromTheFile);
 }

しかし、これでも改善できるようです。

この例では、すべての操作(それらの束)がメモリ内のリストと同じディレクトリ内の同じファイルからのリストで実行されると仮定します。変わるのはアルゴだけです。

このようなものを処理するには、どのパターンが最適ですか?

4

2 に答える 2

1

訪問者パターンは、コレクション内の各アイテムに何かをしたい場合に非常に人気があります。

ビジター パターンも優れています。ビジターが操作するクラスを書き換えることなく、実行できる計算を拡張できるからです。

正式なパターンに厳密に従う必要がない場合は、

1)要素を受け取って動作するOperationメソッドのようなインターフェイスを定義します。 2) あなたの計算は の実装です。 3) 要素をループして、要素を操作の実装に渡します。calculate
Operation

calculate の結果が累積的である場合 (他の要素に対する以前の calculate 呼び出しに依存する)、calculate計算の状態を含むオブジェクトを取得するように変更できます。その後calculate、要素に対して が起動されたときに、状態を更新します。すべての計算呼び出しに同じ状態オブジェクトを渡し続けます。

概要として(これはコンパイルされません):

public Interface Operation {
   // don't necessarily need state
   public void calculate (Element e, State state);
}

CountOp extends Operation {
   count = 0;

   public void calculate(Element e, State state){
      // not using element or state because this is so simple....
      count++;
   }
}

Operation op = new CountOp();
State state = new SomeStateImpl();
for (File f : directory()) {
    for (Element e : listWeSomehowGetFromTheFile) {
          op.calculate(e, state);
    }
}
于 2012-07-26T20:47:30.157 に答える
0

私は誤解しているかもしれませんが、これにアプローチする方法は、(遅延) シーケンスの観点から関数を記述することです。リストとファイルのデータの両方を値の遅延シーケンスにするのは簡単です。

より実用的に言えば、Java の遅延ストリームは通常、イテラブル (または再起動する必要がない場合はイテレータ) として実装され、グアバ ライブラリにはこれらを操作するための多くのユーティリティがあります。

これは、要素が同じタイプであることを前提としています。ビジター パターンは、処理しているデータ構造にさまざまなタイプがある場合により適しています (ビジターはタイプ ベースのディスパッチを行う場所です。単一のタイプには必要ないため、単一のタイプのビジター パターンはストリームの生成と同等です)データの - その場合、既存の反復子を使用する方が簡単です)。

于 2012-07-26T22:57:10.460 に答える