域模型向左走(充血),向右走(贫血)
在文章的开始,我先举一个例子
美国M4谢尔曼坦克 VS德国的虎式坦克(相关资料如下http://mil.eastday.com/m/20070515/u1a2833237.html)
5:1 在五一期间,电视节目中的二战武器大对决吸引了我,其中当美国大兵说他们在用5辆坦克的代价来换德国人的一辆虎式(I)型坦 克时,我们可以得出一个结论。蒙哥马利和艾森豪威尔是在用二三十人的生命去换德军的一辆坦克(而因为德军坦克装甲厚重,里面的架驶员得以逃生)。这是怎么一种自杀式的进攻呀!也许这么高的伤亡率在最终的胜利面前可能无所谓,但对于士兵([拯救大兵瑞恩])却不完全是这么一回事了。而这里公司的CEO,或高层无疑也可以被视为这两位伟人的化身。为了开发进度和用户,他们可以强迫思维活越的程序员丧失创造力,因为他们需要的是能生成代码的工人(相当于打仗的美国大兵)。而培养这些大兵的军事训练所(软件培训中心)也就成为源源不断制造这种产品的工厂了。
这里不妨把OO域模型比做是虎式坦克,它在代码结构,功能扩展(等同于火力),可维护性,可读性 健壮性安全性(装甲)等方面都是非常有优势的。但同时也出现了问题那就是机动性(太重太耗油,等同于学习成本),以及生产数量(等同于开发速度)成了这个优秀设计思想的制约因素。因为具我了解OO设计会造成开发前期进度上的相对滞后,甚至搭一个框架所用的时间就已经让公司高级无法接受了。而同时一般公司又不愿意为这部分时间成功埋单, 因此程序员就想尽一切办法(甚至生产垃圾代码)来跟上开发进度。虽然有开源框架,代码生成工具等来帮助提升代码的质量和开发速度,但本质上这个项目它已经成了一辆 "谢尔曼坦克",它无法全面享受到OO所能提供的优势,而这里又不得不回头用重构等方法来改善代码质量了。(有些项目甚至连回头的机会都没有)
最终的结果是美国人说他们的坦克生产出20辆的时候,德军那边只有1辆下线。正是这种数量上的优势最终锁定了美军的在坦克战上的胜局。
这个例子告诉我们这样一个残酷的事实,好的设计虽然能生产出好的软件,但因为资源(时间,资金,人力等)要求过高。造成了一般企业或公司不想承担。而这时贫血模型这类开发方式乘虚而入,用它们所标谤的优势和开发方式排演着一台又一台的闹剧。
有些成功是激励,而有些只是兴奋剂甚至是毒药。
因为今天我在这里所表达的观点会招致相当多的人跳出来与我争论,而不可避免的就是要拿出一堆成功的案例说这里用贫血模型实现的如何如何的好,项目进展如何如何等。
而我要说的就是当我们为采用贫血域模型而使项目“成功”完成而沾沾自喜时,我们已经在离经叛道的路上越走越远了。
做为一名程序员,到底是为谁去开发去编程。(A公司,B:为自己,C:为了民族软件产业的振兴D:为了共产主义理想等等。)
当我们处在利益中心时,左侧是项目经理,技术经理,产品经理为首的公司方代表。 右侧是用户,客户以及其它受众。它们都想为了各自的利益一天到晚的在你身边咆哮,要求你开发或修改这样或那样的代码。表面上我们是项目的主宰,因为如果你没完成工作,项目就不可以完成。但当我们进入设计开发阶段后我们会因为资源的不够使用而不得不做这样或那样式调整和妥协,最终大多数代码都只是一味模式的照搬。这时就谈不上什么将来产品要如何健壮如何好了。因为能对付过眼前摧命的各方势力就已经让我们精疲力尽了。从这方面讲我们已从“主宰”变成了“挨宰”。这时的我们已变成了称铊,要不停的调整自已在称杆上的位置以适应这些催命的人了种种要求。也许不少人这时拾起贫血模型这个稻草,起码它会帮助我们节省设计和开发上的时间,项目最终可能也取得了成功。但当我们过上一段时间再回过头看这些代码,真不知道大家会做何敢想。
贫血模型(Fat Serviece)服务层成了一个框(此处存在笔误已在回复中修正,敬请谅解!),什么都往进装(越来越臃肿)。本该是域模型中该有的逻辑,这时全被一股脑塞进了Business Logic。当业务逻辑复杂到一定程度时,就会有一些归属不明确的函数或属性出来了。这些不明确的代码相信有相当一部分要放在domain model中会更合理。但因为已经贫血了,所以Business Logic成了它们的避护所。我给这些属性或方法比做“难民”,有些难民可以还活在你的项目中,有些可能在使用一段时间后就死去了(系统不再使用,但未及时清理)。而如果这时公司又找来一个新人去接管这些代码时,乐子可就大了。这就好比让一个后妈去教育一个孩子,如尽心还好(会继续有好的清楚的逻辑)在SERVICE中,而缓和这种矛盾。但多数程序员都不愿做后妈。因此这些方法就会像是没有母亲的孩子一样如游魂野鬼一样在你的项目中游荡。
最后,学习成本的降低只能会造出更好与你相同的程序员甚至新人。因为贫血模型没有充血模型那么复杂,实现起来很简单,这就势必造成一个事实,就是一个新入行几个月的人很快也会用这个架构去搞程序开发。这种自贬身价的结果最终可能导致的情况就是当某天工作结束时,你会发现你身边的同时有可能就是一只pig or cow。
好了,文章写完了,我已经开始准备挨骂了,不过无所谓,希望大家勇跃拍砖!
********:该做什么就做什么,不该做什么就不做什么?还是不该做什么可以不做什么?