2017-07-27 88 views
0

我最近经历了一次代码审查,并坚决建议我将两种方法合并为一种。两种方法都是相同的,除了每个方法的调用外,其中一个方法不需要参数。将两种方法合并为一种

方法#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); 
     } 
    } 
} 

能这些甚至被有效地结合起来?

+1

如果我要重构这两种方法,我会让它们不同。他们的意图是不同的,所以为了可读性,方法名称应该反映这一点。但是我会改变这两种方法的共同部分:错误处理。如果服务不存在或抛出BusinessException,调用方不会收到任何通知。我有serviceApi == null的情况下,并且BusinessException抛出一些方法,所以你的调用者被告知。 –

+0

*坚决建议* :) – OldCurmudgeon

回答

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)); 
} 
+0

谢谢!这非常有帮助。我忽略提到这一点,但'serviceApi'是一个OSGi服务,需要在每次使用时查找。在你的Java 8例子中,'serviceApi'是一个类字段吗? – fojalar

+0

@fojalar - 'opaper(serviceApi);'发生时''serviceApi'是刚刚获得的新品,并传递给'op'。它的功能应与您的原始代码完全相同。首先查看Java-7版本以确认。 – OldCurmudgeon

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()

然后,您可以调用2种的方式方法:

handleCache(objectList) - >就像方法#1

handleCache(null) - >就像方法#2