`
liyixing1
  • 浏览: 959167 次
  • 性别: Icon_minigender_1
  • 来自: 江西上饶
社区版块
存档分类
最新评论

贫血模式和充血模式

阅读更多
本文转载自:http://hi.baidu.com/infol/blog/item/c4c5e1504c9b406f84352400.html。由于对方的博客不支持直接转载,因此我复制过来了。转载请注明原始作者是:http://hi.baidu.com/infol/blog/item/c4c5e1504c9b406f84352400.html

Martin Fowler很早以前就写过一篇文章,题目叫"贫血模型"。文章里面批判贫血的领域模型是不够优雅、不够OO的,提倡使用充血的领域模型。在Java世界 里这是一直争论的话题。到底什么是贫血什么是充血呢?
贫血模型:是指领域对象里只有get和set方法,或者包含少量的CRUD方法,所有的业务逻辑都不包含在内而是放在Business Logic层。

优点是系统的层次结构清楚,各层之间单向依赖,Client->(Business Facade)->Business Logic->Data Access(ADO.NET)。当然Business Logic是依赖Domain Object的。似乎现在流行的架构就是这样,当然层次还可以细分。

该模型的缺点是不够面向对象,领域对象只是作为保存状态或者传递状态使用,所以就说只有数据没有行为的对象不是真正的对象。在Business Logic里面处理所有的业务逻辑,在POEAA(企业应用架构模式)一书中被称为Transaction Script模式。

充血模型:层次结构和上面的差不多,不过大多业务逻辑和持久化放在Domain Object里面,Business Logic只是简单封装部分业务逻辑以及控制事务、权限等,这样层次结构就变成Client->(Business Facade)->Business Logic->Domain Object->Data Access。

它的优点是面向对象,Business Logic符合单一职责,不像在贫血模型里面 那样包含所有的业务逻辑太过沉重。

缺点是如何划分业务逻辑,什么样的逻辑应该放在Domain Object中,什么样的业务逻辑应该放在Business Logic中,这是很含糊的。即使划分好了业务逻辑,由于分散在Business Logic和Domain Object层中,不能更好的分模块开发。熟悉业务逻辑的开发人员需要渗透到Domain Logic中去,而在Domian Logic又包含了持久化,对于开发者来说这十分混乱。  其次,因为Business Logic要控制事务并且为上层提供一个统一的服务调用入口点,它就必须把在Domain Logic里实现的业务逻辑全部重新包装一遍,完全属于重复劳动。

如果技术能够支持充血模型,那当然是最完美的解决方案。不过现在的.NET框架并没有ORM工具(不算上开源的NHibernate,Castle之 类),没有ORM就没有透明的持久化支持,在Domain Object层会对Data Access层构成依赖,如果脱离了Data Access层,Domain Object的业务逻辑就无法进行单元测试,这也是很致命的。如果有像Spring的动态注入和Hibernate的透明持久化支持,那么充血模型还是能 够实现的。

选择了.NET平台开发,就是选择了开发高效、功能强大应用简单,最适合的模型就是贫血模型,或表数据入口,既有编译器和语 言平台很好的支持,也符合微软提倡的开发模式。如果跟潮流在项目中使用充血模型,现有的ORM工具都很复杂难用,光是维护大量的映射文件都成问题。说贫血 不够OO,它的Domain Object不够丰富,能把项目做好了,有一定的扩展能力和伸缩行就行了,也 不一定要讲究优雅的面向对象。正如SOA,讲究松耦合、高内聚,服务端给客户 端提供的服务,也就是一系列的方法调用加上DTO而已,不管服务的内部是不是面向对象的实现,至少它暴露出 来的是过程式的服务。

这些只是我一直以来看到网上的讨论结合开发项目的体会,一家之言,希望大家能说说自己的观点^_^ 。

PS: 现在虽然有Linq,但是它毕竟只是集成查询的语言,Linq to SQL离ORM还有一段距离,听说ADO.NET Entity Framework将会完美支持领域驱动设计,那也只有明年再看了。
分享到:
评论

相关推荐

    对贫血和充血模型的理解

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

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

    失血模型是一种软件设计模式,其中领域对象(Domain Object)仅包含数据字段的getter和setter方法,不包含任何业务逻辑。这种设计将业务规则和操作完全分离到独立的服务或管理类中,通常称为Transaction Script。在...

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

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

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

    充血模型强调对象应该拥有自己的行为和状态,而不是简单地作为数据容器。这个模型与贫血模型相对,后者通常由无行为的POJO(Plain Old Java Object)或DTO(Data Transfer Object)组成,业务逻辑被分离到服务层。 ...

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

    这种模式将应用程序分为三个主要组件:模型(Model)、视图(View)和控制器(Controller)。模型处理数据和业务逻辑,视图负责显示数据,而控制器接收用户输入并协调模型和视图之间的交互。 在描述中提到的"贫血...

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

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

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

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

    领域模型驱动设计1553265830.pdf

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

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

    这种架构模式强调了系统组件之间的清晰边界,以减少耦合并增强可测试性。在六边形架构中,核心业务逻辑(领域层)位于中心,被六个“接口”或“端口”包围,分别代表了外部世界的不同交互方式,如用户界面、数据库、...

    阿里巴巴java开发规范手册1.5.0.zip

    6. **代码组织**:提倡模块化和分层设计,如贫血模型和充血模型的选择,以及MVC、三层架构等设计。强调接口的定义应清晰,实现应简洁,避免过度封装。 7. **日志记录**:推荐使用合适的日志级别,如DEBUG、INFO、...

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

    传统模式下如何合理的划分各种域 基于DDD的方式进行域划分 什么是通用语言 什么是限界上下文? 限界上下文和子域的关系 基于电商系统按流程时间线发现限界上下文 限界上下文怎么做上下文映射? 防腐层的概念和作用 ...

    文字稿(更新到第三十课时)1

    18. **贫血模型与充血模型**:对比两种不同设计模式的优缺点,探讨最佳实践。 19. **课程总结**:回顾整个课程,强调掌握QFramework System Design Architecture对架构设计的重要性。 课程通过实例教学,逐步揭示...

    C#企业人事管理系统

    设计模式如工厂模式、单例模式、贫血模型或充血模型等可能被应用到各个层次,提高代码的可维护性和复用性。 6. 数据库设计:在SQL Server 2005中,需要设计合理的数据库表结构,包括员工表、部门表、职位表等,确保...

    阿里巴巴内部团队Java开发手册规范

    3. **代码结构**:手册推荐采用模块化、分层设计,如贫血模型(贫血模型:业务逻辑集中在Service层,DAO层只负责数据存取)和充血模型(充血模型:业务逻辑分散在实体类中)。 4. **异常处理**:异常处理是程序稳定...

    人事管理项目(java+mysql)源代码

    同时,为了保证代码的可维护性和扩展性,良好的设计原则和模式(如单一职责原则、工厂模式、贫血模型/充血模型等)应当被遵循。 此外,项目的源代码可能会包含Maven或Gradle等构建工具的配置,以自动化构建和依赖...

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

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

    DDD领域驱动设计day02.pdf

    领域驱动设计中的领域模型包括充血模型和贫血模型两种不同的建模方式。贫血模型主要存在于传统分层架构中,其特点是实体类中几乎没有业务逻辑,主要通过getter和setter方法来访问属性。这种模式下,业务逻辑分散在...

    企业面试题精选800题.pdf

    5. **领域模型**:在软件工程中,领域模型代表了业务领域的概念,贫血模型将业务逻辑放在服务层,而充血模型将业务逻辑包含在领域对象内部。 6. **HTTP和HTTPS协议**:HTTP是超文本传输协议,用于传输数据;HTTPS是...

    C#三层架构

    实体类可以分为“贫血实体类”和“充血实体类”。 - **贫血实体类**:仅包含属性,不包含任何业务逻辑,主要用于存储数据。 - **充血实体类**:除了属性之外,还包括一些实体间的关联关系和逻辑。 在本教程中,...

    溃疡性结肠炎的护理.ppt

    诊断依赖于一系列检查,包括血液检查(揭示贫血、白细胞计数升高等)、粪便检查(寻找脓血便和病原体)、免疫学检查(抗结肠粘膜抗体检测)、纤维结肠镜检查(通过活检确认病变性质)和钡剂灌肠X线检查(观察肠道...

Global site tag (gtag.js) - Google Analytics