假设我在买咖啡。咖啡有几种类型(中等烘焙的,深烤的),但有时我想引用所有类型的咖啡(就像我有一种咖啡“分组”)。考虑到DDD的概念,咖啡A1不同于所有类型的咖啡,所以这就是它们的身份,我需要引用特定和通用的咖啡实体。
我想我可以像这样映射它:
class Coffee{
private CoffeeId id;
@NotNull
private Code code;
private SubGroup subGroup;
}假设我有一个实体PriceTable,有时我需要为所有类型的咖啡赋值,有时还需要某些特定类型的值。这意味着在一些用例中,我只需要引用中等烘焙的咖啡,而在另一种情况下,我需要引用所有种类的咖啡。对于最后一种情况,我认为属性"subGroup“可能是"null”。
有人找到了另一种方法将这些用例转换为实体吗?我想过一个策略模式,但是我不能得到它的代码
发布于 2021-06-18 12:34:25
这意味着在一些用例中,我只需要引用中等烘焙的咖啡,而在>另一种情况下,我需要引用所有种类的咖啡。
每当您想要将数据/行为与通常尖叫specifications或谓词的元素子集相匹配时。
咖啡将具有一些属性,例如type、roast等,然后规范/谓词可以利用这些属性进行匹配。
在JavaScript中有一个非常简单的例子...
const coffees = [
{ id: 1, type: 'espresso', roast: 'medium' },
{ id: 2, type: 'latte', roast: 'dark' },
{ id: 3, type: 'cappuccino', roast: 'light' }
];
const prices = [
[c => c.id === 1, 6],
[c => c.type === 'latte', 5],
[c => true, 3]
];
const discounts = [
[c => c.roast === 'light' || c.roast === 'medium', 0.15],
[c => true, 0]
];
function priceOf(coffee) {
const price = prices.find(([predicate, price]) => predicate(coffee))[1];
return price - (price * discountFor(coffee));
}
function discountFor(coffee) {
return discounts.find(([predicate, discount]) => predicate(coffee))[1];
}
console.log(priceOf(coffees[0]));
console.log(priceOf(coffees[1]));
console.log(priceOf(coffees[2]));
显然,这是一个非常做作的例子,但你应该明白其中的意思。对于更复杂的规范,您可以确定哪个更通用,哪个更具体,并基于此应用匹配顺序规则(例如,更具体的规则胜出)。
老实说,我不完全确定我完全理解了你的问题,但希望这能有所帮助!
发布于 2021-06-28 18:05:06
如果没有特定用例的更多精确度,就很难回答。
首先,如果你需要在一个对象中放入null,这肯定是一个设计问题。
为了避免这种情况,我们可以设想这样的解决方案:
class Coffee {
private CoffeeId id;
private Code code;
}
class CoffeeWithSubGroup {
private Coffee coffee;
private SubGroup subgroup;
}你购买咖啡的领域需要更多的词汇和设计。
例如,如果你想在咖啡上应用折扣,你可以有一个SubGroupDiscount类,同样,你可以有一个GeneralDiscount来在饮料上应用折扣(咖啡的一个可能的接口?)
在这种情况下,从存储库中检索所有Coffee对象并应用所有折扣会更容易。
一般来说,当你尝试应用DDD时,从策略模式(普适语言,有界上下文和上下文映射)开始,那么我认为实现起来会更容易。
https://stackoverflow.com/questions/68027916
复制相似问题