文档章节

领域驱动中的“贫血症和失忆症” --实践领域驱动--原文

 还仙
发布于 10/14 11:59
字数 1158
阅读 12
收藏 0

贫血症严重危害着人类健康,并且伴随有危险的副作用。当贫血领域对象被首次提出来时,它并不是一个博得赞美的词汇,它描述的是一个缺少内在行为领域对象。奇怪的是,人们对于贫血领域对象的态度褒贬不一。问题在于,多数开发者认为这样的领域对象是正常的,他们并没有意识到这是一个严重的问题。
你是否想知道你所建模型的健康状况呢?如果你突然患上了技术上的“忧郁症”,这里你可以做个自我检查。你可能心情愉悦,也可能无比恐惧。通过表1.2中的步骤开始检查吧。

表1.2领域对象病例

病情描述 YES/NO
你的领域对象是不是主要是些共有的getter和setter方法,并且几乎没有业务逻辑,或者甚至完全没有业务逻辑--对象嘛,主要就是用来容纳属性值的?
软件组件经常使用的领域对象是否包含了系统主要的业务逻辑,并且多数情况下你需要调用那些getter和setter?你可能会讲这样的客户代码称为服务层(Service Layer)或者应用层(Application Layer)代码,也或者,如果这描述的是你的用户界面,请回答“Yes”,然后好好反省一下,告诫自己一定不要再这么做了。
提示:正确的答案是:要么两项均为“Yes”,要么均为“No”。
如果你对以上两个问题的答案都是“NO”,表明你的领域对象是健康的。
如果都是“Yes”,表明你的领域对象已经病得不轻了,这便是贫血对象。
如果你对其中一个回答“Yes”,而另外一个回答“No”,你可能是在自欺或者患上了贫血症导致的神经系统紊乱,此时你应该怎么办呢?回到第一个问题重新来一遍,不要着急,要确保对两个问题都回答“YES”。
正如[Fowler, Anemic]所说,贫血领域对象是不好的,因为你花了很大的成本来开发领域对象,但是从中却获益甚少。比如,由于存在对象和数据存储之间的映射上。这样的代价太大了。而手艺太小,我得说,你所说的领域对象根本就不是领域对,而只是将关系型数据库中的模型映射到了对象上而已。这样的领域对象更像是活动记录,此时你可以对架构做个简化,然后使用事物脚本进行开发。
为什么会有贫血领域对象
如果说贫血领域对象是由设计不当造成的,为什么还有如此多的认为他们的领域对象是健康的呢?其中一个原因是:贫血领域对象反映了一种自然的过程式的编程风格,但我并不认为这是首要原因。软件业务中有很多开发者都学着示例代码做开发的,这并不是什么坏事,只要示例代码本身是好的。然而,通常情况是,示例代码只是用尽可能简单的方式来展示某个特定的概念或者API特性,而并不强调要遵循多好的设计原则。一些极度简化的示例代码总是包含了大量的getter和setter,于是这些getter和setter随着示例代码每天被程序员们原封不动地来回复制。
还有历史的影响,Microsoft的Visual Basic对于我们现在软件开发产生了和大的影响。我并不是说Visual Basic 是们不好的语言和集成开发环境(IDE),因为它的缺失种搞笑的开发方式,并且在某些方面对软件开发产生过正面的影响。当然,有些人可能会拒绝VisualBasic的影响,但是最终它却间接地影响着每一个程序员。

© 著作权归作者所有

粉丝 0
博文 9
码字总数 10620
作品 0
大兴
程序员
私信 提问
IDDD 实现领域驱动设计-由贫血导致的失忆症

啰嗦几句 年前的时候,在和 netfocus 兄,以及对 DDD 感兴趣园友的探讨过程中,我发现自己有很多不足的地方,对 DDD 的了解也只是皮毛而已,代码写的少,DDD 的基本概念也不是很清楚,空有一...

范大脚脚
2017/11/07
0
0
DDD学一步写一篇--DDD开发实践流程

DDD大家讨论的比较多的一般都是DDD的思想和理论,很少有文章讨论具体是如何实施和落地,所以这也导致很多同学看完了Evans经典巨著后对DDD还是不知道如何去实施。这篇文章我们讨论下DDD的实施...

monkey01
2018/11/25
0
0
一杯奶茶的故事【下篇】(日常推理向悬疑小说)

上篇在这里噗噗噗:一杯奶茶的故事(日常推理向悬疑小说) 想了很多 happy ending 的剧情都觉得太扯,希望这个结局不算太烂尾。(捂脸逃走) (五) “关于老板,除了烦躁以外,好像还有一点...

万千百
2017/12/21
0
0
什么是领域驱动设计(Domain Driven Design)?

本文是从 What is Domain Driven Design? 这篇文章翻译而来。 ”… 在很多领域,专家的作用体现在他们的专业知识上而不是智力上。“ Don Reinertsen 领域驱动设计(Domain Driven Design)是一...

红薯
2011/05/25
3.7K
9
DDD领域驱动设计(Domain Driven Design)(转)

摘要 本文将介绍领域驱动设计(Domain Driven Design)的官方参考架构,该架构分成了Interfaces、Applications和Domain三层以及包含各类基础设施的 Infrastructure。本文会对架构中一些重要组件...

mcy247
2017/12/04
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Kafka实战(五) - 核心API及适用场景全面解析

1 四个核心API ● Producer API 允许一个应用程序发布一串流式的数据到一个或者多个Kafka topic。 ● Consumer API 允许一个应用程序订阅一个或多个topic ,并且对发布给他们的流式数据进行处...

JavaEdge
今天
11
0
实现线程的第三种方式——Callable & Future

Callable Runnable 封装一个异步运行的任务, 可以把它想象成为一个没有参数和返回值的异步方 法。Callable 与 Runnable 类似, 但是有返回值。Callable 接口是一个参数化的类型, 只有一 个...

ytuan996
今天
11
0
OSChina 周六乱弹 —— 不要摁F了!

Osc乱弹歌单(2019)请戳(这里) 【今日歌曲】 @巴拉迪维 : 朴树写的词曲都给人一种莫名的失落感,不过这首歌他自己却没有唱,换成赵传这种高音阶嘶喊的确很好,低沉但却有力,老男人的呐喊...

小小编辑
今天
22
0
Android Binder机制 - interface_cast和asBinder讲解

研究Android底层代码时,尤其是Binder跨进程通信时,经常会发现interface_cast和asBinder,很容易被这两个函数绕晕,下面来讲解一下: interface_cast 下面根据下述ICameraClient例子进行分析...

天王盖地虎626
昨天
13
0
计算机实现原理专题--存储器的实现(二)

计算机实现原理专题--存储器的实现(一)中描述了一种可以记住输入端变化的装置。现需要对其功能进行扩充,我们将上面的开关定义为置位,下面的开关定义为复位,然后需要增加一个保持位,当保...

FAT_mt
昨天
9
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部