Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/365.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/clojure/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何修复基于Java的项目的特性?_Java_Refactoring_Feature Envy - Fatal编程技术网

如何修复基于Java的项目的特性?

如何修复基于Java的项目的特性?,java,refactoring,feature-envy,Java,Refactoring,Feature Envy,在我使用“注入氢”分析我的项目后,很容易发现myQuestionFun()引起了功能嫉妒 public abstract class Father{ protected DataModel dataModel; public abstract void myQuestionFun(); } public class Child extends Father{ public DataModel<TableInfo> tableList = new DataMo

在我使用“注入氢”分析我的项目后,很容易发现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());
   }
}
公共抽象类父类{
受保护的数据模型;
公开摘要void myQuestionFun();
}
公营子女延伸至父亲{
公共数据模型tableList=新数据模型;
公共数据模型getTableList(){
返回此.tableList;
}
@凌驾
公共数据模型getDataModel(){
返回此.dataModel;
}
@凌驾
公开作废myQuestionFun(){
列表列表=新的ArrayList();
对于(int i=0;dataModel.getDataList().size();i++){
Report rep=(Report)dataModel.getDataList.get(i);
TableInfo tabInfo=新建TableInfo();
tabInfo.setId(rep.getId());
tabInfo.setName(rep.getName());
tabList.add(tabInfo);
}
setPage(dataModel.getPage());
tableList.setSorter(dataModel.getSorter());
}
}
问题是,最好的解决方法是什么?
因为myQuestionFun()是父类的抽象方法的函数,所以我无法移动它。

删除
数据模型
字段形式
父项
并将其更改为接口。

将以下代码作为方法从子项提取到父项:

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;
}
受保护列表getTabList(){
最终列表列表列表=新的ArrayList();
对于(int i=0;dataModel.getDataList().size();i++){
Report rep=(Report)dataModel.getDataList.get(i);
TableInfo tabInfo=新建TableInfo();
tabInfo.setId(rep.getId());
tabInfo.setName(rep.getName());
tabList.add(tabInfo);
}
返回小报;
}
将以下方法移动到父方法,如果它始终应返回this.dataModel:

public DataModel<Report> getDataModel(){
   return this.dataModel;
}
公共数据模型getDataModel(){ 返回此.dataModel; }
谢谢您的回答。我接受您关于将getDateModel()方法移动到父方法的建议。但我不知道如何从孩子身上提取一种方法到父亲身上。在我的项目中,许多子类扩展到父类,每个子类的myQuestionFun()方法的实现是不同的。我建议将getDataModel()移动到父类,如果它总是返回this.dataModel。如果不是这样的话,那么要么把它留在那里,要么把一个通用实现移到父级,只在需要的子级中重写它。我认为我的“功能嫉妒”问题是myQuestionFun()使用外部数据--rep.getId()。但我不知道如何修复它,我认为您仍然可以将getTabList()提取到父对象中,并在需要不同实现的子对象中重写它。方法myQuestionFun()将调用getTabList()。如果你能分享两个儿童的例子来更好地表达你的用例,那就太好了。