2017-07-27 85 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