本文转载自: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将会完美支持领域驱动设计,那也只有明年再看了。
分享到:
相关推荐
特别是在面向对象编程中,贫血模型(Anemic Domain Model)和充血模型(Rich Domain Model)两种设计策略,一直被广泛讨论和应用。它们代表了不同的业务逻辑和数据关系处理方式,对系统的架构和后续维护工作有着深远...
失血模型是一种软件设计模式,其中领域对象(Domain Object)仅包含数据字段的getter和setter方法,不包含任何业务逻辑。这种设计将业务规则和操作完全分离到独立的服务或管理类中,通常称为Transaction Script。在...
在Asp.net开发中,"充血模型"是一种提倡领域对象拥有丰富行为和业务逻辑的设计模式,相对应于传统的"贫血模型"。"贫血模型"通常将数据模型、业务逻辑和数据访问分离,使得领域对象仅包含属性,而业务逻辑和数据操作...
充血模型强调对象应该拥有自己的行为和状态,而不是简单地作为数据容器。这个模型与贫血模型相对,后者通常由无行为的POJO(Plain Old Java Object)或DTO(Data Transfer Object)组成,业务逻辑被分离到服务层。 ...
这种模式将应用程序分为三个主要组件:模型(Model)、视图(View)和控制器(Controller)。模型处理数据和业务逻辑,视图负责显示数据,而控制器接收用户输入并协调模型和视图之间的交互。 在描述中提到的"贫血...
领域模型可以分为失血模型、贫血模型和充血模型三种类型。 失血模型 失血模型是基于数据库的领域设计方式,它指的是使用 POJO 数据对象来存储业务数据。在失血模型中,业务逻辑是分散的,分布在多个地方。 贫血...
架构设计过程中,还会讨论不同的模型类型,如贫血模型、充血模型(领域驱动模型)和胀血模型。贫血模型中,业务逻辑主要集中在Service层,而DO(Data Object)仅包含数据;充血模型则将业务逻辑放在DO中,Service层...
- 领域模型设计:采用充血模型而非贫血模型,并且在设计中融合设计模式、流程编排、事件驱动等元素。 - 强化单测:确保代码的质量,通过单元测试来保证各个领域模型的正确性和稳定性。 - 持续重构:在业务生命周期内...
这种架构模式强调了系统组件之间的清晰边界,以减少耦合并增强可测试性。在六边形架构中,核心业务逻辑(领域层)位于中心,被六个“接口”或“端口”包围,分别代表了外部世界的不同交互方式,如用户界面、数据库、...
6. **代码组织**:提倡模块化和分层设计,如贫血模型和充血模型的选择,以及MVC、三层架构等设计。强调接口的定义应清晰,实现应简洁,避免过度封装。 7. **日志记录**:推荐使用合适的日志级别,如DEBUG、INFO、...
传统模式下如何合理的划分各种域 基于DDD的方式进行域划分 什么是通用语言 什么是限界上下文? 限界上下文和子域的关系 基于电商系统按流程时间线发现限界上下文 限界上下文怎么做上下文映射? 防腐层的概念和作用 ...
18. **贫血模型与充血模型**:对比两种不同设计模式的优缺点,探讨最佳实践。 19. **课程总结**:回顾整个课程,强调掌握QFramework System Design Architecture对架构设计的重要性。 课程通过实例教学,逐步揭示...
设计模式如工厂模式、单例模式、贫血模型或充血模型等可能被应用到各个层次,提高代码的可维护性和复用性。 6. 数据库设计:在SQL Server 2005中,需要设计合理的数据库表结构,包括员工表、部门表、职位表等,确保...
3. **代码结构**:手册推荐采用模块化、分层设计,如贫血模型(贫血模型:业务逻辑集中在Service层,DAO层只负责数据存取)和充血模型(充血模型:业务逻辑分散在实体类中)。 4. **异常处理**:异常处理是程序稳定...
同时,为了保证代码的可维护性和扩展性,良好的设计原则和模式(如单一职责原则、工厂模式、贫血模型/充血模型等)应当被遵循。 此外,项目的源代码可能会包含Maven或Gradle等构建工具的配置,以自动化构建和依赖...
领域模型(Domain Model)和贫血模型(Anemic Domain Model)是两种常见的模型设计模式,它们各有特点,适用于不同的场景。本资料包旨在通过实例对比,帮助初学者理解这两种模型的区别和概念,并提供实际的Java代码...
领域驱动设计中的领域模型包括充血模型和贫血模型两种不同的建模方式。贫血模型主要存在于传统分层架构中,其特点是实体类中几乎没有业务逻辑,主要通过getter和setter方法来访问属性。这种模式下,业务逻辑分散在...
5. **领域模型**:在软件工程中,领域模型代表了业务领域的概念,贫血模型将业务逻辑放在服务层,而充血模型将业务逻辑包含在领域对象内部。 6. **HTTP和HTTPS协议**:HTTP是超文本传输协议,用于传输数据;HTTPS是...
全身症状可能包括低热至中度发热,严重时可能出现高热、低钾血症、贫血和低蛋白血症。肠外表现可能包括口腔溃疡、关节炎和眼部问题。在体征方面,轻度病例可能仅表现为左下腹轻压痛,而重症患者腹部可能存在明显触痛...
实体类可以分为“贫血实体类”和“充血实体类”。 - **贫血实体类**:仅包含属性,不包含任何业务逻辑,主要用于存储数据。 - **充血实体类**:除了属性之外,还包括一些实体间的关联关系和逻辑。 在本教程中,...