2011-11-01 27 views
3

私は多くのクラスで使用されるforループを持っていますが、forループ内のタスクは異なります。たとえば、Fooクラスがループのためにリファクタリングする方法はありますか?

for(Pojoclass a : listofPojo){ 
    if(a.getX().equals(b)){ 
     methos(a.getX()); 
    } 
} 

とクラスバーには、次の使用する次の使用:

for(Pojoclass a : listofpojo){ 
    if(a.getX().equals(x)){ 
     methos(a.getX()); 
    } // or some other logic 
} 

を私は、同じオブジェクトに反復処理が異なる動作を行う私のプロジェクトでは、多くのこのようなループを見つけます。これをどのように再要因化するのですか?

編集:私は、文字列を扱うわけではない、私はあなたがこの種のものをリファクタリングしていない

+1

は、「異なる動作」を実行し、一般的な機能に、そのクラスのインスタンスを渡すクラスを定義します。これは明示的なクラスで行うことができますが、いくつかの点ではよりエレガントな「匿名の内部クラス」(通常はもっと難読化されていますが)で行う方法があります。もちろん、 "異なる動作"を行うクラスのすべては、与えられたクラスのサブクラスでなければならず、共通のコードが1つのスーパークラス/インタフェースのみを参照するように、同じインタフェースを実装する必要があります。 –

+0

あなたは確かに 'a.equals(b)'を意味しますか?もし、私がラムダ、関数ポインタ、デリゲート、イベント、シグナル、コンティニュイションと思うなら、あなたはオブジェクトアイデンティティをテストすることを本当に望んでいないのですか? –

+0

@マークByers:これはパラメータを持つメソッドです –

答えて

2

あなたは実際に解決策を持っています:いつでも私は '違う振る舞いを聞きます'私はStrategy patternをすぐに思います! 私はあなたが次の操作を行い勧め:

public void forLoopReplacement(IActionStrategy strategy, IList<Pojoclass> projo){ 
    for(Pojoclass a : listofPojo){ 
     strategy.doActionOn(a); 
    } 
} 

public interface IActionStrategy { 
    public void doAction(Pojoclass param); 
} 

アプリケーションで定義された新しい動作がIActionStrategyを実装するクラスにカプセル化することができます。

こちらがお役に立てば幸いです。 よろしくお願いします。

+1

合格、ポリシー。直ちに。ああ待って、これらの中にはJavaのものもあります。 – sehe

+0

同意すると、実際にはLambda Calculusを使って解決策を投稿しようとしていましたが、代わりにStrategyパターンを実行しました。多くの平均Joeプログラマーは、Lambdaが何であるかを知ることはできません。私たちのほとんどが何時間もGoogleに向かないと理解できるものを提案することは、常により良いことです:) – GETah

3

POJOクラスを扱っています - それは、すでに素敵できれいです。

リファクタリングは、同一の冗長(重複)したコードを置き換えるように設計されていますが、異なる引数を取るだけです。あなたの場合、コードは異なるので、それをリファクタリングすることはできません。

たとえば、バイト配列を16進文字列に繰り返していた場合は、同じコードをどこでも繰り返す代わりに関数を作成する必要があります。

0

Google Guava、それはfiltertransformの方法を使用できます。まず、述語と一致しない要素を除外し、残りの要素に関数を適用します。もう少しコードが増えますが、柔軟性があります。一般に

Predicate<Pojoclass> predicate = new Predicate<Pojoclass>() { 
    public boolean apply(Pojoclass a) { 
     return a.getX().equals(b); 
    } 
}; 

Function<Pojoclass, Void> function = new Function<Pojoclass, Void>() { 
    public Void apply(Pojoclass p) { 
     methos(p.getX()); 
     return null; 
    } 
}; 

Collections2.transform(Collections2.filter(listofPojo, predicate), function).toArray(); 

(述語と機能が再使用のためにうまくリファクタリングされるべきである。)

関連する問題