我在《
小议领域模型Domain Model》讨论了service和object,以及关联逻辑(咳咳,该文中的一些观点我已修正,合适的时候放上来)。关联逻辑就是本文讨论的重点--specification
一、从DDD(Domain Driven Design)说起
这个Specification来自DDD,DDD有对specification分为三个类型
1. Validation
2. Selection
3. Building
不过在初看这个Specification的概念的时候,相信很多人都有一种似曾相识的感觉。我们日常开发中, 基于SRC原则写的那些xxxxProvider,xxxHelper,xxxChecker,而此外还有讨论了无数遍的Dao。不就是这个specification嘛,换了一个马甲嘛。
二、应用Specification的好处:
现在就是我要高举specification的理由了。
1. 统一Domain model的相关支持逻辑,屏蔽了dao的存在。
请注意这个selection,即从repository中(通常是数据库)取出合适的对象列表。嗯,这个有意思了,原来总觉的dao在系统中的地位挺尴尬的,
由于先前的开发理念,Domain Model没有出现之前,我们是Transaction Script的开发模式,在ORM技术出现后,从TS转向Domain过程中,数据库访问转成dao层, 大量的约束逻辑则散落在Service层中。因而开发系统,无论是那张系统结构(架构)图中(可以参考AppFuse),我们见贯了Dao层的存在,甚至我们习惯了Dao的存在。
而应用Specification则统一了这些概念,屏蔽了dao。dao做的最多的工作是查询逻辑,而查询逻辑也是一种逻辑嘛,和validation以及building都是支持Domain Model。这个specification算是给dao正名了。不过概念上正了名,如果仅仅在于此,恐怕大多数人都会说“嗯,不错,但是还是那么不实用”:要是按specification的做法,也就是把dao的下的代码分散出去,没有获得太多的好处,搞不好还给背上类型膨胀的罪名。别急DDD还有后手呢。
2. Specification引入了FP的开发思路
DDD可不是技穷于此,随后就提出了specification的closure。明眼人一看就知道这个closure来自FP。
回顾一下函数式编程基本特性先: 1. 闭包计算和高阶函数。 函数本身是first class对象,闭包是起函数作用并可以像对象一样操作的。高阶函数是可以接受一个函数为参数,并可以返回一个函数。 2. 延迟计算(lazy evaluation) 不是在函数绑定时计算,而是在求值时计算。 3. 递归的计算机制 4. 引用透明 同样的输入返回同样的结果,与上下文无关。 5. 没有副作用 赋值后不能更改,即是constant |
现在看看DDD三种specification的组合情况。
1. Validation的组合,DDD也给出了例子代码--看着就清爽!
2. selection的组合,DDD并没有给出例子。也不幸就是这个selection比较难办,因为涉及到sql问题(这个问题往往又和性能连在一起)。刚好javaeye上有人开贴讨论组合sql的问题(http://forum.iteye.com/viewtopic.php?t=21760)
我的想法是:从domain object的角度把selection的组合范围限制在where和order两个clause。
这是最简单的,不考虑select和from,更不考虑join了。对于同一domain object其where和order的组合是简单的。DDD一书中的and,or和not操作是容易支持的。
接着要考虑支持join和union了。我估计应用系统中:普通的sql(不带join和union),带join和union的sql以及更复杂的sql语句的比例是4:4:2。
不过join处理实在麻烦,我需要一些额外的信息。所幸从试验的代码看起来还是可以接受的。
那么对于那些确实复杂的sql查询怎么办(那剩下的2)?简单。单独写一个,我的观点是太复杂的东东复用的可能性也不大,日后出现类似的东东可以考虑用OO的继承的方式搞定,CO和OO本来就不是相互排斥的。
除此外,还有和domain object无关的”分页”以及”top n”就可以独立提供specification来。 (BTW:ajoo说不能光说不练,准备和buuawhl在sql的parser上作文章了。向偶像学习,抓紧试试看能不能作出来。)
3. building的组合
这个看起来像curry,没有想好,暂时不讨论。
除此之外,系统中其它很多逻辑可以用FP的思想做,如业务规则(业务规则分类看《
DSL:基于规则系统组织业务规则》)中的Computation,至于业务规则的Constraint和Action enabler可以直接参考validation。
BTW:ajoo在javaeye的blog给出了一些很好的例子。
三、其它问题
到目前为止,一些看起来都还不错。但是还有几个问题没有解决:
1. Selection的组合问题是否真的可以实现。
这个。。。尝试中
2. 难道在开发中要为每一种类型的specification单独写组合操作的处理函数。难道不能有一种统一的。
到目前为止,还不能。 对于各个specification,无论是参数还是返回对象的类型,以及组合的细节都不同,我们不得不独立处理。
2.1 首先是参数还是返回对象的类型,真的统一的话,就会变成这样:
interface Action{ Object execute(Context ctxt); } interface Context{ Object get(String key); } |
很明显这不是我们要的
2.2 另外就是组合细节问题:
buuawhl在
http://forum.iteye.com/viewtopic.php?t=21533中列举了3个不同类型都是我们要考虑的
3. 其它
还没有想到,想到再说。
分享到:
相关推荐
高举旗帜科学发展.pptx
- **科技应用**:物联网、AI技术的应用正在改变宠物行业,如智能喂食器、定位项圈等,提高了宠物生活的便利性和安全性。 6. **政策环境**: - 国内外政策对宠物行业的监管也在不断加强,例如食品安全法规、宠物...
高举同心战斗旗帜 奋力夺取新胜利.doc
综上所述,本文档详细讨论了地下铲运机传动系统的选型、匹配计算以及可靠性设计的流程和方法,同时也涉及了机械设计与分析软件的应用,并提示了ARM处理器和内核在控制系统中的应用。这对于机械设计专业人员来说,是...
高举旗帜科学发展服装交易中心PPT课件.pptx
“高举五月火炬”党日活动总结.doc
高举旗帜科学发展服装交易中心PPT学习教案.pptx
在中国A股市场中,森麒麟作为一家以002984代码上市的公司,其发展战略和经营理念表现得尤为明确——即通过专注于产品力的锤炼,以“高举打进击”的姿态积极开拓市场。这种经营理念不仅展现了公司在产品质量和技术...
九年级政治高举民族精神的火炬教案鲁教版.doc
酷睿i9-10980XE的Turbo Boost 3.0技术在两核心使用时可达到4.8GHz,而在四核心使用时,频率虽略降,但仍能保持在4.7GHz,这显著提升了对多核心运算有一定需求但要求不极致的应用性能,比如图像处理和游戏。...
这一战略的核心是其“高举高打典藏”计划,旨在通过强化典藏系列产品的推广和升级,打入高端白酒市场。2021年,公司推出了典藏2021版,对典藏大师版的价格进行了上调,显示出对高端市场的坚定决心。 【业绩增长】...
为减小高举架储油罐的地震反应,在高举架储油罐支架底设置基础隔震橡胶垫,建立考虑刚性脉冲质量、对流质量、液固耦合质量的三质点无控及基底隔震体系简化分析模型,进行了不同容积体型的高举架储油罐有控、无控情况...
2. 高端市场定位:森麒麟采取高举高打的市场战略,瞄准高端市场,与全球知名汽车品牌合作,为其提供原装配套轮胎。这种策略使公司在竞争激烈的市场环境中树立了良好的品牌形象,同时也提升了产品的附加值。 3. 全球...
* IBM 公司提出了 “高举 Java 大旗,全力以赴” 的口号,在全世界的 11 个国家有 28 个实验室,集聚了 2 500 余技术应用、研究栏目编辑梁春丽 E-mail:tiang lizi50 5@l 63 corn 名技术人员,全天 24 小时进行全...
光大证券发布的《食品饮料行业宠物产业深度跟踪系列二:海外品牌高举高打,国内品牌另辟蹊径》报告深入分析了全球及中国宠物行业的现状与发展趋势,为我们揭示了宠物产业在食品饮料细分市场中的变化及其背后的商业...
基于神经网络的高举车辆在线预测指导