/*主题:信用卡还款问题*/
不过用float会莫名的把2位小数变成一个N位的小数....
用bigdecimal来记数字的就没什么问题了.
/*项目经验分享:Hibernate与充血模型的“冲突”*/
“冲突”问题发生在将旧有项目进行充血模型改造的过程。我们给原有Bean的set方法中加入了业务逻辑(如上下文状态改变,事件触发等)。接下来程序的执行出问题了,症状五花八门但常常都是不可重现的问题。
通过好一番的代码走查,终于发现(意识到)Hibernate对于Bean的加载时,默认属性值的传递是使用bean的set方法的,这个时候触发了多余的业务逻辑处理。换句话说,这时候的充血模型与Hibernate的Bean加载“冲突"了。
解决"冲突"的方法很简单,将Bean配置为直接的属性访问(acess=feild)。
这样的Bug有时候是隐藏得比较深的。因为大部分的set方法是没有业务逻辑的,而且Hibernate的save行为发生在session.close的时候,如果一个bean在加载的时候,通过set方法隐形改变了另外一个Bean的状态,这时候session.close,就会把这种修改“悄悄的”保存,而不被程序员发觉。因为从业务代码上,程序只是读取了一个bean,没有做任何的修改动作,我的天~~~血泪教训啊!
希望看到这个帖子的同学,大家告诉大家!
/*主题:贫血/充血模型转贴+自己的想法*/
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的透明持久化支持,那么充血模型还是能够实现的。
个人看了这篇文章以后感觉还是有种对充血模型的向往 因为一直以来也不知道是自己钻牛角尖还是什么的 对于业务层混乱复杂的业务方法 还是希望能让领域模型自己去处理这些问题 但是对于业务层的重复定义方法也是不可避免的 长远考虑领域模型重用的话还是有好处的(虽然不一定会再用到) 最终通过orm工具对领域模型的持久化感觉这种方式还是挺不错的。
分享到:
相关推荐
充血模型,也被称为“Rich Domain Model”,是领域驱动设计(DDD)中的一种核心概念。在软件开发中,领域模型是对业务领域的抽象和建模,它包含业务规则、逻辑和状态。充血模型强调对象应该拥有自己的行为和状态,而...
在Asp.net开发中,"充血模型"是一种提倡领域对象拥有丰富行为和业务逻辑的设计模式,相对应于传统的"贫血模型"。"贫血模型"通常将数据模型、业务逻辑和数据访问分离,使得领域对象仅包含属性,而业务逻辑和数据操作...
贫血模型和充血模型是两种在软件开发,尤其是面向对象编程中常见的设计策略,主要应用于领域驱动设计(Domain-Driven Design, DDD)中。这两种模型主要关注于业务逻辑和数据之间的关系,以及如何在软件架构中有效地...
胀血模型是对充血模型的一种扩展,领域对象不仅包含业务逻辑,还可能包含基础设施相关的代码,如数据访问代码。这种模型可能导致对象过于庞大,不易维护。 优点: 1. 自包含:领域对象能自我处理所有事务,无需依赖...
然而,在充血模型中,领域对象不仅包含了数据,还封装了大量的业务逻辑。这种方法使得领域模型更加生动且有力量,因为它们可以直接执行复杂的业务规则,降低了对额外服务层的依赖,提高了代码的可读性和可维护性。 ...
1. 充值 2. 支付 3. 提现 4. 查询余额 5. 查询交易流水
- 充血模型则是将大部分的业务逻辑和持久化逻辑放在了DomainObject(领域对象)内,而BusinessLogic层仅用于封装部分业务逻辑以及控制事务、权限等。充血模型将业务逻辑和数据封装在一起,更符合面向对象设计的原则...
另一方面,"充血模型"(也称为富域模型)则在领域对象中包含业务逻辑。在这种模式下,`User`对象不仅包含了数据,还包含了处理这些数据的方法,使得模型对象更加"饱满"。这种设计更符合领域驱动设计(DDD)的理念,...
体会下充血模型开发微信钱包系统 聚合和聚合根是什么? 领域事件是什么? 看看领域事件的本质(解耦,异步,削峰) 工厂和资源库的作用? 领域服务是什么? 通过用例分析法和领域事件梳理电商购物车核心流程 第4章 DDD...
充血模型是盒马基础资料的设计方式,它指的是使用 DATA+METHOD+REPO 的方式来存储业务数据。在充血模型中,业务逻辑是集中在中心对象中,并且使用Repository 模式来管理业务数据。 依赖注入 依赖注入是领域模型中...
在DDD中,运用充血模型需要考虑如何与其他领域对象协作,以及在需要批量处理时,充血模型如何适应。例如,一个订单对象如果要实现结账功能,可能需要依赖其它领域对象的服务。 文档强调了主客体思维在软件设计中的...
不同的模型适用于不同的开发环境和技术栈,例如Spring框架倾向于使用贫血模型,而RoR(Ruby on Rails)则更适合充血模型。 通过深入学习和实践这些软件架构技术,软件架构师能够更好地设计出高效、可扩展和易于维护...
领域驱动设计中的领域模型包括充血模型和贫血模型两种不同的建模方式。贫血模型主要存在于传统分层架构中,其特点是实体类中几乎没有业务逻辑,主要通过getter和setter方法来访问属性。这种模式下,业务逻辑分散在...
充血模型则更注重对象的行为,将业务逻辑内聚在对象内部,使代码更符合面向对象的原则,但可能会增加编码和设计的复杂度。在实际应用中,需要根据项目需求和团队能力权衡这两者,寻找最适合的平衡点。 防止DDD核心...
总结来说,基于领域分析设计的架构规范着重于如何通过读写隔离优化查询操作,利用状态图揭示核心业务逻辑,并通过对比贫血模型和充血模型,强调了业务逻辑应与数据结构紧密结合,以提升软件设计的质量和效率。...
7. **贫血模型**与**充血模型**:贫血模型是指对象主要负责数据传输,业务逻辑存在于服务层;充血模型则强调领域对象内含业务逻辑,对象自身具有行为。 8. **微服务**:DDD常与微服务架构结合,每个微服务专注于一...
2. **领域建模**:构建能够反映业务逻辑的领域模型,避免贫血模型,提倡使用充血模型,即将业务逻辑封装在实体对象内部。 **四、DDD的实践** 1. **领域模型设计**:通常分为战略设计(宏观视角)和战术设计(微观...
从给定的信息来看,虽然原文似乎是使用了一些非标准或难以辨认的文字组合,但我们可以尝试根据标题、描述以及部分可识别的关键字来构建一个关于面向对象思想及其在Java中的应用的相关知识点。 ...
然而,过度地将行为内聚到单个对象中(即所谓的“充血模型”)可能会引发问题,例如订单自己结算、邮件自己发送等,这在某些情况下并不符合实际业务逻辑。因此,正确识别和区分主客体是避免陷入OOP陷阱的关键。 主...