BT

如何利用碎片时间提升技术认知与能力? 点击获取答案

书评:领域驱动设计与模式实战

| 作者 张逸 关注 9 他的粉丝 发布于 2010年6月9日. 估计阅读时间: 9 分钟 | GMTC大前端的下一站,PWA、Web框架、Node等最新最热的大前端话题邀你一起共同探讨。

最经典的书籍不一定最容易懂,正如阳春白雪之于下里巴人。在设计模式的世界中,GOF的《设计模式》永远都是人们推崇的经典,然而真正能够将开发人员引入设计模式殿堂的,或许还是《深入浅出设计模式》(或其他类似书籍)。前者是永恒的经典,后者则是入门的经典。学习一门技术,正需要这样面向不同读者群的两种经典。

领域驱动设计(Domain Driven Design,DDD)同样如此。

作为领域语言的奠基人,Eric Evans在领域驱动设计的地位,相当于Eric Gamma在设计模式中的地位。他的著作《领域驱动设计——软件核心复杂性应对之道》,可谓领域驱动设计的奠基之作。要讨论领域驱动设计,就不可能绕过Eric Evans;正如要讨论重构,就不可能忽视Martin Fowler。

那么,有多少初学者可以在一开始阅读该书,就能够很好掌握领域驱动设计的核心概念?我想,能有如此收获的,绝对是凤毛麟角。原因无他,Evans的讲述过于深奥。如果在领域驱动设计的基础之上,还要加上Martin Fowler提出的企业应用架构模式,以及XP中的测试驱动开发,我们还能找到一本好书吗?答案是Jimmy Nilsson的《领域驱动设计与模式实战》。

Jimmy Nilsson不一定是一名优秀的设计思想家,但在项目实战方面绝对造诣非凡。软件开发正是这样的一门科学,用最专业、最简练、最准确的语言描述,不一定能让读者醍醐灌顶;阅读几行代码,分析几幅UML图,读者反而会触类旁通,有一种豁然开朗的感觉。本书的优秀正在于此。

本书的特色可以从章节的分布窥见一斑。全书分为四部分,分别为:背景知识,应用TDD、应用PoEAA以及下一步骤。

正如书中原文所述,“第一部分是有关布置场景的。”世间万事万物都不可能脱离其上下文而单独存在。领域驱动设计与企业应用架构模式,并不是孤立的两门技术,也不是凭空产生的超级理论,它们离不开软件设计知识的厚积薄发。书中的第一部分是本书的纲领性篇章,内容涵盖架构、领域驱动设计、测试驱动开发、重构、模式与持续集成。

我很喜欢Nilsson在书中的示例方式,他总是尝试着给读者几个不同的方案,通过仔细地分析与比较来说明各种方案的优劣。他没有将自己的意志强加于人,而是循循善诱。因为,设计本无绝对正确的方案,不同的应用场景,决定了不同的解决方案。他只是对自己的选择给出恰如其分的建议。例如本书第二章中关于状态模式的实例,就提出了四种不同的解决方案,并以大量的代码来演示其实现。

另外一种好的示例方式是完整,将每个过程都细致地表现出来,从而给人一种真实项目的感受。在第三章中,关于测试驱动开发和重构的示例,正是以完整的案例演示了测试驱动开发的过程。其中包含有对测试的尝试,工具的选择,以及设计的优化。

本书的精华集中在第二部分和第三部分。第二部分关注领域驱动设计,它能够帮助我们正确地建立以领域模型为中心的设计思想。这部分的内容主要介绍了基于领域驱动设计分层中领域层的相关设计。首先通过分层架构模式,廓清了领域驱动设计的架构思想和架构风格。这一点非常关键。如果不明确架构的层次关系,就很容易将领域知识与数据访问混杂在一起,从而导致设计目的的不明确与混乱。所谓“领域驱动设计”,即表明领域是设计的驱动力与导向,如果不能正确地建立以领域模型为中心的设计思想,那么所谓的领域驱动设计,就只能是空中楼阁,或者是“挂羊头卖狗肉”。有过编程经验的开发人员已经习惯于从数据库开始的设计方式,即使明确领域建模的重要性,在设计过程中,数据库总会像一团幽灵一般不停地来困扰我们的思想。在分析领域模型时,我们总是会不由自主地想起,对于这样一个领域实体,在数据表中究竟该如何表示,对象之间的关系是如何通过主/外键建立关联的,数据表的字段如何进行数据的存储?……诸如此类的问题,总是会纷至沓来。Nilsson并不讳言这一点,他自己也经历过如此的转变。正因为这样的宝贵经验,他才能够在书中给予我们正确实施领域驱动设计的真知灼见。

领域驱动设计从来不是一蹴而就的,书中的内容非常准确地表达了这样一个观点。如何精化领域模型,方法就是测试驱动开发。书中的第5章完整地描述了这一过程,从编写第一个测试用例,到引入领域模式,细化流程,以及对基础架构实现的考虑。书中的代码包含两部分:测试代码与实现代码;书中的UML图也分为两种风格:随手涂鸦的草图和UML工具绘制的类图。这样的示例演示过程如此之真实,给读者的感觉不是在阅读书籍,而是亲临项目组,与Nilsson一起讨论设计方案,共同推进领域驱动设计。这种阅读感觉是无比美妙的。

勿庸讳言,Martin Fowler提出的企业应用架构模式并不易于应用,即使是设计老鸟,在选择企业应用架构模式时,也会陷入迷茫、彷徨或者进退失据的境地。Martin Fowler在设计方面具备的归纳、总结以及抽象的能力已经登峰造极。他总能化腐朽为神奇,或者发现常人所未见的技巧与思想。《重构》如此,《企业应用架构模式》同样如此。然而,令人遗憾的是,《企业应用架构模式》一书虽然有了很好的归纳与分类,但模式种类的繁多仍然会让人无从做出选择,所谓“乱花渐欲迷人眼”。而书中仅限于“玩具项目”的引入,并以片段而非整体的方式进行案例介绍,总会给人一种隔靴搔痒的感觉。Nilsson的《领域驱动设计与模式实战》正好弥补了这一缺陷。在应用企业应用架构模式时,他仍然延续了第二部分的案例,并结合领域驱动设计的分层模式,重点讲解了在实现基础架构过程中如何应用和选择企业应用架构模式。

当然,本书的这一部分内容还不够完美,因为他主要针对的是领域模式的应用,至于其余企业应用架构模式,例如分布式、并发、服务等诸多内容,则浅尝辄止,颇有几分意犹未尽的感觉。以第三部分的第9章《应用NHibernate》为例,固然考虑了应用和实践,完整地展示了NHibernate处理ORM的过程;却正因为如此,显得深度不够,没有很好地将企业应用架构模式和领域驱动设计进行深度挖掘,反而像是一篇介绍NHibernate入门的低级读物。

事实上,不仅是这一章的内容,整个第四部分《下一步骤》都给人这样的感觉。或许因为这部分内容并非Nillsson的创作,使得在叙述风格产生了不统一。当然,这未免有些吹毛求疵了。如果割裂开来看这些内容,每一篇都算得上是介绍软件设计应用与实践的佳作。这些内容涵盖的面也非常广泛,包括SOA、控制反转与依赖注入、AOP、MVC模式等内容。我在阅读这些内容的时候,总觉得作者还没有完全把这些内容展开,只能说浮现出冰山一角。这让我感觉不甘。可若是真的能做到这一点,恐怕本书就会变得和砖头一般的笨重了。

回过头再来思考本书,它是面向初学者的入门级读物吗?我想不是。没有足够的设计能力和思想的积累,很难真正读懂本书。但它给予的实践性设计指导,却无疑简化了它的阅读难度。据我的阅读经验来看,若希望掌握领域驱动设计,比较好的阅读途径是:首先阅读Eric Evans的《领域驱动设计——软件核心复杂性应对之道》(前提是你了解足够多的设计模式知识,以及与设计相关的知识,例如UML、重构以及测试驱动开发)。是的,这本书相对较难,我们很难读懂。但我的建议是可以读书“不求甚解”。遇到不明之处,做个标记,然后放过它,以迂回的方式往前走。这其中,可以适当参考InfoQ的迷你书《领域驱动设计精简版》,它对实体、值对象、聚合、服务、工厂以及资源库等领域对象和模式的描述实在是简明扼要,令人印象深刻。在对领域驱动设计已经有了比较直观和深入的概念之后,再阅读Nilsson的《领域驱动设计与模式实战》一书,你一定会有一种豁然开朗,如曲径通幽的感觉。我想,当你阅读完本书之后,一定会迫不及待地尝试使用领域驱动设计来完善或重构旧有的设计。不过,千万不要奢望从此之后你就能一马平川,真正遇到领域驱动设计相关知识的疑惑,还是需要回头阅读Eric Evans的著作。此时的你,一定能从该书中找到你希望知道的答案。

评价本文

专业度
风格

您好,朋友!

您需要 注册一个InfoQ账号 或者 才能进行评论。在您完成注册后还需要进行一些设置。

获得来自InfoQ的更多体验。

告诉我们您的想法

允许的HTML标签: a,b,br,blockquote,i,li,pre,u,ul,p

当有人回复此评论时请E-mail通知我

书我没看过 by s z

不过书评还算客观

中文版翻译太烂了。 by ruson yan

中文版建议大家就别买了,像是从google翻译copy过来的,译者和出版商太不负责了。

Re: 中文版翻译太烂了。 by Dan Mao

这种书评都没有给出原书名...受不了

确实是好书 by King Tobato

书评写得很好,确实是本不可多得的好书.

中文书翻译太烂 by liang negy

买过中文版的,翻译的确实太烂,看了1/3看不下去了,译者翻译的太差了吧,毁了本好书

Re: 中文书翻译太烂 by chen index

人心浮躁、道德沦丧、唯利是图的具体表现,现在已是四维不举。

Re: 中文书翻译太烂 by 张 逸

我在读这本书时,感觉翻译的文字不算太好,但也没有到很烂的地步,至少我能读懂,能够比较真实地反映原作者的想法。对于译著,真的不要太吹毛求疵了。

btw:这篇书评是我自己读后的所感,我没有联系过出版社,出版社也没有联系过我,所以,并不存在什么唯利是图,至少我这篇书评不是。

Re: 中文书翻译太烂 by Mao Michael

翻页太烂, 英文不行, 我得恶补英文去。。。

一般 by amo chen

看过了,马马虎虎,翻译有点....
建议大家看《C#2008 领域驱动设计》具体名字我忘记了,这本书还可以!

允许的HTML标签: a,b,br,blockquote,i,li,pre,u,ul,p

当有人回复此评论时请E-mail通知我

允许的HTML标签: a,b,br,blockquote,i,li,pre,u,ul,p

当有人回复此评论时请E-mail通知我

9 讨论

登陆InfoQ,与你最关心的话题互动。


找回密码....

Follow

关注你最喜爱的话题和作者

快速浏览网站内你所感兴趣话题的精选内容。

Like

内容自由定制

选择想要阅读的主题和喜爱的作者定制自己的新闻源。

Notifications

获取更新

设置通知机制以获取内容更新对您而言是否重要

BT