|
我被整糊涂了,请看一下我的糊涂思路 1,有一用户模型,对用户进行管理的基本操作增删改查。 2,根据我理解的 DDD 思想,以及避免模型贫血,新增、修改、删除的操作应当放到模型层中, 而查询、查询列表的操作应当放在服务类中,修改后类图如下 3,这样,在表现层调用时,如果是【查询列表】、【新增保存】操作,流程应当是这样: 4,就是说,有时候这个服务层需要,有时候这个服务层又不需要,这样..[...]
现在有如下的业务需求:订单的基本信息(Order)与订单收件人信息(Consignee)分别是两个对象,这里我建模的时候定义Order为实体,Consignee为值对象(这个值对象的理解不知道有没有问题),而且模型关型是一个Order聚合根导向Consignee的一个单向关联。但是在hibernate映射的时候不知道如何映射这种关系。下面贴出一些简单的代码,希望大家给予帮助。谢谢! ..[...]
最近在项目中实践领域驱动设计的方式开发,在建好模型,划分好聚合后,开始编码时在仓储持久方面遇到些疑问希望各位有经验的前辈们帮我解答下,谢谢: 我举个实际的例子吧。拿订单来说: Order----- |------OrderLines:List<OrderLine> |------OrderLogs:List&..[...]
Evolutionary architecture and emergent design: Leveraging reusable code, Part 1 这是IBM的一篇文章,一旦你确认了惯用的模式,下一步你就进入收获期,理解设计和代码之间关系,能够发现可重用复用的代码,这篇文章阐述了代码与设计的关系,指出重要是用一个可表达有表现力的语言,然后重新不断思考抽象,挖掘潜在价值。 文章指..[...]
DDD这种开发方法论已经关注几年了,也是想把这种先进的方法论融合在开发过程当中。但这种开发方法论在在这种企业、政府的大型软件开发过程中,总感到向banq老师的一幅图一样悬在空中,无法真正去实际操作。 最主要的问题有两个,一个是人才,一个是开发。 在这种大型软件开发过程中,首先一个项目是几十个人进行协同工作,由于招聘的难度,培养的难度,能够保持一个核心团队有这样扎实的思想就已经很不错了。我认为通过需..[...]
Gojko Adzic » Evolution of DDD : CQRS and Event Sourcing Greg Young 一直在 DDD 实践领域很活跃,CQRS倡导将读写分离,那么读写分离以后,我们是否需要使用同一个数据源呢? Greg Young倡导将查询读的数据和命令修改的模型都是同一种正常的领域模型,我们所做的就是在两者之间同步,比如ForumMessage..[...]
现在我们有一个项目,客户端主要分为两类功能,一类是许多类似网站后台似的管理程序,主要是增删改查,感觉用bs更好,另一类是完成图像处理的功能,其交互复杂性和计算要求更适合采用CS程序,而且整套系统中数据流转时bs程序和cs程序有很多业务数据是相关的,需要公共访问的类、接口等。 这时问题就来了,Entity一般都不是贫血的,包含了很多业务方法,但这些方法依赖于service、specification..[...]
请问以下这种情况怎样处理比较好? 系统中有多个group,每个group有多个user,另外还可以添加、删除、重命名group,看起来group与user是聚合而且group和user都是Entity。 但我们这个项目的实际应用中又几乎不会用到group,group就是在查看user的时候让user分成组,其他情况下基本都关注user,比如一些业务逻辑都围绕user和其他Entity展开。如果按聚..[...]
本人偶然间想到,Google了半天也没有找到相似的东西。在此抛砖引玉,望各位不吝赐教。 信息唯一性原则是解耦合与促进一致性的数据结构设计方法。一个信息只出现一次,其他地方只是引用。 比如客户买书《xxx》这一业务,需要进行两次相关操作,即书店将《xxx》这种书的数量减1,客户账户中《xxx》这种书的数量加1。需要注意,这里是《xxx》,是指一个种类,后面建模时提到的《xxx》是具体的卖出的那一..[...]
05年底的时候,我们项目组要开发一个ERP的系统。我们选择了jsf(ADF)+spring+hibernate的架构进行系统开发,3层分层架构进行设计开发。技术经理把表设计好,跟我们讲清楚表和表之间的关系,然后我们写model,dao,manager,form来实现。那时候我根本没有什么面对对象的设计或者面向数据库的设计的概念,感觉应用系统主要就是设计表之间的关系,数据库的一系列操作。这样浑..[...]
我的一个项目中,引入了一个类似 DDD 的分析,然后跟兄弟们就搭手创建,实现代码! 但是,在我们创建的过程中,以及不断的分析中,我们发现全部按照 DDD 来实现有很多比较牵强,或者说是有点复杂化了,在此表述出来跟同行的xdjm们探讨探讨。 我们从最开始就用 DDD 的模式进行业务分析,找出其中的业务对象:实体、值对象、工厂、仓库、以及类似聚合根的facade对象,用来实现一个简单的表单..[...]
我在我们的项目中引入了 DDD 的分析方式,可能有点粗略,但是我尽量往 DDD 靠近,有几点迷惑: 1.统一语言:我们掌握需求信息,根据获取的用户需求列表来分析业务;根据我们的经验来抽取统一语言;我们使用统一语言来建模,实现对象之间的关联关系,但是最大问题是,我们确定的这个统一语言是在变化的,尤其是跟遗留系统产生冲突的时候,很多人不适应这种方式。我认为这种分析层次上的重构是相当必要的,但是..[...]
最近,在分析设计一个虚拟课堂系统,该系统的大概功能需求是这样的,用户可以注册后,作为听众或学生的角色在系统中的虚拟课堂中听课,也可以申请虚拟课堂,以教师的角色在虚拟课堂中授课。系统有分三种用户:管理员(admin),注册用户,普通浏览者。三者的权限为: 1》管理员可登陆系统,并管理课堂系统中的日常 事务 ,如审核新注册用户资料,审核课堂申请资料,并分配课堂和相关设置;管理员可以以隐身..[...]
自从学习 DDD 后,我开始抛弃过去整页的setter和getter,不断细化对象,但是我发现一个问题,比如值对象,因为 DDD 明确说了值对象是不可更改的,所以setter方法应该是不需要的,于是我们顺理成章地把它们清除,这样便带来一个问题,我依稀记得hibernate要求有成对的setter和getter方法(有段时间没用了,记错了请见谅),那这明显违背 DDD 原则了,目前我能想..[...]
最近在对之前做过的一个项目进行二期修改。鉴于之前典型的贫血结构,以及Controller--->Service--->DAO模式让代码压力都集中在service层的情况。在参考了Banq写的几篇对象职责和Domain Event的文章后,我也试着捣鼓了一下新的分层模式。贴出来和大家讨论,欢迎拍砖! 【1】层次划分: ①控制层:数据映射、控制转向、业务调用 ②业务层:从用户角度出..[...]
由 Robert Martin提出的S.O.L.I.D 原则,用来更好编写面向对象程序,更灵活应对变化。 S - Single Responsibility Principle 单一职责,简称SRP 这个我前面几篇文章刚刚写: 对象的责任与职责 如何从职责和协作中发现丰富对象? 比如:报表的内容和报表的格式都会变化改变,但是这两种变化的性质不同,一个是实质内在,一个是表面上的,SRP..[...]
DDD领域驱动设计给我们指出统一建模统一语言的方向,从辨识角度提出区分实体和值对象的方法,如果说 DDD 只是给出了领域建模的方向,也就是WHAT部分,那么, 对象设计:角色、责任和协作"(Object Design: Roles, Responsibilities, and Collaborations) 则更详细地从HOW角度提出如何从职责和协作中发现并丰富对象。 从程序员角度来看:职责..[...]
请问,项目使用 DDD 方式开发的话,开发顺序是否先是 Domain Model, 然后才是 Repository, 然后调用 Dao 或者不用 Dao 也行,将对象持久化,然后再设计数据库? 因为受传统观念影响,我一直是认为项目开发应该是先开发数据库的。因为这个观点,我看了两天这方面的资料,都不能理解 DDD 的理念,现在朦朦胧胧就是感觉 DDD 和传统方式开发的最大区别..[...]
对象和数据的主要差别就是对象有行为,行为可以看成责任职责(responsibilities以下简称职责)的一种,理解职责是实现好的 OO 设计的关键。“Understanding responsibilities is key to good object-oriented design”—Martin Fowler 。 对象设计:角色、责任和协作"(Object Design: Role..[...]
最近在看 DDD ,对其中描述实体和值对象的区别有点困惑。“实体是可变的,而值对象是不可变的”对值对象的说法有些不明白,是说值对象一旦创建了就不能改变值对象中的属性的值么?另外作者说在一些性能领域值对象可以复用,但又说值对象不能改变。这说法是否是冲突的?这个不能改变到底是不能改变什么? 我的想法是如果一个值对象要被共享,那么它的值应该不能被改变。如果不需要被共享,那么它就应该可以被改变。不知道..[...]
命令查询职责分离模式Command Query Responsibility Segregation (CQRS),也就是命令查询分离Command Query Separation [Young]有很多好处, Why I Love CQRS 一文从与传统的ActiveRecord和ORM等方面进行了详细分析。 ActiveRecord是 Ruby on Rails(RoR)强大的快速的技术,它..[...]
如果保证更新俩个聚合对象的内部状态的最终一致性。 eg)jdonjive 假设状况如下,必须同时更新俩个不同的聚合对象 ForumMessageReply tmp;//create a Object Forum1.addNewMessage(tmp);// Forum2.addNewMessage(tmp);//当执行到这儿时,业务规则不通过。 你们是如何维护或恢复第一个聚合对象的状态呢? 如..[...]
对于一个在线销售的系统,并不跟踪至每一件商品,也就是说同一种商品都是一样的,系统不会处理某件商品的状态,那么“商品”是不是一个值对象(或“商品描述”)?但商品的价格是会改变的,与值对象的不变性是不是冲突?订单、商品、商品描述、价格、库存数量这些关系怎么处理? 我想这是一个非常普遍的例子,用 DDD 的时候感觉一些混乱,请大家发表一下高见。[...]
命令查询的责任分离Command Query Responsibility Segregation (简称CQRS)模式是一种架构体系模式,能够使改变模型的状态的命令和模型状态的查询实现分离。这属于 DDD 应用领域的一个模式,主要解决 DDD 在数据库报表输出上处理方式。 来自 Rethinking architecture with CQRS 一文对CQRS进行详细描述。 很多应用..[...]
DDD 提倡通过聚合的根来访问聚合中的其他领域对象.我有个疑惑,比如产品管理,产品需要分类.所以就有两个领域对象一个是Product,另一个是Category.这个聚合的根应该是Product吧(如果为Category的话,供应商之类的就没法处理了.).那么我的问题是,如果我需要一个产品类别的列表,然后用户可以通过产品类别的列表来查看列表下的产品,那么我怎么通过这个聚合的跟来访问到产..[...]
准备下一个项目采用域模型驱动开发, 但是有几点困惑, 请各位道友谈谈自己的见解。 1. 采用Domain Events机制的时机 版主在[url]http://www.jdon.com/jivejdon/thread/37712 [/url]中讨论了一种Case。采用Domain Events的 异步 处理,开启一个新的线程,getMessageCount在另外一个Transaction中查询..[...]
以Erlang为代表的面向功能语言functional programming(FP)越来越热门,虽然本身有比较难学等缺点, Where functional programming fits in 一文总结总结了FP适合哪些场合? Java平台的Scala,.NET的F#都是FP语言,而Ruby因为包含一些FP特点受到欢迎。 FP特点: 1.FP代码没有边界影响“side effects.”..[...]
背景:设计之道新手 前提: 问题:究竟如何处理领域模型实体和ORM实体之间的关系 简介:(1):不管怎么样ORM的便利性是一种趋势,DDD中使用ORM貌似非常常见,那么如何处理 DDD 领域模型实体和ORM实体之间的关系呢? (2):来个实例:需求:需要维护一批产品,能够即时的列出某一类产品的数量,价格之类的.那么根据这个需求,我们分析:领域对象:(1):产品(2):产品类别 那么在..[...]
有这么一种情况,不知道大家是否遇到,当一个Entity A中包含了一种Value Object A,而且,使一对多的关系,就是说一个Entity A包含多个Value Object A,我想问问如何维护,比如,我想删除其中一个Value Object A从这个Entity A中,或者我想保证Value Object A的内容不重复。 具体例子是,如果一个账户(entity)拥有多个地址,比如Am..[...]
NoSQL数据库一般有四个类型: 1. key-value存储,基于amazon的Dynamo Papaer 主要是k-v集合,主要产品有dynomite, voldemort,Tokyo 2.BigTable clones: 基于google BigTable Paper,大表 列组合,主要产品有Hbase, Hypertable 3.文本数据库:学习lotus notes,主要产品有Couch..[...]
使用面向对象思维的MDD/DDD已经是一种主流发展方向,DSL属于MDD一个更高级发展,企业架构网站昨天推出一篇 15 reasons why you should start using Model Driven Development ,有15种理由,应该足够说服任何人了。 1. MDD is faster MDD很快(真正快速开发) 在MDD应用模型中能够指定一个比传统的编程语言更高的..[...]
Domain Events领域事件定义见这里 Domain Events – 救世主 ,领域事件可以实现领域业务模型与技术架构之间的松耦合,达到实现类似 DCI架构 同样效果。 DCI是通过设定一个场景对象,让与这个场景有关的功能在场景中混合实现,注入参与者角色和参与模型;而领域事件则是通过松散的事件达到场景目标,不同场景对应不同领域事件。下面以 JiveJdon 实例说明领域事件应用。 ..[...]
无意发现一篇文章,写得很不错,来自Anders小明的Blog,原文地址: http://www.blogjava.net/AndersLin/archive/2009/05/07/269496.html 摘取部分,大家可以去看一下原文 摘录自"Anders小明的Blog" 为何要面向对象? 1. 面向对象是自上而下的开发方法;这种方式对于迭代增进式的结构化过程来说成本是最低的; 2...[...]
受Qi4j Baston和javAte等 DDD 框架鼓舞,JdonFramework 6.2全新登场,该版本进行了重大改进,将Domain Events作为重点架构引入,做到容易使用,架构可伸缩等特点,使Jdon框架向真正 DDD 框架又迈进一步。 当前 DDD 实践领域达成一个共识:领域模型应该和技术架构无关,至少是非常松耦合,那么领域模型如何指挥技术架构为其业务逻辑服务呢? ..[...]
或许你只是一个普通的程序员,对项目没有任何的控制力,而且只能使用公司中成熟的框架程序; 或许你是一个项目管理者,但是这个项目太大了,涉及了好多方面,你无法自己决定一切。 总之,当我们很多人在学习了 DDD 之后,遇到的最大的困惑就是:到底在什么地方使用它呢? 自己做个小东西玩玩?总觉得不是那么回事。 想在项目中使用,可是自己没有决定的权利,公司不会轻易改变已经稳定的东西。 所以,学习 ..[...]
通常软件需求有功能性需求和非功能性需求,在以往数据库驱动方式下,这两个目标是分别需要考虑的,是一个需要分别衡量的指标,但是因为使用 DDD ,就可以将这两个需求融于一身实现,这不但对象 OO 的功能,更是 DDD 定义的聚合边界的功能, Improving performance and scalability with DDD 一文对此进行了详细阐述。 这篇文章大部分观点可..[...]
感谢banq,这几天一直在研究 DDD sample 实例代码,结合目前项目正在使用的开发框架写点理解心得: 先说一下目前我们项目框架也是三层结构(见下图): 显示层:struts配置文件(jsp,js,action,actionform) 业务层:spring配置文件(service,vo) 持久层:spring,hibernate配置文件(dao,po) ..[...]
还是续上次与banq讨论的那个问题 ForumBoard与ForumSubject是一对多的关系如果设计成聚合便是 ForumBoard{ private List<ForumSubject> forumSubjects; public List<ForumSubject> searchSubjectByTitle(String title) //这个便是根据聚合..[...]
最近正在研究 DDD sample 源代码,想了解代码中框架的层次结构及对象关系,但无奈对要实现的业务场景不是很了解,看代码不是很直观,不知道具体的业务是什么,所以希望好心人士能帮助简单描述一下该例实现的业务场景,不胜感激 [该贴被agilestone于2009-10-13 17:01修改过][...]
在Evans DDD 实现过程中,经常会碰到实体和服务Service以及Repository交互过程,这个交互过程的实现是一个难点,也是容易造成失血贫血模型的主要途径。 因为实体的业务方法需要和服务或Reposirtoy打交道,如果把这个业务方法放入服务,就容易造成实体的贫血;但是如果把服务注射到实体中,也非常丑陋。这里提出一个中间处理模式:Domain Event,领域事件模式,这个模式..[...]
请教个有关 DDD 的问题,例如一个论坛中的两个类:ForumBoard(板块),ForumSubject(主题) 一个板块有多个主题,那板块和主题就是1-*的关系,设计类时自然是 ForumBoard{ list forumSubjects addSubject(ForumSubject forumSubject){ forumSubjects.add(forumSubjec..[...]
Sculptor严格来说是一个代码生成工具,帮助那些基于模型驱动开发的团队快速开发项目。通过使用Sculptor,开发者可以专注于开发业务逻辑代码而忽略技术细节。开发者可以借助Domain-Driven Design(DDD),使用Sculptor特定的Domain Specific Language(DSL)编写用例,Sculptor通过解析DSL生成基于Spring和Hibernate/JPA..[...]
在我们应用 OO 进行分析设计的时候,又提出了贫血和充血的概念.并产生了很大的争论.结合 DDD ,在这里,我也谈谈我的想法。 1.贫血模式说白了就是把对象看成是数据的载体.因为它不存在实际的操作动作,只是各种数据的集合.从这个角度,尽管我们设计出来了对象.实质上我们只是在过程式开发模式(没有用 OO 语言的时候)外面包了"外套"--对象.这个对象好象是个容器,容纳了我..[...]
24日一篇 Qi4j and the NoSQL movement 文章开始谈Evans DDD 和数据库的关系,指出如何使用对象替代关系数据库设计。 JavaZone 2009 第二个介绍就是"På tide å kaste ut relasjonsdataben"(Is it time to throw out the relational database? 是时候扔掉关系..[...]
目前好多搞软件开发的人仍然从数据库编程的思想出发考虑问题。实际在我刚接触编程的时候也是数据库的设计思想,脑子里总是想着数据如何存储的,然后再去设计实现。从 DDD 的角度,这个是完全错误的思想,而且也违背了 OO 设计思想。 DDD中的实体和值对象在我刚开始接触的时候,理解了一点,但是总感觉欠缺什么地方没有搞明白,总是考虑持久化的问题,总在思考:既然在实体中包含了值对象,那这个值对象的数据..[...]
最近从http://dddsample.sourceforge.net 下载 DDD sample例子进行学习,等使用maven构建打war包时始终报错,看错误原因是因为测试代码没有通过,最后跟踪发现是argoTrackingViewAdapterTest.java 代码中: assertEquals("1970-01-01 01:00", event.getTime()); 测试无法通过,通..[...]
主页连接:http://www.javate.amattioli.it/mainsite/description.html 一个好的设计思路如果能有一个好的架构支持将更加游刃有余,这是我所知道的第一个真正迎合 DDD 思路而设计的架构[...]
这段时间,围绕Evans DDD 的DSL实现是一个大热门,有的从语言角度重新定义,比如 Scala vs. Clojure 虽然Scala很象Java,但是语法比Java要复杂多, My experience with Scala (so far) 认为,Scala功能要比Java强大,但是学习曲线不低。 Bruce Eckel这位编写"Java编程思想"一举成名的所谓大师,写了一篇 ..[...]
|