在网上看到这样一段关于对象设计的说法:
充血模型其实很简单,就是面向对象设计的本质:“一个对象是拥有状态和行为的”,比如说一个人,他眼睛什么样鼻子什么样这就是状态,人可以去打游戏或是写程序,这就是行为。为什么要有一个“人Manager”这样的东西存在去帮人“打游戏”呢? 举个简单的J2EE的例子,设计一个与用户(User)相关的功能,传统的设计一般是: 类:User+UserManager 保存用户调用:userManager.save(User user); 充血的设计则可能会是: 类:User 保存用户调用:user.save(); ——User有一个行为是:保存它自己 |
User保存它自己,这是什么逻辑呢?我觉得非常奇怪。
用户用户可以保存自己,那么用户也可以删除自己了,这个和面向对象的最初思路就不一致了,因为在“用例”阶段,就没有用户“删除自己”的用例。
所以我的意见,就是一个“行为”到底放在哪里,肯定是要由用例决定的。
“人Manager”是一个不伦不类的概念,人自己“删除自己”更是荒谬。
我的理解:
“保存”和“删除”本身是系统提供的一个功能,它的宾语,或者说“作用对象”是User,而主语不是,面向对象的概念,封装、多态是手段,本质和神髓是用真实世界考虑问题的方法来分析来设计,那么,分清主语和宾语就是必须的。
一般来讲,方法调用应当是
主语.动作(宾语)
而不应当是
宾语.动作()
从实际实现上来讲,好像也不会有什么大问题,就行“人删除自己”这样的行为,但是,如果把代码和设计当成一个场景或故事的陈述,那么,每一个句子,都缺失了主语,拿宾语当成了主语,这是典型的逻辑不清楚。
所以,所谓的“充血模型”、“贫血模型”只是设计领域里的概念,而且是纯粹设计和实现层面的概念,实际上讨论这些的意义和价值都很低的。面向对象分析,首先应当确定一个动作的发起者或者叫“源”是什么,被操作对象是什么。
我是一个比较质朴的程序员和设计师,有些偏执和执拗,但是我一般不会屈从于任何权威和流行的东西,我有我自己的方法论和价值取舍。我一向喜欢从事物的最最本质触发来分析问题,评判优劣取舍。所以,我的观点,可能很多人看了觉得怪怪的。其实我也是一家之言,一孔之见,写出来,希望能够整理自己设计方面的思路和心得、希望能给别人一些不同的观点和思路吧。
相关推荐
贫血模型可以看作是失血模型的一种变体,也是将数据模型和业务逻辑分离,但领域对象可能会包含一些基本的数据验证逻辑。与失血模型相比,贫血模型的领域对象稍有"血色",但仍然缺乏复杂的行为。 优点: 1. 简单明了...
特别是在面向对象编程中,贫血模型(Anemic Domain Model)和充血模型(Rich Domain Model)两种设计策略,一直被广泛讨论和应用。它们代表了不同的业务逻辑和数据关系处理方式,对系统的架构和后续维护工作有着深远...
在Asp.net开发中,"充血模型"是一种提倡领域对象拥有丰富行为和业务逻辑的设计模式,相对应于传统的"贫血模型"。"贫血模型"通常将数据模型、业务逻辑和数据访问分离,使得领域对象仅包含属性,而业务逻辑和数据操作...
这种设计简化了对象的复杂性,但因为模型对象缺乏行为,所以被称为"贫血",因为它违背了面向对象编程(OOP)的原则,OOP强调对象应该拥有数据和操作数据的方法。 另一方面,"充血模型"(也称为富域模型)则在领域...
领域模型是一种面向对象的设计方法,它以业务领域的概念为基础,将业务规则和逻辑封装在模型对象中。在领域模型中,每个对象不仅包含数据,还包含了处理这些数据的方法,这样的设计使得模型更具有表达力和自解释性。...
在这个框架中,Go的面向对象特性可能被用来创建和组织领域模型,同时利用其强大的接口系统来实现六边形架构的端口和适配器。 具体到代码实现,我们可以期待看到以下几个关键部分: 1. **领域对象**:包含业务逻辑...
充血模型将业务逻辑和数据封装在一起,更符合面向对象设计的原则,有助于提高代码的内聚性和模块化。 3. 领域专家与技术专家 在领域驱动设计中,领域专家与技术专家的角色分配和合作至关重要。 - 领域专家更关注...
领域模型可以分为失血模型、贫血模型和充血模型三种类型。 失血模型 失血模型是基于数据库的领域设计方式,它指的是使用 POJO 数据对象来存储业务数据。在失血模型中,业务逻辑是分散的,分布在多个地方。 贫血...
视频详细讲解,需要的小伙伴自行网盘下载,链接见附件,永久有效。 第1章 初步了解DDD 课程介绍 抛开杂念,看看传统三层CRUD编程方式 DDD领域驱动设计到底是...DDD面向对象分析方法、CQRS、六边形架构特点,BAT实战落地
架构设计过程中,还会讨论不同的模型类型,如贫血模型、充血模型(领域驱动模型)和胀血模型。贫血模型中,业务逻辑主要集中在Service层,而DO(Data Object)仅包含数据;充血模型则将业务逻辑放在DO中,Service层...
2. **领域建模**:构建能够反映业务逻辑的领域模型,避免贫血模型,提倡使用充血模型,即将业务逻辑封装在实体对象内部。 **四、DDD的实践** 1. **领域模型设计**:通常分为战略设计(宏观视角)和战术设计(微观...
同时,为了保证代码的可维护性和扩展性,良好的设计原则和模式(如单一职责原则、工厂模式、贫血模型/充血模型等)应当被遵循。 此外,项目的源代码可能会包含Maven或Gradle等构建工具的配置,以自动化构建和依赖...
18. **贫血模型与充血模型**:对比两种不同设计模式的优缺点,探讨最佳实践。 19. **课程总结**:回顾整个课程,强调掌握QFramework System Design Architecture对架构设计的重要性。 课程通过实例教学,逐步揭示...
- **充血模型**: 与贫血模型相反,领域对象包含了丰富的业务逻辑和行为,更符合领域驱动设计的原则。 - **限界上下文**: 是 DDD 中的一个概念,用来明确地界定不同领域模型的作用范围,有助于解决模型冲突和复杂度...
16. 领域模型(Domain Model)和贫血模型(Anaemic Domain Model)与充血模型(Rich Domain Model)的区别在于,贫血模型将业务逻辑放在服务层,而充血模型则将业务逻辑放在领域模型的实体中。 17. 测试驱动开发...
DDD最初是为了UML设计和领域建模,强调充血模型,即业务对象不仅包含数据,还包含行为。而在传统的J2EE模型中,通常采用贫血模型,数据与行为分离。微服务的兴起,尤其是在借鉴了DDD中的限界上下文、子域和领域事件...
设计模式如工厂模式、单例模式、贫血模型或充血模型等可能被应用到各个层次,提高代码的可维护性和复用性。 6. 数据库设计:在SQL Server 2005中,需要设计合理的数据库表结构,包括员工表、部门表、职位表等,确保...
在设计上,可能采用贫血模型或充血模型,根据业务需求选择合适的对象状态管理方式。 数据库设计是项目的关键部分,可能包括用户表、商品表、订单表、购物车表等,需要考虑到数据的一致性、安全性和性能。例如,用户...
此外,还能接触到常见的设计模式,如贫血模型和充血模型,以及如何进行事务管理和错误处理。 7. **数据库设计**:SMBMS系统可能包括商品表、用户表、订单表等多个数据库表,学习者可以借此机会了解数据库设计的基本...