什么是领域,我习惯描述的是制药领域、环境领域、建筑领域、金融领域等,而在领域内,各种业务规则、业务知识盛行,如何有效的把控规则的变化,应对复杂知识,有一个很关键的四字词语,分而治之。分治法在很多场景下体现了其强大的作用力。领域本身很大,那就拆分,得到更小的领域,也即子域,如同递归调用一般,将一个复杂问题拆分单独求解,而最终将解汇总得到复杂问题解。
怎么拆,拆成怎么样合适,依据什么拆,这些在领域驱动设计中有了一套答案,虽然领域驱动设计不是银弹,但可以说的上是一套极好的系统方法论或称为架构设计的方法论。
领域驱动设计常以战略设计与战术设计来将整个领域展现的淋漓尽致,其作用范围既面向业务也面向技术。从战略角度(个人更喜欢称其为上帝视角)去规划系统、划分领域。而从战术角度则从技术层面来指导我们该如何去设计。
战略设计战略设计主要从高层俯视(上帝视角)我们的软件系统,就如同玩即时战略游戏般,可以一览地图全貌,以此来决定我们是要进攻还是防守哪个方向,同样,在软件中我们也可以以此来划分领域,确定权重方向。
统一语言提炼领域知识,怎么个提炼法,千万条罗马路,各有各的看家本领。像事件风暴方法,用例分析方法,用户故事,甚至是开大会,各种讨论会等,最终目的都是提炼出领域知识,而提炼过程中,达成描述上的一致性,包括系统目标、系统范围及系统所具有的功能。
这不是领域驱动设计所独有的,但却是软件开发中所必须的,为领域专家、业务分析人员、编码人员和测试人员等团队所有成员交流时构建统一频道。
领域/子域 领域拆分对于领域这个概念,习惯性会想到制药领域、环境领域、金融领域等这些概念,而领域本身所描述的是范围,是如同现实世界般的复杂,无边际。借助分治法,将问题逐级细分来降低业务和技术复杂度,将这复杂的世界划分出清晰的边界来,反过来控制着划分后不那么复杂的世界,也既领域拆分出细化后的子领域。
子域划分在实际解决问题时,我们也习惯将问题拆分,而怎么拆,基于什么原则拆,可能会依据相关性,权重,甚至分类原则等,对于系统而言,会从架构方面考虑,基础设施考虑等,在领域驱动设计中,更偏向基于业务拆分,降低业务复杂度,也分离技术实现的复杂度,依照业务拆分后的子领域,本身存在权重上的差异,依照重要性和功能划分为三类,投资占比也就有所不同。
核心域:其所体现的是核心服务,是代表着产品的核心竞争力。
支撑域:其所体现的是支撑服务,没它不行,但又达不到核心的价值,围绕着产品内部所需要,但又不能单独变更为第三方服务,即它不是一个通用的服务。
通用域:其所体现的中间件服务或第三方服务。本身可以通过现有的解决方案集成来完成的服务。
限界上下文深入到一个子域中,又是一片小天地,在这天地中,却又还是存在着因语义与语境上的差异,让一些概念在这子域中显得额外尴尬。在一个领域 / 子域中,我们会创建一个概念上的领域边界,在这个边界中,任何领域对象都只表示特定于该边界内部的确切含义。这样边界便称为限界上下文。
其本质上是限界+上下文,引用到张逸老师的一句话
上下文(Context)其实是动态的业务流程被边界(Bounded)静态切分的产物。
对于子域与上下文间的关系,看到很多书籍或是文章中所描述的都不一样,这块的争论也没有一个最终答案,个人更倾向于子域中划分上下文,从拆分角度来讲,这样理解更加简单。