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;
}
我被要求重构这个方法(这里简化),因为:
不应在接口中使用此类复杂类型。 此外,它使代码难以调试。 该实现应隐藏在类中。
我不确定重构这个是否合理。
你是否同意重构这种方法?
如果是,您会使用什么方法?如何让这更容易调试?
由于
答案 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的集合。