我有类似的类结构如下:
public class Foo extends Base{
...
}
public class Bar extends Base{
...
}
public class Aos extends Base{
...
}
public class Wrap{
List<Foo> getFooList();
List<Bar> getBarList();
List<Aos> getAosList();
}
Fold fooFold = getFooFold();
Fold barFold = getBarFold();
Fold aosFold = getAosFold();
// Code to refactor
for (Obj e : fooFold.getObj()) {
Foo foo = new Foo(.., .., ..);
for (Som s: e.getSom())) {
doSom();
}
wrap.getFooList().add(foo);
}
for (Obj e : barFold.getObj()) {
Bar bar = new Bar(.., .., ..);
for (Som c : e.getSom())) {
doSom();
}
wrap.getBarList().add(bar);
}
for (Obj e : aosFold.getObj()) {
Aos aos = new Aos(.., .., ..);
for (Som c : e.getSom())) {
doSom();
}
wrap.getAosList().add(aos);
}
我如何重构for循环? (for循环是一个“小”更复杂的 逻辑总是一样的。列表上的迭代,对象的创建以及将对象添加到列表中是不同的。 )
答案 0 :(得分:1)
如果所有函数都是独立的,那么唯一可以重构的就是将公共代码放在私有函数中
private doCommonThings(Base e) {
for (Som c : e.getSom())) {
doSom();
}
}
然后在你的所有循环中使用它
for (Obj e : getFooSpecObj()) {
Foo foo = new Foo(.., .., ..);
doCommonThings(e);
wrap.getFooList().add(foo);
}
答案 1 :(得分:0)
如果你的代码真的像你上面那么简单,你可能会发现你为简化它而做的任何重构都只会让它更复杂。
答案 2 :(得分:0)
由于缺少某些实施部分,因此很难判断重新分解方向。以下是我猜测如何继续这种情况:
public class ListBase< T > {
private List< T > _list;
public ListBase(ListFactory< List < T > > list_factory ){
_list = ( List< T > ) list_factory.create ( );
}
public void foreach ( CallbackInterface< T > callback ){
for ( T i :getList( ) ){
callback.process ( i );
}
}
public List < T > getList ( ){
return _list;
}
}
public interface ListFactory< T > {
List< T > create ();
}
public interface CallbackInterface < I > {
void process ( I element );
}
class ListFactorryArrayList < T > implements ListFactory < T > {
@Override
public ArrayList< T > create( ) {
return new ArrayList < T > ( );
}
}
public class Wrap {
public ListBase< Foo > _listFoo = new ListBase<Foo >( new ListFactorryArrayList < List<Foo> > () );
public ListBase< Bar > _listBar = new ListBase<Bar >( new ListFactorryArrayList < List<Bar> > () );
}
public class Main {
public static void main(String[] args) {
Wrap w = new Wrap ();
w._listFoo.getList().add( new Foo () );
w._listFoo.foreach( new CallbackInterface <Foo > () {
@Override
public void process(Foo element) {
// do smth with foo object
}
});
}
}