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