Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/EmptyTag/131.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Domain driven design 这真的是DDD吗?_Domain Driven Design - Fatal编程技术网

Domain driven design 这真的是DDD吗?

Domain driven design 这真的是DDD吗?,domain-driven-design,Domain Driven Design,我80%确信我不应该问这个问题,因为它可能会给人以负面的印象,我的意思是对任何人,特别是这本书的作者不尊重。我已经看到好几篇文章推荐这个和它的同伴。我没有读过这本书,但我今天花了几个小时研究这个项目。虽然它看起来非常完整,但我很难理解各种细节的分散程度。我在自己的设计中苦苦挣扎,如果一个实体发生了变化,我必须做出多大的改变,而这个项目并不能让我作为一个解决方案感到非常舒服 例如,有一个从Person继承的Employee对象。此人有一个名为、姓为等的构造函数,因此,员工也是如此。“员工私有”是名

我80%确信我不应该问这个问题,因为它可能会给人以负面的印象,我的意思是对任何人,特别是这本书的作者不尊重。我已经看到好几篇文章推荐这个和它的同伴。我没有读过这本书,但我今天花了几个小时研究这个项目。虽然它看起来非常完整,但我很难理解各种细节的分散程度。我在自己的设计中苦苦挣扎,如果一个实体发生了变化,我必须做出多大的改变,而这个项目并不能让我作为一个解决方案感到非常舒服

例如,有一个从Person继承的Employee对象。此人有一个名为、姓为等的构造函数,因此,员工也是如此。“员工私有”是名、姓的成员,加上相同名称的公共属性

有一个EmployeeFactory,它知道Employee和Person属性以及SQL列名(用于从读取器中提取值)

有一个EmployeeRepository,其中包含未实现的PersistNewItem和PersistUpdateItem方法,我怀疑如果实现这些方法,会像我在CompanyRepository中看到的那样为INSERT和UPDATE语句构建SQL。它们将属性写入字符串以构建SQL

“数据契约”PersonContract与Person具有相同的私有成员和公共属性,而EmployeeContract与Employee does Person一样继承自PersonContract,其公共属性反映实体

有一个静态“Converter”类,它具有将实体映射到契约的静态方法,包括

EmployeeContract ToEmployeeContract(Employee employee) 
将字段从一个复制到另一个,包括人员字段。可能有另一种方法——不确定

我认为也有单元测试

我总共统计了5-10个类、方法和构造函数,它们对实体属性有详细的了解。也许它们是自动生成的——不确定。如果我需要向Person添加“敬礼”或其他属性,我必须调整所有这些类/方法吗?我肯定我会忘记一些事情

再一次,我的意思是没有不尊重,这似乎是一个非常彻底的,详细的例子为这本书。DDD就是这样做的吗?

DDD已经足够新了(至少在某些意义上),现在说“它是如何做到的”可能还为时过早。不过,这个想法已经存在了相当长的一段时间,尽管我们没有给它起一个很酷的名字

在任何情况下,简短的回答(IMAO)是“是的,但是……”进行领域驱动设计的想法是非常明确地对领域建模。你所看到的是一个领域模型,也就是说一个面向对象的模型,用问题领域的语言描述问题领域。其思想是领域模型,因为它对“真实世界”建模,对变化相对不敏感,并且倾向于将变化本地化。因此,例如,如果您对员工的概念发生了变化,可能通过添加邮寄地址和物理地址,那么这些变化将相对本地化

但是,一旦您拥有了该模型,您就拥有了我所维护的体系结构决策。例如,您有一个未实现的持久层,它实际上可能只是SQL的构造。它也可以是一个Hibernate层,或者使用Python pickle,甚至可以是一个像GoogleAppEngine分布式表结构这样的任意结构

问题是,这些决策与领域建模决策相比,是单独做出的,并且具有其他的基本原理


我已经做了一些很好的实验,结果是用Python做域模型,然后用它构建一个模拟器,而不是实现最终的系统。这有助于客户进行实验,也有可能让您对最终实现必须确定的内容进行定量评估。

领域驱动设计非常简单。它说:让你的模型类反映真实世界。因此,如果您有Employees,请创建Employees类,并确保它包含赋予其“Employeeness”属性的属性


您要问的问题不是关于DDD,而是关于类体系结构。我认为你质疑关于你正在研究的类的一些决定是正确的,但是它与DDD没有特别的关系。一般来说,DDD与OOP编程设计模式更为相关。

对我来说,DDD不同于“纯粹的”模型驱动设计的是“聚合根”的概念,即应用程序只允许保存对聚合根的引用,并且通常只有聚合根类的存储库,不是聚合根使用的类


这大大地清理了代码;另一种选择是每个模型类的存储库,它“仅仅”是一个分层设计,而不是DDD

我不认为它真的是什么新东西,因为它是(特别是)商业编码主流的新东西。特定领域的语言设计(使用适当的元编程语言)和领域驱动的对象模型在一些语言社区已经做了几十年的基本工作。见鬼,即使在商业工作中,至少在一些地方。90年代初,我在IBM咨询公司推动“激进的领域模型”。在我看来,我们谈论的很多东西都是针对不太新的想法的新术语。但这没关系——有时候,一个好的名字可以促进一个好的想法。顺便说一句,我投了你一票,因为我认为这是一个很好的问题。好的观点。我想,正如其他人所说,这是一个权衡问题——孤立“员工性”的目标与关注点的分离是不一致的。持久化层可能必须像用户界面一样了解“员工特性”等。因此,可能无法像“感觉正确”那样将其隔离。我认为这不是真的。持久化层需要知道如何持久化东西,就这样。我