我有以下界面:
public interface Gravy {
public List<Giblet> getGiblets();
public Giblet getGiblet(String id);
public int getNumGiblets();
public void addGiblet();
public void removeGiblet(Giblet giblet);
public List<Carrot> getCarrots();
public Carrot getCarrot(String id);
public int getNumCarrots();
public void addCarrot();
public void removeCarrot(Carrot carrot);
public List<Gravy> getGravies();
public Gravy getGravy(String id);
public int getNumGravies();
public void addGravy();
public void removeGravy(Gravy gravy);
}
正如您所看到的,我的Gravy
中有一个重复出现的模式。 Gravy
对象可以包含内脏,胡萝卜和其他(较小的)肉食。所有这些都可以添加,删除或查询。
有两点需要注意:
Carrot
和Giblet
s彼此有一点共同点,但两者都与Gravy
s有很大不同。
我可能需要稍后添加更多项目(因此需要重构)......
是否可以减少上面的代码,以便“动词”只写一次?
答案 0 :(得分:7)
这取决于您对功能组的相似程度。例如,如果功能组可以被视为某种东西,例如,一组成分,然后你可以做到以下几点:
public interface Ingredient<T> {
public List<T> getAll();
public T get(String id);
public int size();
public void add(T item);
public void remove(T item);
}
public interface Gravy {
public Ingredient<Giblet> getGiblets();
public Ingredient<Carrot> getCarrots();
public Ingredient<Gravy> getGravies();
}