领域建模实现思考
“Javaeye论坛-领域建模”板块有很多讨论,不再引述,直接列举我的观点。
JavaEE中领域建模的困境包括:
1) 类膨胀。 需要职责理顺,分散和委托出去。
2) 无法摆脱Entity的Domain Service注入?
思路:
1. 目前的 Service 模式是一种组件化的,形式上是 OO 的,实质上是组件的,它能很好的解决现有问题。 但忽视了领域对象之前的天然关联性。
2. 领域模型特征: 普遍共识一般是Domain Object要求“ 数据 + 行为 ”的完整封装,对象实例的行为基于自己的数据,对象之间存在数据关联(Data Association)和行为关联(Behavior Association)。此外领域对象还能响应事件。
一个应用的领域对象依据其相互关联,可由一个根对象(Root Model) 导航获取到任何一个的Domain Object。
因此一个完整的领域模型可以抽象为:
Domain Model = Data + Association + Behavior + Event
3. 恰当平衡领域建模思想和实践的冲突。
第一个问题:如类膨胀,就是谈的很多的充血问题。随着系统发展,一个Domain Object要承担的Behavior增多,代码中的Method增多,导致文件庞大。 这更主要是一个实现阶段的问题,但不能不认真考虑。
解决充血肯定要反向思考,即给对象“放血”。将行为分散,实现角度需要增加Behavior类或接口,协同构建Domain Model。
Qi4j 框架基本实现了这一点,Domain Object设计和方法定义完全靠 Interface 和 Interface继承; 方法实现类为Mixin,只关注它要实现的Interface,子类为Composite模式,实现了很好的放血和分散。
如:
Domain Object 定义
public interface Speaker
{
String sayHello();
}
方法实现
public class SpeakerMixin
implements Speaker
{
public String sayHello()
{
return "Hello, World!";
}
}
子类(应该说是接口)定义
@Mixins( SpeakerMixin.class )
public interface PoliticianComposite extends Composite, Speaker // +others
{
}
但Qi4j 还有Concern等很多概念,看它的范例代码,感觉巨复杂,大量用了Annotation,不很喜欢。
3) 领域建模对使用者(程序员)要简单,友好。
现有框架太多的EJB,Service,DAO等框架要求的类,分层清晰,但导致代码增多,开发量和使用难度增加。当然,因为这种架构设计的清晰,规范性,在实践中获得了很大成功,功劳不可忽视。
新一代的开发框架,如果要面向“领域驱动设计”,需要将 Service,DAO,VO等概念进行融合,实现Data 和Behavior的重新聚合,而且Behavior不管它是原子性的CRUD,还是粗粒度的Business Method。
4) 类设计思路1:Behavior类继承 Data 类,这样使用者面对的是数据和Behavior统一的对象实例;
5) 类设计思路2:Domain Object恰当划分Sub Domain, 避免Behavior膨胀。
6) 类设计思路3:1关联的对象( order.customer ) 既有数据,又有Behavior,不存在什么问题,Hibernate等已经很好支持; 但N关联的对象( 如:user.orders ) 是一个集合(Collection)仍是以Data Model为中心;需要变为以“Behavior + Data Model”为中心,重点在Behavior;需要一个集合对Element成员有CRUD操作, 特别是更业务性的操作。
7) 跨环境( Context )问题。
一个Domain Object 在一个系统的不同子系统,不同领域有不同的Data Model和Behavior,因此对Domain Object需要按Context 进行关注。
一个基类如Person如果在不同Context有不同的表现,Manager,Employee,Sale,Clerk等,就需要按各自 Context 设计,而不能单线继承的设计。
思考的编程模型:
Category extends CategoryDO {
void deleteProduct(String productId);
}
Category category = Categorys.find("sss");
category.getId();
category.deleteProduct("xxxx");
category.getProducts().delete("sss");
category.getProducts().add("ddddd");
category.getProducts().query("xxxx");
[参考资料]
1. Robbin domain model的延伸讨论 http://www.iteye.com/topic/57075
2. Taowen 贫血的Domain Model http://www.iteye.com/topic/191261
3. Taowen 再论领域模型的困境 http://www.iteye.com/topic/401223
4. Lifethinker 一个简单例子:贫血模型or领域模型 http://www.iteye.com/topic/283668
5. javaboy2006 基于DDD项目的设计总结 http://www.iteye.com/topic/351597
分享到:
- 2009-06-18 19:44
- 浏览 2317
- 评论(5)
- 论坛回复 / 浏览 (5 / 3628)
- 查看更多
相关推荐
在数学建模领域,2013年的全国数学建模竞赛B题是一个具有挑战性的议题,对于初学者来说,这是一个极好的学习资源。本解答集全面涵盖了从问题理解、模型构建到编程实现以及论文写作的全过程,对于提升建模技能极具...
通过领域建模,软件开发人员能够展示丰富的功能并将这些功能实现为真正满足用户需要的软件。尽管领域建模非常重要,但市面上介绍如何将有效的领域建模结合到软件开发过程中的著作却非常少。 本书就是为此目的而...
通过领域建模,软件开发人员能够展示丰富的功能并将这些功能实现为真正满足用户需要的软件。尽管领域建模非常重要,但市面上介绍如何将有效的领域建模结合到软件开发过程中的著作却非常少。 本书就是为此目的而...
通过领域建模,软件开发人员能够展示丰富的功能并将这些功能实现为真正满足用户需要的软件。尽管领域建模非常重要,但市面上介绍如何将有效的领域建模结合到软件开发过程中的著作却非常少。 本书就是为此目的而...
通过领域建模,软件开发人员能够展示丰富的功能并将这些功能实现为真正满足用户需要的软件。尽管领域建模非常重要,但市面上介绍如何将有效的领域建模结合到软件开发过程中的著作却非常少。 本书就是为此目的而编写...
通过领域建模,软件开发人员能够展示丰富的功能并将这些功能实现为真正满足用户需要的软件。尽管领域建模非常重要,但市面上介绍如何将有效的领域建模结合到软件开发过程中的著作却非常少。 本书就是为此目的而编写...
通过领域建模,软件开发人员能够展示丰富的功能并将这些功能实现为真正满足用户需要的软件。尽管领域建模非常重要,但市面上介绍如何将有效的领域建模结合到软件开发过程中的著作却非常少。 本书就是为此目的而编写...
通过领域建模,软件开发人员能够展示丰富的功能并将这些功能实现为真正满足用户需要的软件。尽管领域建模非常重要,但市面上介绍如何将有效的领域建模结合到软件开发过程中的著作却非常少。 本书就是为此目的而编写...
通过领域建模,软件开发人员能够展示丰富的功能并将这些功能实现为真正满足用户需要的软件。尽管领域建模非常重要,但市面上介绍如何将有效的领域建模结合到软件开发过程中的著作却非常少。 本书就是为此目的而...
通过领域建模,软件开发人员能够展示丰富的功能并将这些功能实现为真正满足用户需要的软件。尽管领域建模非常重要,但市面上介绍如何将有效的领域建模结合到软件开发过程中的著作却非常少。 本书就是为此目的而...
通过领域建模,软件开发人员能够展示丰富的功能并将这些功能实现为真正满足用户需要的软件。尽管领域建模非常重要,但市面上介绍如何将有效的领域建模结合到软件开发过程中的著作却非常少。 本书就是为此目的而编写...
通过领域建模,软件开发人员能够展示丰富的功能并将这些功能实现为真正满足用户需要的软件。尽管领域建模非常重要,但市面上介绍如何将有效的领域建模结合到软件开发过程中的著作却非常少。 本书就是为此目的而...
通过领域建模,软件开发人员能够展示丰富的功能并将这些功能实现为真正满足用户需要的软件。尽管领域建模非常重要,但市面上介绍如何将有效的领域建模结合到软件开发过程中的著作却非常少。 本书就是为此目的而...
通过领域建模,软件开发人员能够展示丰富的功能并将这些功能实现为真正满 足用户需要的软件。尽管领域建模非常重要,但市面上介绍如何将有效的领域建模结合到软件开发过程中的著作却非常少。 本书就是为此目的而...
在IT行业,尤其是软件开发和架构设计领域,图形语言与图形思考能力正日益凸显其重要性和价值。根据《Android架构师手册_建模与图形思考》(By 高煥堂2012)的阐述,图形语言不仅包括文字,还涵盖了影像、符号和数字...
在数学建模领域,原赛题及实现方案的优秀论文是至关重要的学习资源,它们能够帮助参赛者理解和掌握数学建模的基本步骤、方法以及如何构建有效的解决方案。本资源集合包含了2006年至2016年十年间的美国数学建模竞赛...
混合高斯模型(GMM,Gaussian Mixture Model)是一种概率模型,常用于统计建模,特别是计算机视觉领域中的背景建模与运动目标检测。在本项目“基于混合高斯模型背景建模法来检测运动目标算法(matlab).zip”中,我们...
本资料"现代数据栈与数据建模思考共24页.pdf.zip"深入探讨了这两个主题,下面将对它们进行详细的解析。 首先,现代数据栈通常包括以下几个核心组件: 1. **数据源**:这是数据的起点,可以是各种在线和离线系统,...
存贮模型在生产和存储领域具有重要的应用价值,通过构建合理的数学模型,可以帮助企业降低生产成本,提高资源利用率,从而实现利润最大化的目标。无论是不允许缺货模型还是允许缺货模型,都旨在通过优化生产周期和...
通过学习《沈继红 数学建模》,读者不仅可以掌握数学建模的基本技能,还能培养分析问题、解决问题的能力,这对于从事科研、工程或者数据分析等领域的工作大有裨益。此外,对于准备参加数学建模竞赛的学生,此书也是...