[英]What is the best practice to construct a Domain Object depending on external calls?
[英]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.