2

3つの具体的なクラスがあります-

public class ClassA{
    public C1 processA(C1 c1){
        //lots of ugly code that copies
        //one field to another
        //return c1
    }
    public List<C1> processA(List<C1> c1s){
        //iterate over c1s
            //call process(c1)
            //add returned value to list

        //return list
    }
}


public class ClassB{
    public C2 processB(C2 c2, C3 c3){
        //lots of ugly code that copies
        //one field to another
        //return c2
    }
    public List<C2> processB(List<Pair<C2, C3> pairs){
        //iterate over pairs
            //call process(c2, c3)
            //add returned value to list

        //return list
    }
}

public class ClassC{
    public C4 processC(C4 c4, C5 c5, C1 c1){
        //lots of ugly code that copies
        //one field to another
        //return c4
    }
    public List<C4> processC(List<Triple<C4, C5, C1> triples){
        //iterate over triples
            //call process(c4, c5, c1)
            //add returned value to list

        //return list
    }
}

process(List...) メソッドの重複を削除したいと思います。processA(C1)、processB(C2,C3)、processC(C4,C5,C1) メソッドについては気にしません。それらは同じままです。このコードをリファクタリングする際のオプションは何ですか?

4

1 に答える 1

1

コードの重複に加えて、コードには他に 2 つの問題が見られます。これらの問題に対処して、コードの重複の臭いを取り除くことができます。

  1. いくつかのクラスの密結合。これらのクラスのドメインとそれらの実際の説明的な名前を知らずにこれを断言することはできませんが、C1-C5 がプロパティのコピーが有効な操作になるのに十分な関連性があることを考えると、開始するのに良い場所はそれらのクラスの設計。たとえば、C1 ~ C5 で共有されるプロパティを常に新しい Bean クラスに格納できるように構成できますか?
  2. 同じことを行う複数の方法、または従来の OOD 用語では、「関心の分離」が欠けています。これらのクラスは、変換 (C3 から C2 など) だけでなく、コレクションに対する操作の結果の収集にも関係しています。後者の懸念を分離することを検討してください。おそらく、Apache コレクションの Collections.collect()などのより一般的なコレクション ソリューションをクライアントに使用させるだけです。クラス A と B はユーザーのために複数の処理を実行しようとしているため、単一のアイテムとコレクションに対して複数のメソッドがあります。(scala や groovy のような関数型言語では、一般的なコレクション ソリューションがよりエレガントで簡潔になり、これらのような便利なメソッドの必要性が減少することに注意してください。)
于 2013-03-04T15:53:07.617 に答える