2016-03-07 69 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