如何修复基于Java的项目功能羡慕?

时间:2016-07-19 13:09:36

标签: java refactoring feature-envy

在我使用" inFusion Hydrogen"为了分析我的项目,很容易弄清楚myQuestionFun()导致功能嫉妒。

public abstract class Father{
    protected DataModel dataModel;
    public abstract void myQuestionFun();
}
public class Child extends Father{

    public DataModel<TableInfo> tableList = new DataModel<TableInfo>;
    public DataModel<TableInfo> getTableList(){
        return this.tableList;
    }

    @Override
    public DataModel<Report> getDataModel(){
        return this.dataModel;
    }

    @Override
    public void myQuestionFun(){
        List<TableInfo> tabList = new ArrayList<TableInfo>();
        for (int i=0; dataModel.getDataList().size(); i++) {
            Report rep = (Report)dataModel.getDataList.get(i);
            TableInfo tabInfo = new TableInfo();
            tabInfo.setId(rep.getId());
            tabInfo.setName(rep.getName());
            tabList.add(tabInfo);
        }
        tableList.setPage(dataModel.getPage());
        tableList.setSorter(dataModel.getSorter());
   }
}

问题是,解决问题的最佳方法是什么? 因为myQuestionFun()是父类的抽象方法的函数,所以我无法移动它。

2 个答案:

答案 0 :(得分:1)

提取以下代码作为从Child进入父亲的方法:

protected List<TableInfo> getTabList() {
    final List<TableInfo> tabList = new ArrayList<TableInfo>();
    for (int i=0; dataModel.getDataList().size(); i++) {
            Report rep = (Report) dataModel.getDataList.get(i);
            TableInfo tabInfo = new TableInfo();
            tabInfo.setId(rep.getId());
            tabInfo.setName(rep.getName());
            tabList.add(tabInfo);
    }
    return tabList;
}

将以下方法移至Father,如果它总是应该返回this.dataModel:

public DataModel<Report> getDataModel(){
   return this.dataModel;
}

答案 1 :(得分:0)

删除dataModel字段Father并切换到界面。