将两种方法合并为一种

时间:2017-07-27 14:38:25

标签: java refactoring

我最近进行了一次代码审核,并坚定地建议我将两种方法合并为一种。两种方法都是相同的,除了每个方法中的单个方法调用,并且一个方法不需要参数。

方法#1

private void updateCache(List<CategoryObject> objectList) {
    ServiceApi serviceApi = getService();
    if (serviceApi != null) {
        try {
            serviceApi.updateResources(objectList);
        } catch (BusinessException e) {
            log.error(e);
        }
    }
}

方法#2

private void registerCache() {
    ServiceApi serviceApi = getService();
    if (serviceApi != null) {
        try {
            serviceApi.registerCategory(CATEGORY_NAME);
        } catch (BusinessException e) {
            log.error(e);
        }
    }
}

这些甚至可以有效地结合起来吗?

2 个答案:

答案 0 :(得分:3)

您可以将内部功能拉出到界面中:

private interface Op {
    void perform(ServiceApi serviceApi);
}

static void cache(Op op) {
    ServiceApi serviceApi = getService();
    if (serviceApi != null) {
        try {
            op.perform(serviceApi);
        } catch (BusinessException e) {
            log.error(e);
        }
    }

}

private void updateCache(List<CategoryObject> objectList) {
    cache(new Op() {
        @Override
        public void perform(ServiceApi serviceApi) {
            serviceApi.updateResources(objectList);
        }
    });
}

private void registerCache() {
    cache(new Op() {
        @Override
        public void perform(ServiceApi serviceApi) {
            serviceApi.registerCategory(CATEGORY_NAME);
        }
    });
}

在Java 8中,这两种方法变得非常简单和优雅。

private void updateCache(List<CategoryObject> objectList) {
    cache(serviceApi -> serviceApi.updateResources(objectList));
}

private void registerCache() {
    cache(serviceApi -> serviceApi.registerCategory(CATEGORY_NAME));
}

答案 1 :(得分:0)

您可以使用一种方法并通过输入参数进行区分:

private void updateCache(List<CategoryObject> objectList) {
    ServiceApi serviceApi = getService();
    if (serviceApi != null) {
        try {
            if(objectList != null){
                serviceApi.updateResources(objectList);                
            }
            else{
                serviceApi.registerCategory(CATEGORY_NAME);
            }
        } catch (BusinessException e) {
            log.error(e);
        }
    }
}

也许方法名称也应该重构:handleCache()

然后您可以通过两种方式调用该方法:

handleCache(objectList) - &gt;像方法#1一样工作

handleCache(null) - &gt;像方法#2一样工作