首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >DDD建模-通用和特定

DDD建模-通用和特定
EN

Stack Overflow用户
提问于 2021-06-18 08:29:17
回答 2查看 46关注 0票数 1

假设我在买咖啡。咖啡有几种类型(中等烘焙的,深烤的),但有时我想引用所有类型的咖啡(就像我有一种咖啡“分组”)。考虑到DDD的概念,咖啡A1不同于所有类型的咖啡,所以这就是它们的身份,我需要引用特定和通用的咖啡实体。

我想我可以像这样映射它:

代码语言:javascript
复制
class Coffee{ 
  private CoffeeId id;
  @NotNull
  private Code code;
  private SubGroup subGroup; 
}

假设我有一个实体PriceTable,有时我需要为所有类型的咖啡赋值,有时还需要某些特定类型的值。这意味着在一些用例中,我只需要引用中等烘焙的咖啡,而在另一种情况下,我需要引用所有种类的咖啡。对于最后一种情况,我认为属性"subGroup“可能是"null”。

有人找到了另一种方法将这些用例转换为实体吗?我想过一个策略模式,但是我不能得到它的代码

EN

回答 2

Stack Overflow用户

发布于 2021-06-18 12:34:25

这意味着在一些用例中,我只需要引用中等烘焙的咖啡,而在>另一种情况下,我需要引用所有种类的咖啡。

每当您想要将数据/行为与通常尖叫specifications或谓词的元素子集相匹配时。

咖啡将具有一些属性,例如typeroast等,然后规范/谓词可以利用这些属性进行匹配。

在JavaScript中有一个非常简单的例子...

代码语言: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]));

显然,这是一个非常做作的例子,但你应该明白其中的意思。对于更复杂的规范,您可以确定哪个更通用,哪个更具体,并基于此应用匹配顺序规则(例如,更具体的规则胜出)。

老实说,我不完全确定我完全理解了你的问题,但希望这能有所帮助!

票数 1
EN

Stack Overflow用户

发布于 2021-06-28 18:05:06

如果没有特定用例的更多精确度,就很难回答。

首先,如果你需要在一个对象中放入null,这肯定是一个设计问题。

为了避免这种情况,我们可以设想这样的解决方案:

代码语言:javascript
复制
class Coffee { 
  private CoffeeId id;
  private Code code;
}

class CoffeeWithSubGroup { 
  private Coffee coffee;
  private SubGroup subgroup;
}

你购买咖啡的领域需要更多的词汇和设计。

例如,如果你想在咖啡上应用折扣,你可以有一个SubGroupDiscount类,同样,你可以有一个GeneralDiscount来在饮料上应用折扣(咖啡的一个可能的接口?)

在这种情况下,从存储库中检索所有Coffee对象并应用所有折扣会更容易。

一般来说,当你尝试应用DDD时,从策略模式(普适语言,有界上下文和上下文映射)开始,那么我认为实现起来会更容易。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68027916

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档