繁体   English   中英

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

[英]How can I refactor a JAVA method that returns a nested MAP?

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;
    }

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

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

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

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

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

谢谢

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

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

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

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()方法,但是如果要保护来自客户端类的数据修改,则可以在构造函数中收集所有需要的数据。

看看提供的示例,我没有看到任何依赖于嵌套地图。 正如我从代码中看到的那样,每个产品只有一个结算日期,因此您的嵌套地图每个产品只有一个元素。 为了简单起见,只需再创建一个将保存开票日期和ServiceInterval的类 ,让我们称之为BillingServiceInterval并从您的方法返回Map<Product, BillingServiceInterval> 希望这可以帮助

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM