有限的上下文和域专家的参与

时间:2016-08-19 09:05:57

标签: architecture domain-driven-design

虽然我们正在推断有界上下文,但域专家应该或必须理解“有界上下文”,“问题空间”,“子域”等术语。甚至,什么构成有界上下文或子域?

例如,在创建Clinic系统域时,子域将是预约系统,患者管理。所以问题是我应该告诉我的领域专家我是一名开发人员,我将问题分成更小的子域,边界环境(预约系统)将构成患者和计费环境。这里的“背景图”是等等。

基本上,如果域专家关心我是遵循DDD方法还是CRUD开发方法,或者换句话说,应该在无处不在的语言中包含术语“有界上下文”,“子域”等吗?

4 个答案:

答案 0 :(得分:3)

领域专家应该了解问题空间,但他们不应该知道解决方案空间。

域和子域描述问题空间。我想不出一种方法可以与专家讨论业务的不同部分,而不会给这些部分赋予通用名称。子域名是我们在DDD中的词,为什么不使用它?子域名通常也与公司中的不同团队或部门相匹配,这肯定会在与专家的讨论中出现。

这样的句子中
  
      
  • 此团队处理发票[...]

  •   
  • 好的,现在我们完成了购买[...],让我们继续购买[...]

  •   
  • 此功能是否属于约会[...]?

  •   

你需要一些概念来填补空白。

相反,有界上下文是在解决方案领域。我可以理解为什么你会以这些条款与QA人员或CTO谈话,而不是商业专家。它与提及数据库,Web服务器或消息队列相同。如果他们感到好奇,专家会想知道更多,但你不应该根据他们的理解来理解它。

答案 1 :(得分:2)

“DDD语言”是DDD书中的无处不在的语言,而不是开发人员的元数据术语。

埃里克埃文斯非常清楚这个话题。第2章,“无所不在的语言”:

  

领域专家应该反对那些尴尬的术语或结构   或不足以传达领域理解;开发者应该关注   因为模糊或不一致会使设计绊倒。

查看同一章中“One team,one language”段落中的图表,了解UL是什么。它包含“有界上下文的名称”(即您的示例中为"Appointment system""Patient management"),但不包括术语"Bounded Context"

领域专家与其脑细胞有其他重要的事情,而不是学习我们的行话。事实上,她的工作非常复杂,你正在开发一个自动化系统。

怜悯地说"Appointment system"代替"sub-domain",或"In <specific case> the Order moves from Appointment system to Patient management department"代替"This Order is an interface point on a cross-domain boundary"。这对你们两个都有帮助。

答案 2 :(得分:1)

我认为你应该与领域专家分享有界的上下文和子域名。 DDD背后的想法是共享和认可的知识。

但是,我不认为你必须使用精确的术语'有界上下文'和'子域'。您可以使用这些,这些可能是无处不在的语言 - 如果有用的话。我认为这是一个关于你的领域专家如何理解这些术语的问题,如果你应该使用不同的术语来让他们更容易理解。

答案 3 :(得分:1)

无所不在的语言

根据我的理解,泛在语言(UL)是一套非常强大的语言工具,可以与问题领域专家进行有效协作。我会将UL映像为开发人员和领域专家之间的语言代理或翻译服务。因此,UL不应包含任何与编程相关的技术术语,而应包含域概念。

当开发人员考虑域概念时给你一个例子:

  

在处理PatientRequiresAppointment模块中的Appointment命令时,AppointmentDomainService应该检查Patient的SSN-id是否有效且有已根据收到的DTO属性付款。

如果我们尝试将其翻译为更适合域名的语言:

  

当检查患者的社会保险号并确认其有效性时,预约条目得到确认。

现在这个版本是用技术术语清除的,但它可能会引入两个未知的动词。检查和确认这些应与领域专家协调。通过这种方式,您的域的UL将不断重新变形,并且当您注意到您使用某种重载术语时(例如:第一个示例中的AppointmentDomainService),将会引入或删除新的动词/名词。

到目前为止,您可以了解口语UL的重要性,接下来要回答的是:

您是否应该与域专家一起使用DDD术语?

DDD的一个关键概念是协作!所以,是的,您应该与您的领域专家密切合作,甚至教他们所谓的有界背景的见解。我相信从长远来看,这对团队来说是一个附加值,因为他们还将了解给定上下文的界限,并且您还将了解问题域的这个区域在他们的业务中是如何工作的。

结语:DDD可能为您的团队带来的其他一些价值

我将尝试解释通过在项目的重点部分应用DDD所获得的一些成功。

  • 明确且准确的上下文边界:上面各节中应用于团队流程的内容可能会产生干净纯净的域模型,专注于具有严格定义边界的实际域上下文帮助将重点解决方案引入给定的业务问题!一般而言,这可能意味着干净和纯粹的代码旨在更容易测试,这可能会带来更少的错误和更快的交付时间。这份清单可以无休止地继续......
  • 敏捷:DDD对我来说最大的好处之一就是了解我如何能够更敏捷。在这种情况下敏捷可能意味着,例如,你可以学习如何仔细平衡在对业务问题进行建模时,您可以通过与域专家密切合作来迭代地进行优化。我还通过不断提供新功能学会了如何变得更敏捷。这可能表明,您可以通过说服这些附加值来与业务合作伙伴签订合同,从而学习更灵活的新方法。