如何重构一个返回嵌套MAP的JAVA方法?

时间:2016-08-18 18:52:34

标签: java collections hashmap refactoring

public Map<product, SortedMap<Date, ServiceInterval>> getServiceInterval(
            Contract pContract, BillCycle pBillCycle)
    {
        Map<product, SortedMap<Date, ServiceInterval>> returnMap = new HashMap<>();

        List<product> productList = getAllproducts(pContract);

        for (product product : productList)
        {
            Date billingDate = getBillingDate(product);

            createReturnMap(
                    product, returnMap,
                    billingDate, pBillCycle);
        }

        return returnMap;
    }

我被要求重构这个方法(这里简化),因为:

不应在接口中使用此类复杂类型。 此外,它使代码难以调试。 该实现应隐藏在类中。

我不确定重构这个是否合理。

你是否同意重构这种方法?

如果是,您会使用什么方法?如何让这更容易调试?

由于

4 个答案:

答案 0 :(得分:2)

您可以使用自己的类替换嵌套的Map,例如提供呼叫者所需方法的服务。该类很可能使用或扩展Map。然后签名变为

public Map<Product, Services> getServiceInterval(Contract pContract, BillCycle pBillCycle)

它使代码更容易阅读,但您花费了大量的开发时间和精力,而很可能没有为它添加太多功能。如果可以使用其他逻辑扩展Services类,则可能有意义。如果不了解更多细节,真的很难说。

答案 1 :(得分:1)

public Map<Product, SortedMap<Date, ServiceInterval>> getServiceInterval(
            Contract pContract, BillCycle pBillCycle)
  

不应在接口中使用这种复杂类型。除此之外   代码难以调试。应该隐藏实现   上课。

我同意。如果将服务提供给另一个客户端类,则使用作为映射映射的返回对象可能是麻烦的。因此,您可以通过为客户端类提供一种基本方法来检索与输入参数匹配的ServiceInterval实例,从而为您的映射使用包装器:因此在返回的对象中包含getServiceInterval()方法:public ServiceInterval getServiceInterval (Product product, Date date)
我建议将产品和日期作为输入参数,因为它是如何设置地图的地图:

Map<Product, SortedMap<Date, ServiceInterval>>

它是即时编写的伪代码,只是为了表明这个想法:

public ServiceIntervalByProduct getServiceInterval(
        Contract pContract, BillCycle pBillCycle)  {
    ServiceIntervalByProduct  returnMap = new ServiceIntervalByProduct();

    List<product> productList = getAllproducts(pContract);

    for (product product : productList)
    {
        Date billingDate = getBillingDate(product);

        createReturnMap(
                product, returnMap,
                billingDate, pBillCycle);
    }

    return returnMap;
}

// First level Wrapper class
public class ServiceIntervalsByProduct{

  private Map<Product, ServiceIntervalsByDate>> mapByProduct;   

  public void add(Product product, Date date, ServiceInterval serviceInterval) {
   // add in inner map
  }

 public ServiceInterval getServiceInterval (Product product, Date date){
   // get from inner map
    return mapByProduct.get(product).getServiceInterval (date);    
 }
}


// Second level Wrapper class
public class ServiceIntervalsByDate{
  private  SortedMap<Date, ServiceInterval>> mapByDate;

  public void add(Date date, ServiceInterval serviceInterval){
   // add in inner map    
  }

  public ServiceInterval getServiceInterval (Date date){
   // get from inner map
    return mapByDate.get(date);
   }

}

我在包装器中提供了add()方法,但是如果要保护来自客户端类的数据修改,可以在构造函数中收集所有需要的数据。

答案 2 :(得分:0)

查看提供的示例,我根本没有看到任何有嵌套地图的依据。正如我从代码中看到的那样,每个产品只有一个结算日期,因此您的嵌套地图每个产品只有一个元素。为了简单起见,只需再创建一个具有结算日期和 ServiceInterval 的课程,我们将其称为 BillingServiceInterval 并返回 Map<Product, BillingServiceInterval> < / strong>来自你的方法。希望这有帮助

答案 3 :(得分:0)

如果每个产品都有一个Date和一个ServiceInterval,您可以创建一个简单的bean。该方法将返回您选择的此类bean的集合。