簡體   English   中英

從域模型中檢索集合中的項目的最佳實踐是什么?

[英]What is the best practice for retrieving an item in a collection from a domain model?

從具有指定屬性的域對象內的集合中檢索對象的最佳實踐是什么?

例如,我們有一個汽車保險應用程序,該應用程序分為兩類:具有汽車列表的人員。 如果我總是需要從具有指定VIN的人員處取回汽車,那么實現該方法的最佳方法是什么? 我在下面提供了一些示例-歡迎其他示例

例子1
在Person實體內添加新方法以檢索VIN


    public class Person
    {
         private HashSet<Car> cars = new HashSet<Car>();

         public Set<Car> getCars()
         {
              return this.cars;
         }

         public Car getCarByVin(VIN vin)
         {
              //loop over cars and retrieve the car with the VIN
         }
    }

因此,從應用程序開始,該過程將...


    VIN vin = new VIN(...);
    Person person = personDao.getPerson();
    Car personCar = person.getCarByVin(vin); 

例子2
在Person實體中創建一個新的列表集合,並將VIN檢索方法添加到該集合中


    public class Person
    {
         private CarSet cars = new CarSet();

         public CarSet getCars()
         {
              return this.cars;
         }
    }

    public class CarSet
         implements Set<Car>
    {
         //implement required methods for Set

         public Car byVin(VIN vin)
         {
              //loop over set and retrieve the car with the VIN
         }
    }

因此,從應用程序來看,過程將是


    VIN vin = new VIN(...);
    Person person = personDao.getPerson();
    Car personCar = person.getCars().byVin(vin); 

我認為Demeter定律適用於此,這有利於第一個示例。 每當您進行鏈接時,例如foo.getBar()。doBlah(),都將違反Demeter法則。 這顯然不是法律,但對於一個類必須了解太多有關另一個類中的位的詳細信息,這是一個很好的指導。

當您說出具有指定VIN的Car時,您就讓我認為這是Entity,而不是值對象...。此外,如果您需要“檢索”它,則意味着它是Entity,而不是值。 通常不需要檢索值對象,如果需要,可以只動態地創建一個。...您確定清楚DDD中實體和值元素之間的區別嗎?

添加:然后,如果Car是一個實體,那么從您所說的來看,它似乎應該是一個以Person為集合根的集合中的成員實體。 (盡管它可能是其自身集合的根)在任何情況下,都應構建Person存儲庫,以便在您獲取集合時,它也可以獲取該人的Cars。 Person類應具有類型為Cars或CarCollection的屬性,該屬性名為Cars或OwnedCars或其他名稱,並且Type(Cars或CarCollection)應具有索引器,該索引器可基於VIN檢索特定的Car。

public class Person    
{
   private int persId;
   // other fields
   private Cars cars;

   public Cars Cars { get; set; }
   // all other stuff
}

public class Cars: Collection<Car> // or 'public class Cars: List<Car>' or ...
{
    public bool Contains(string VinNumber]
    {
        foreach (Car c in this)
           if (c.VinNumber = VinNumber) return true;
        return false;
    }
    public Car this[string VinNumber]
    {
        get 
        {
            foreach (Car c in this)
                if (c.VinNumber = VinNumber) return c;
            return null;
        }
    }
}

在這種情況下,我發現將搜索方法放在對象本身上要容易得多,而不是試圖對集合類進行子類化(並帶來可能由看似簡單的決定引起的所有設計決定更改)。

以上所有假設均假定您確實需要基本設計。 我通常更喜歡某種外觀,該外觀使我可以按人和vin搜索車輛,而不是搜索人對象本身。

我真的不喜歡您使用CarSet的設計。 我不希望看到沒有專門行為的專門班級。 誠然,這是一個簡單的例子來說明這一點。

但我也反對您的“人”示例。 您具有對HashSet的私有引用,該引用應具有Set的靜態類型。 然后,您將獲得一個getter,該getter返回對該私有數據成員的引用。 您應該意識到這是任何人都可以操縱的可變參考。 您的私人修飾語毫無意義。

在這種情況下,正確的做法是使用java.util.Collections類返回對不可變Set的引用,以防止客戶端修改私有狀態。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM