2016-03-07 70 views
-1

好吧,我現在需要重構一個類,並在最好的情況下使用設計模式。我想這樣做,以演示如何重構傳統代碼以服務於SOLID原則。直到現在,我所能做的只是提取方法。我有一個代碼片段就在這裏,這基本上填滿了數據的一個對象從另一個對象:重構時使用設計模式

 try { 

      final Object response = service.getOutput(InputData); 

      if (response instanceof OutputData) { 
      final OutputData output = (OutputData) response; 
      data.Quantity(output.getQuote().getQuantity()); 
      data.setDate(output.getQuote().getDate()); 
      data.setMaterial(productData.getCode()); 

      if (isValidCustomer(output.getQuote())) { 
       data.setName(output.getQuote().getName()); 
      } else { 
       data.setName(""); 
      } 

      if (output.getQuote().getLimit() != null) { 
       data.setLimit(output.getQuote().getLimit().trim()); 
      } 

     } 
     catch (final Exception e){ 
      //... 
     } 

     if (productPrice != null) { 
       data.setProductPrice(productPrice); 
       data.setTotalPrice(calculateTotalPrice(data, productPrice, quantity)); 
     } 

什麼是你能在這種情況下使用設計模式?問題是,該項目是基於Spring,所以它並不真正處理構造函數。正如你所看到的,已經有一些提取的方法,比如calculateTotalPrice等等。

回答

3

首先,雖然嘗試讓您的代碼儘可能尊重SOLID原則是件好事,但您並不需要始終使用設計模式來處理所有事情。事情可以在需要時手動完成,特別是當它是一次性的時候。實用主義第一。

話雖如此,對於這樣的代碼片段,您可能需要查看創建模式,如FactoryBuilder模式。

在你的情況下,工廠將收到一個OutputData對象,並返回一個充滿肉質的data對象(我不太清楚它的類型),執行你在代碼中所做的所有檢查。通過這種方式,您可以從應用程序的任何部分創建這些類型的對象,始終以相同的方式並始終遵守相同的約束條件。

對於Builder模式,它會給你更多的靈活性來創建你的對象。它的要點是,每一個方法返回的對象本身,允許方法鏈接:

DataBuilder builder = new DataBuilder(); 
Data data = builder 
    .withQuantity(output.getQuote().getQuantity()) 
    .onDate(output.getQuote().getDate()) 
    ... 
    .build(); 

順便提一下,代碼的這最後一塊具有堅實的原則違背,這是迪米特法則。理想情況下,使用DataBuilder的類將收到一個將從中查詢數據的Quote對象。在這種情況下,這個班級知道output的結構,也知道quote的結構,這通常是可以改進的設計氣味。

關於你的Spring評論,我不太明白。你使用Spring的事實並不意味着你應該忽略構造函數。事實上,重構代碼的最好方法是使用依賴注入,強制所有數據通過構造函數傳遞,確保其正確性。

+0

嗯,它更多的是展示,如何使用它,以及它在理論上會帶來哪些好處。我用Factory或Builder看到的問題是,他們經常使用構造函數來創建一個Object。 – user5417542