在面向对象的编程的概念中,应用程序是对现实世界的抽象。我们经常将真实的事物建模到编程语言中的类/对象(“什么”)中,事物的行为将模型作为模型作为模型作为模型作为模型。面向对象的编程具有三个主要的基本特征(包装,继承/组合,多态性)和五个基本原则(单个职责的原理,开放和封闭的原则,REN替代原则,依赖原则倒置和界面原理分离原理),但知道这些秩序不足以使我们设计一个好的程序,因此出现了许多方法。
最近,最热的字段是字段驱动的设计(DDD)。其中,战术建模提出的物理,有价值的对象,聚合和其他建模方法可以很好地指导我们设计一个符合现实世界的现场模型。但是,DDD并非普遍。在某些应用方案中,根据传统的战术建模/面向对象的方法,还会出现诸如维护不良和违反单个职责原理等问题。
本文描述的DCI建模方法可以被视为战术建模的辅助。在某些情况下,它可以弥补DDD战术建模的一些缺点。下一步,我们将介绍DCI如何通过案例解决DDD战术建模的缺点。
本文中涉及的代码档案是在GitHub项目中:https://github.com/ruanrunxue/dci-rachitecture-implementation-
考虑到一个普通人的日常生活,他将在学校上学,他将在暑假去公司,下班后去公园。他还将像普通人一样在家吃饭。当然,一个人的生活远不止于此。为了解释便利性,本文仅构建了这些典型场景的示例。
根据DDD战术建模的想法,首先,我们将列出案例的共同语言:
人,身份证,银行卡,房屋,饮食,睡觉,玩游戏,学校,学校卡,学生卡,学习,考试,公司,工作室,工作室,工作室,锻炼卡,工作卡,工作
然后,我们使用战术建模技术(值对象,实体,聚合,现场服务,资源库)来对通用语言的字段进行建模。
DDD建模后的代码目录结构如下:
我们有身份证,学生卡,工作人员和银行卡的概念。
然后,我们将一个人置于一个实体中。他包括对象卡和学生卡以及其他值。它还具有诸如饮食和睡眠之类的行为:
最后,我们组成了学校,公司,公园和房屋建筑模型的聚合。汇总由一个或多个实体和价值对象组成,以组织它们以完成特定的业务逻辑:
然后,模型建模基于上述方法:
运行模型的方法如下:
在上一节中,我们使用DDD的战术建模来完成案例模型。该模型的核心是人实体。它具有诸如IdentityCard,StudentCard和业务行为之类的数据属性,例如EAT(),studion(),work(),这与现实世界的定义非常一致。这也由大学派系站提倡。同时,数据属性和业务行为的拥塞模型。
但是,拥塞模型并不完美,它也有很多问题,典型的是这两个:
人们的实体承担了太多的责任,使它成为了真正的上帝阶级。想象许多“人”中包含的属性和行为。如果您想建模一个完整的模型,则有许多属性和方法,您无法想象。上帝阶级违反了单一职责的原则,并将导致代码的维护不佳。
学校和公司应彼此独立。学校不必关注是否工作,公司不必注意考试。但是现在,因为它们都依赖于人的实体,学校可以称呼工作()和官方()方法与公司有关,反之亦然。这导致模块之间不必要的耦合,违反了接口隔离的原则。
这些问题对于工程是不可接受的。从软件工程的角度来看,它们将使代码难以维护。解决此类问题的方法更为普遍,例如将实体的行为构建为域服务,例如:
这种建模方法解决了上述两个问题,但它也已成为一个被称为贫血模型:人们已成为没有任何业务行为的纯数据类别。在人类心理学方面,这种模型无法在现实世界中建立,而且它并不容易理解,因此受到大学学校的抵制。
到目前为止,贫血模型和拥塞模型具有自己的优势和缺点。没有人用于工程和大学派系,无法互相说服。次要,这是本文的主角。
DCI(数据,上下文,交互式)体系结构是面向对象的软件体系结构模式。它是第一次在文章“ DCI体系结构:面向对象的编程的新愿景”中首次提出的。与传统对象的对象相关联,DCI可以更好地对数据和行为之间的关系进行建模,这更有可能是更有可能的要理解。
我们对这个角色扮演模式并不陌生,在现实世界中,它可以看到它。例如,演员可以在这部电影中扮演英雄的角色,也可以在另一部电影中扮演小人的角色。
DCI认为,角色的建模应针对上下文,因为特定的业务行为只能在特定的业务场景中有意义。通过建模角色,我们可以将现场对象的方法分开,从而避免上帝的外观。字段对象通过组合或继承来集成角色,该组合能够扮演角色。
一方面,DCI架构使域模型易于通过角色扮演模型理解,另一方面,它通过“小物体和大物体”的方法避免了上帝的问题,从而解决了贫血模型和拥塞模型。此外,在根据角色分裂域对象的行为后,该模块具有较高的内部团聚和较低的耦合。
回到上一个案例,使用DCI的建模思维,我们可以根据不同的角色对“人”的几种行为进行分割。饮食,睡觉和玩游戏后,这是人类角色的一种行为。学习和考试是学生角色的行为;工作和下班是作为员工角色的行为;购买和游戏的门票是玩家的角色。在学校的场景中,这是学生的角色。在公司的场景中,员工的角色;玩家的角色。
应该注意的是,学生,员工和球员应具有人类角色的行为。例如,在学校里,学生也需要吃饭。
最后,根据DCI建模模型,应该这样:
在DCI模型中,人们不再是包含许多属性和方法的“上帝”。这些属性和方法分为多个角色,人们由这些角色组成。
此外,学校和公司不再耦合。学校只引用学生的话,并且不能称呼与公司相关工人有关的工作()和官方()方法。
DCI建模后的代码目录结构如下;
从代码目录结构的角度来看,DDD和DCI体系结构并不大,并且聚合目录已演变为上下文目录。VO目录已演变为数据目录;
首先,我们意识到人类,学生,工人和享受者的基本角色。
然后,如果我们意识到其他角色,我们需要注意,学生,工人和享受者无法直接结合人,否则人民的对象将具有4个人类的对象,这与该模型不一致:
为了解决此问题,我们介绍了xxxtrait接口:
学生,工人,享受者组合人类和通过撰写(人类贸易)方法注入特征。只要注入人类在同一人中,就可以解决此问题。
最后,实现此字段对象:
角色分裂之后,当房屋,学校,公司,公园和其他场景实施时,他们只需要依靠相应的角色即可。不再需要依靠人的目标:
运行模型的方法如下:
从上一篇文章中描述的场景中,我们可以发现传统的DDD/面向对象的设计方法在建模方面的建模不足,这导致了SO被称为贫血模型和拥塞模型。
DCI架构的出现弥补了这一点。它通过引入角色扮演的概念,不影响模型的正确性,从而巧妙地解决了神与模块之间的耦合问题。当然,DCI架构不是灵丹妙药。在行为较少的业务模型中,使用DCI进行建模是不合适的。
最后,将DCI体系结构汇总到一个句子中:对象(对象)在不同方案(cast)中扮演不同的角色(角色)。
1. DCI体系结构:面向对象的编程的新愿景,Trygve Reenskaug和James O. Coplien
2.软件设计的发展过程,_ 2 2 _ 2 _
3.在Golang中实现域对象,_晓3_
4. DCI:代码的理解力,切尔西
5. DCI在C ++中,MagicBowen
本文分享了真诚的Yunyun社区,作者:Yuan Yizi。