簡體   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