Java 两法合一

Java 两法合一,java,refactoring,Java,Refactoring,我最近进行了一次代码审查,有人坚决建议我将两个方法合并为一个。这两个方法都是相同的,除了在每个方法中调用一个方法外,还有一个方法不需要参数 方法#1 private void updateCache(List<CategoryObject> objectList) { ServiceApi serviceApi = getService(); if (serviceApi != null) { try { serviceApi.

我最近进行了一次代码审查,有人坚决建议我将两个方法合并为一个。这两个方法都是相同的,除了在每个方法中调用一个方法外,还有一个方法不需要参数

方法#1

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

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

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

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);
        }
    }
}
private void updateCache(列表对象列表){
ServiceApi ServiceApi=getService();
如果(serviceApi!=null){
试一试{
if(objectList!=null){
serviceApi.updateResources(objectList);
}
否则{
serviceApi.registerCategory(类别名称);
}
}捕获(业务异常e){
日志错误(e);
}
}
}
也许还应该重构方法名:
handleCache()

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

handleCache(objectList)
-->与方法1类似


handleCache(null)
-->与方法2类似

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

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);
        }
    }
}
private void updateCache(列表对象列表){
ServiceApi ServiceApi=getService();
如果(serviceApi!=null){
试一试{
if(objectList!=null){
serviceApi.updateResources(objectList);
}
否则{
serviceApi.registerCategory(类别名称);
}
}捕获(业务异常e){
日志错误(e);
}
}
}
也许还应该重构方法名:
handleCache()

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

handleCache(objectList)
-->与方法1类似


handleCache(null)
-->与方法2类似

您可以将内部功能拉出到接口中:

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);
        }
    });
}
专用接口Op{
作废执行(ServiceApi ServiceApi);
}
静态空缓存(Op){
ServiceApi ServiceApi=getService();
如果(serviceApi!=null){
试一试{
op.perform(serviceApi);
}捕获(业务异常e){
日志错误(e);
}
}
}
私有void updateCache(列表对象列表){
缓存(新操作(){
@凌驾
公共作废执行(ServiceApi ServiceApi){
serviceApi.updateResources(objectList);
}
});
}
私有无效注册表缓存(){
缓存(新操作(){
@凌驾
公共作废执行(ServiceApi ServiceApi){
serviceApi.registerCategory(类别名称);
}
});
}
在Java8中,这两种方法变得非常简单和优雅

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

private void registerCache() {
    cache(serviceApi -> serviceApi.registerCategory(CATEGORY_NAME));
}
private void updateCache(列表对象列表){
缓存(serviceApi->serviceApi.updateResources(objectList));
}
私有无效注册表缓存(){
缓存(serviceApi->serviceApi.registerCategory(类别名称));
}

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

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);
        }
    });
}
专用接口Op{
作废执行(ServiceApi ServiceApi);
}
静态空缓存(Op){
ServiceApi ServiceApi=getService();
如果(serviceApi!=null){
试一试{
op.perform(serviceApi);
}捕获(业务异常e){
日志错误(e);
}
}
}
私有void updateCache(列表对象列表){
缓存(新操作(){
@凌驾
公共作废执行(ServiceApi ServiceApi){
serviceApi.updateResources(objectList);
}
});
}
私有无效注册表缓存(){
缓存(新操作(){
@凌驾
公共作废执行(ServiceApi ServiceApi){
serviceApi.registerCategory(类别名称);
}
});
}
在Java8中,这两种方法变得非常简单和优雅

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

private void registerCache() {
    cache(serviceApi -> serviceApi.registerCategory(CATEGORY_NAME));
}
private void updateCache(列表对象列表){
缓存(serviceApi->serviceApi.updateResources(objectList));
}
私有无效注册表缓存(){
缓存(serviceApi->serviceApi.registerCategory(类别名称));
}

如果要重构这两个方法,我会将它们区分开来。它们的意图是不同的,因此为了可读性,方法名称应该反映这一点。但是我要改变这两种方法的共同点:错误处理。如果服务不存在或抛出BusinessException,则调用方不会收到任何通知。我会让serviceApi==null,BusinessException会从方法中抛出一些东西,这样您的调用者就会得到通知。坚决建议:)如果我要重构这两个方法,我会让它们保持不同。它们的意图是不同的,因此为了可读性,方法名称应该反映这一点。但是我要改变这两种方法的共同点:错误处理。如果服务不存在或抛出BusinessException,则调用方不会收到任何通知。我会让serviceApi==null大小写和BusinessException从方法中抛出一些东西,以便您的调用方得到通知。坚定地建议:)谢谢!这很有帮助。我忽略了这一点,但是
serviceApi
是一个OSGi服务,每次使用都需要查找它。在Java 8示例中,
serviceApi
是一个类字段吗?@fojalar-
serviceApi
是刚刚获得的全新字段,并在
op.perform(serviceApi)时传递给
op
发生。它应该以与原始代码完全相同的方式运行。首先看一下Java-7版本以确认。谢谢!这很有帮助。我忽略了这一点,但是
serviceApi
是一个OSGi服务,每次使用都需要查找它。在Java 8示例中,
serviceApi
是一个类字段吗?@fojalar-
serviceApi
是刚刚获得的全新字段,并在
op.perform(serviceApi)时传递给
op
发生。它应该以与原始代码完全相同的方式运行。首先查看Java-7版本以确认。