`
hnwangdan
  • 浏览: 21120 次
  • 性别: Icon_minigender_1
  • 来自: 郑州
社区版块
存档分类
最新评论

域模型向左走(充血),向右走(贫血)

阅读更多
在文章的开始,我先举一个例子(转载)
  美国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。

  好了,文章写完了,我已经开始准备挨骂了,不过无所谓,希望大家勇跃拍砖!
分享到:
评论

相关推荐

    失血贫血充血胀血模型.docx

    贫血模型可以看作是失血模型的一种变体,也是将数据模型和业务逻辑分离,但领域对象可能会包含一些基本的数据验证逻辑。与失血模型相比,贫血模型的领域对象稍有"血色",但仍然缺乏复杂的行为。 优点: 1. 简单明了...

    对贫血和充血模型的理解

    贫血模型和充血模型是两种在软件开发,尤其是面向对象编程中常见的设计策略,主要应用于领域驱动设计(Domain-Driven Design, DDD)中。这两种模型主要关注于业务逻辑和数据之间的关系,以及如何在软件架构中有效地...

    充血模型设想实现(2010/07/30更新)

    这个模型与贫血模型相对,后者通常由无行为的POJO(Plain Old Java Object)或DTO(Data Transfer Object)组成,业务逻辑被分离到服务层。 在2010年的更新中,博主可能讨论了如何在实际项目中应用充血模型,可能...

    浅谈Asp.net中使用“充血模型”1

    在Asp.net开发中,"充血模型"是一种提倡领域对象拥有丰富行为和业务逻辑的设计模式,相对应于传统的"贫血模型"。"贫血模型"通常将数据模型、业务逻辑和数据访问分离,使得领域对象仅包含属性,而业务逻辑和数据操作...

    11丨实战一(上):业务开发常用的基于贫血模型的MVC架构违背OOP吗?1

    总的来说,选择贫血模型还是充血模型,取决于项目的需求、团队的技术水平以及对代码质量的要求。在实践中,理解这两种模型的优缺点,并根据具体场景灵活选择,是提升软件开发效率和质量的关键。

    领域模型说明及范例代码.zip

    领域模型(Domain Model)和贫血模型(Anemic Domain Model)是两种常见的模型设计模式,它们各有特点,适用于不同的场景。本资料包旨在通过实例对比,帮助初学者理解这两种模型的区别和概念,并提供实际的Java代码...

    基于GO的六边形架构框架,可支撑充血的领域模型范式代码实现.rar

    在传统的贫血模型中,领域对象通常只包含数据,而业务逻辑则分散在服务层或其他地方。然而,在充血模型中,领域对象不仅包含了数据,还封装了大量的业务逻辑。这种方法使得领域模型更加生动且有力量,因为它们可以...

    基于六边形架构的充血领域模型设计源码——Freedom框架

    该项目为Freedom框架,是一款基于六边形架构的充血领域模型设计源码,采用Go语言开发,总计包含200个文件。文件类型涵盖了178个Go源文件、6个Markdown文档、4个TOML配置、4个YAML配置、2个SQL脚本、1个Git忽略规则、...

    领域模型驱动设计1553265830.pdf

    - 领域模型设计:采用充血模型而非贫血模型,并且在设计中融合设计模式、流程编排、事件驱动等元素。 - 强化单测:确保代码的质量,通过单元测试来保证各个领域模型的正确性和稳定性。 - 持续重构:在业务生命周期内...

    大白话领域驱动设计DDD视频教程

    贫血模型的优缺点? DDD提倡的充血模型是什么? 体会下充血模型开发微信钱包系统 聚合和聚合根是什么? 领域事件是什么? 看看领域事件的本质(解耦,异步,削峰) 工厂和资源库的作用? 领域服务是什么? 通过用例...

    领域驱动(DDD)充血模式下,domain 与 Service以及Repository的解耦---DOMAIN EVENT

    总结来说,DDD的充血模式强调领域模型的业务能力,而DOMAIN EVENT则提供了实现领域模型与Service、Repository解耦的有效手段。通过引入DOMAIN EVENT,我们可以更好地遵循单一职责原则,使代码更易于理解和维护,同时...

    领域驱动设计案例-盒马实践

    领域模型可以分为失血模型、贫血模型和充血模型三种类型。 失血模型 失血模型是基于数据库的领域设计方式,它指的是使用 POJO 数据对象来存储业务数据。在失血模型中,业务逻辑是分散的,分布在多个地方。 贫血...

    tbl-demo-service-master.zip

    领域模型的职责是实现业务逻辑,如果领域模型只是用来处理简单的逻辑(比如贫血模型),那么领域模型的作用微乎其微,甚至可以忽略,数据转换的成本比领域模型带来的好处还多,这种情况其实就是在原有的分层架构中...

    论文研究 - 充血性心力衰竭和壁内血栓形成的孤立性左心室非紧致症一例报告

    在这里,我们报告一例74岁的女性患者,该患者被诊断为孤立的左心室非紧密性充血性心力衰竭,壁内血栓和高血压。 LVNC没有特定的治疗方法。 治疗措施针对患者的症状(心力衰竭,心律不齐和血栓形成事件),并考虑...

    软件架构技术公司内部交流

    架构设计过程中,还会讨论不同的模型类型,如贫血模型、充血模型(领域驱动模型)和胀血模型。贫血模型中,业务逻辑主要集中在Service层,而DO(Data Object)仅包含数据;充血模型则将业务逻辑放在DO中,Service层...

    行业分类-物理装置-一种人眼充血检测装置.zip

    3. **软件算法**:用于分析和解读数据的部分,可能包括图像处理算法、机器学习模型等,以区分正常与充血的眼部状态。 4. **使用流程**:如何操作设备,包括对焦、定位、读取结果等步骤,以及针对不同用户群体(如...

    使用应变片体积描记法和对数线性粘弹性指数的基于模型的React性充血评估

    在这项研究中,作者提出了一种新的方法来评估React性充血的React,其粘弹性指数包括使用应变仪体积描记法在逐次搏动的基础上测得的刚度和粘度。 为了研究所提出方法的有效性,进行了评估以确定在React性充血中React...

    消化系统疾病动物模型.ppt

    消化系统疾病动物模型是医学研究中常用的一种方法,主要用于研究疾病的发病机制、药物疗效和治疗方法。本篇内容主要涉及急性胃炎和慢性胃炎的动物模型建立,使用的是雄性Wistar大鼠。 首先,急性胃炎的动物模型通常...

Global site tag (gtag.js) - Google Analytics