[英]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.