ddd quickly 中文版译者序

在去北京参加infoq大会之前,我就开始了对DDDQuickly的翻译工作,如今,在我和 泰稳的努力下,它终于可以跟大家见面了。我心甚慰。
可以去 infoq中文站免费获得此 迷你书
 

======================================
 

序言

在2004年之前的某一天,我跟所在部门的一个设计师进行沟通,当时他为自己的一个思路兴奋不已,而我要做的事情就是跟他讨论清楚他头脑中的那个想法,然后写出需求和设计文件来。大家可能会注意到,很多时候,需求是从设计中反推出来的,这被一些专家称为“需求的反向工程”。其实我更多地认为这是由于我们现在糟糕的工作现状决定的,有诸多的因素导致需求或者设计被局限在仅有的几个人的知识体系中,但如果有心去细察,会发现他们各自的理解又各不相同。

回到刚才说到的那次沟通上,当那个设计师把自己的得意之作描述完毕后,我在纸上用UML图画出了他的主题思路,然后我们针对细节开始探讨并在图上改改画画。最后的修订结果显示,他的很多"创举"是多余的,经过精简后的UML基本上颠覆了他原有的思路。现在我还记得那位同事的一声叹息:"一周的功夫白费了……"

其实在整件事情中,他有他的得失,我也有我的收获和困惑:我意识到对统一的核心模型进行探讨和简化的重要性,但应该如何把这样的过程程式化,让它在更多的同事的工作中发挥作用呢?


这样的问题纠缠了我好久,终于有一天,我得到了一本如字典般的硬皮《Domain-Driven  Design》(我们亲切地称它为"DDD")原版书,从中找到了答案。然后,我参与了DDD中文版的审校工作和DDD注释版的注释工作。再后来,InfoQ中文站的总编霍泰稳又邀请我一起做了《Domain Driven Design quickly》这本书的翻译工作。

曾经有人要我用简练的词汇描述DDD的中心思想,我个人认为这是一个比较难的工作,但我愿意去尝试。我的回答是"关注精简的业务模型及实现的匹配":

1. 如果你了解"模型"的定义是对现实的有选择性的精简,然后用这样的观点去读DDD这本书,你就会发现,DDD其实没有什么太多的新鲜玩意,它更多地是可以看作是面向对象思潮的回归和升华。在一个"万事万物皆对象"的世界里,哪些对象是对我们的系统有用的?哪些是对我们拟建系统没有用处的?我们应该如何保证我们选取的模型对象恰好够用?

2. 前面的选择性问题只是解决了一个初步框选的问题,对象并不是独立存在的,它们之间有着千丝万缕的联系。这种扯不断理还乱的联系构成了系统的复杂性。一个具体的体现就是,我们修改了一处变更,结果引发了一系列的连锁反应。虽然对象的封装机制可以帮我们解决一部分问题,但那只是有限的一部分。我们应该如何在一个更高点的层次上,通过保留对象之间有用的关系去除无用的关系,并且限定变更影响的范围以来降低系统的复杂度呢?

3. 在DDD以及传统OO的观点中,业务而不是技术是一个开发团队首先要关注的内容,众多的框架和平台产品也在宣称把开发人员解放出来,让他们有更多的精力去关注业务。但是,当我们真正去看待时,会发现,开发人员大多还是沉溺于技术中,对业务的理解和深入付出的太少太少。其实要解决这个问题,就要先看清楚我们提炼出来的模型,在整个架构和整个开发过程中所处的位置和地位。我们经常听到两个词,一个是MDD(模型驱动设计),一个是MDA(模型驱动架构)。如果DDD特别关注的是"M"(以及其实现),那么,这个M应该如何与架构和开发过程相融合呢?我经常会看到我们辛苦提取出来的领域模型被肢解后,分散到系统的若干角落。这真是一件可怕的事情,因为一旦形成了"人脑拼图",就很难再有一个人将它们一一复原,除非这个人是个天才。

4. 很多面向对象的教材,都会告诉你若干的技巧,让你去机械化地处理模型和对象实现,但是这些教材通常会忽略一个大的上下文环境,就是应该由哪些具有什么样素质和技能的人来处理模型和对象实现,或者说白了,就是应该用什么样的团队模型来匹配业务模型。不同的模型,需要不同的团队模型的支撑,不同的团队模型也会让一个模型实现更优秀或者更糟糕。

5. 相信很多人读过ATM机的例子,你发现自己彻底明白了用例应该怎么编写、模型怎么提取和实现,但是当你信心十足地去开始你自己的项目时,你又会发现你的思路片段化了,所有你明白了的技能在你的新项目中好像用不上。算了,还是老的工作思路和工作方式比较顺手,于是一切都照旧会到了老的套路上。那么,面向对象技术或者说我们提炼出来的模型应该如何在大型项目/团队中使用呢?我们是应该要求一个项目使用统一的模型,还是应该把它们分成不同的模型?我们应该如何抉择?

……

在实际的应用过程中,我相信每一个有心人都会提出比我在这里列举出来的还要多的问题,没有关系,DDD这本书都能给你所需的答案。

当然,"DDD"作为传统OO范型的探索和升华版,也存在着一些不足和未涉及的领域,例如:在安全、权限方面的考虑,其基本构造块的适用范围和决策标准,与开发框架之间更好的融合性等问题。还好,我们都知道"尽信书不如无书"的道理,在阅读任何著作时,都应该带着自己的疑惑和批判精神去阅读,你的任何关于DDD的深层思考和讨论,都可以在它的配套网站或者InfoQ中文站网站中发表。

如果你认为阅读DDD这么一本如字典版的大厚书时间上不太允许,那么请允许我为你介绍一本简化版的小书《Domain Driven Design Quickly》,经过我们的努力,InfoQ中文站已经将其翻译成中文版——《领域驱动设计精简版》,并作为国庆礼物奉献给大家!

那还等什么呢,祝您开卷有益,阅读愉快!

孙向晖

2007年9月26日于泰安

 

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


什么是设计模式一套被反复使用、多数人知晓的、经过分类编目的、代码 设计经验 的总结;使用设计模式是为了 可重用 代码、让代码 更容易 被他人理解、保证代码 可靠性;设计模式使代码编制  真正工程化;设计模式使软件工程的 基石脉络, 如同大厦的结构一样;并不直接用来完成代码的编写,而是 描述 在各种不同情况下,要怎么解决问题的一种方案;能使不稳定依赖于相对稳定、具体依赖于相对抽象,避免引
单一职责原则定义(Single Responsibility Principle,SRP)一个对象应该只包含 单一的职责,并且该职责被完整地封装在一个类中。Every  Object should have  a single responsibility, and that responsibility should be entirely encapsulated by t
动态代理和CGLib代理分不清吗,看看这篇文章,写的非常好,强烈推荐。原文截图*************************************************************************************************************************原文文本************
适配器模式将一个类的接口转换成客户期望的另一个接口,使得原本接口不兼容的类可以相互合作。
策略模式定义了一系列算法族,并封装在类中,它们之间可以互相替换,此模式让算法的变化独立于使用算法的客户。
设计模式讲的是如何编写可扩展、可维护、可读的高质量代码,它是针对软件开发中经常遇到的一些设计问题,总结出来的一套通用的解决方案。
模板方法模式在一个方法中定义一个算法的骨架,而将一些步骤延迟到子类中,使得子类可以在不改变算法结构的情况下,重新定义算法中的某些步骤。
迭代器模式提供了一种方法,用于遍历集合对象中的元素,而又不暴露其内部的细节。
外观模式又叫门面模式,它提供了一个统一的(高层)接口,用来访问子系统中的一群接口,使得子系统更容易使用。
单例模式(Singleton Design Pattern)保证一个类只能有一个实例,并提供一个全局访问点。
组合模式可以将对象组合成树形结构来表示“整体-部分”的层次结构,使得客户可以用一致的方式处理个别对象和对象组合。
装饰者模式能够更灵活的,动态的给对象添加其它功能,而不需要修改任何现有的底层代码。
观察者模式(Observer Design Pattern)定义了对象之间的一对多依赖,当对象状态改变的时候,所有依赖者都会自动收到通知。
代理模式为对象提供一个代理,来控制对该对象的访问。代理模式在不改变原始类代码的情况下,通过引入代理类来给原始类附加功能。
工厂模式(Factory Design Pattern)可细分为三种,分别是简单工厂,工厂方法和抽象工厂,它们都是为了更好的创建对象。
状态模式允许对象在内部状态改变时,改变它的行为,对象看起来好像改变了它的类。
命令模式将请求封装为对象,能够支持请求的排队执行、记录日志、撤销等功能。
备忘录模式(Memento Pattern)保存一个对象的某个状态,以便在适当的时候恢复对象。备忘录模式属于行为型模式。 基本介绍 **意图:**在不破坏封装性的前提下,捕获一个对象的内部状态,并在该
顾名思义,责任链模式(Chain of Responsibility Pattern)为请求创建了一个接收者对象的链。这种模式给予请求的类型,对请求的发送者和接收者进行解耦。这种类型的设计模式属于行为
享元模式(Flyweight Pattern)(轻量级)(共享元素)主要用于减少创建对象的数量,以减少内存占用和提高性能。这种类型的设计模式属于结构型模式,它提供了减少对象数量从而改善应用所需的对象结