浏览 5251 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2006-08-11
http://forum.iteye.com/viewtopic.php?t=21760
balaschen发帖说要提供sql的对象化拼装,buuawhl老大说思路不对,可是ajoo(我的偶像啊)也说要整整这个sql拼装(偶像啊,还是把高贵时间用在刀刃上吧)。 让我忍不住跳出来新开一帖讨论(观点不一定正确,还是尝试中), 我是同意buuawhl的,不过可能出发点不一样。 buuawhl 写道 组合子不错,不过用错了地方。 SQL拼装采用组合子(比如包括Hibernate Criteria)这种思路,完全是画蛇添足,一无是处,成事不足,败事有余。 我是倾向于DDD中提出的selection的Specification的手段。 我们工作的目标是什么:selection的查询逻辑。 换句话说我们是组合查询逻辑的。不过是因为repository是数据库类型,因而内部需要组合sql语句。 那么组合的对象应该是更高一层抽象的specification,而不是sql的对象化形式expression, 而这样做两个好处是: 第一,解决了dao的在设计分层中的尴尬地位。典型的分层体系如appfuse, 查询本身是一种逻辑,而dao独立层次的存在把不同的查询logic来了个大集中,这样的用法就很尴尬。 而如springside则好些,虽然把dao作为service来用,但是criteria的组装独立于dao之外。 而DDD提出的Specification,就很好的解决的这一分层问题。 第二,提供了一定的函数式编程能力(组合子编程), 提供三种简单的操作and, or和not. 我以为DDD在这里不考虑去组合基本的Expression, 而是从业务角度考虑,组合的是specification,返回的是domain object list(这样更是显示的和sql中的projection区别开) 当然这样的组合能力可能不强,不过基本可用(本句话未经验证,还没有来得及做)。 至于内部即便是用sql也是可以的,如果觉得被"污染"了(buuawhl老大语录),就参考ibatis的思路做。 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2006-08-11
yimlin 写道 而是从业务角度考虑,组合的是specification,返回的是domain object list(这样更是显示的和sql中的projection区别开) 感觉你要实现的东东有点类似规则引擎干的事情,看看drools提供的Query query "people over the age of 30" person : Person( age > 30 ); end 调用代码: QueryResults results = workingMemory.getQueryResults( "people over the age of 30" );; System.out.println( "we have " + results.size(); + " people over the age of 30" );; System.out.println( "These people are are over 30:" );; for ( Iterator it = results.iterator; it.hasNext();; ); { QueryResult result = ( QueryResult ); it.next();; Person person = ( Person ); result.get( "person" );; System.out.println( person.getName(); + "\n" );; } 不过我目前好像用不到这么高级别的东东。 |
|
返回顶楼 | |
发表时间:2006-08-11
yimlin 写道 http://forum.iteye.com/viewtopic.php?t=21760
balaschen发帖说要提供sql的对象化拼装,buuawhl老大说思路不对,可是ajoo(我的偶像啊)也说要整整这个sql拼装(偶像啊,还是把高贵时间用在刀刃上吧)。 让我忍不住跳出来新开一帖讨论(观点不一定正确,还是尝试中), 我是同意buuawhl的,不过可能出发点不一样。 buuawhl 写道 组合子不错,不过用错了地方。 SQL拼装采用组合子(比如包括Hibernate Criteria)这种思路,完全是画蛇添足,一无是处,成事不足,败事有余。 我是倾向于DDD中提出的selection的Specification的手段。 我们工作的目标是什么:selection的查询逻辑。 换句话说我们是组合查询逻辑的。不过是因为repository是数据库类型,因而内部需要组合sql语句。 那么组合的对象应该是更高一层抽象的specification,而不是sql的对象化形式expression, 而这样做两个好处是: 第一,解决了dao的在设计分层中的尴尬地位。典型的分层体系如appfuse, 查询本身是一种逻辑,而dao独立层次的存在把不同的查询logic来了个大集中,这样的用法就很尴尬。 而如springside则好些,虽然把dao作为service来用,但是criteria的组装独立于dao之外。 而DDD提出的Specification,就很好的解决的这一分层问题。 第二,提供了一定的函数式编程能力(组合子编程), 提供三种简单的操作and, or和not. 我以为DDD在这里不考虑去组合基本的Expression, 而是从业务角度考虑,组合的是specification,返回的是domain object list(这样更是显示的和sql中的projection区别开) 当然这样的组合能力可能不强,不过基本可用(本句话未经验证,还没有来得及做)。 至于内部即便是用sql也是可以的,如果觉得被"污染"了(buuawhl老大语录),就参考ibatis的思路做。 这也让我忍不住跳出来说两句,specification固然是个好东西,但是如果查询统统通过specification也是不可能的,不是每一个DomainObject都有specification啊。 |
|
返回顶楼 | |
发表时间:2006-08-11
balaschen 写道 感觉你要实现的东东有点类似规则引擎干的事情,看看drools提供的Query
query "people over the age of 30" person : Person( age > 30 ); end 调用代码: QueryResults results = workingMemory.getQueryResults( "people over the age of 30" );; System.out.println( "we have " + results.size(); + " people over the age of 30" );; System.out.println( "These people are are over 30:" );; for ( Iterator it = results.iterator; it.hasNext();; ); { QueryResult result = ( QueryResult ); it.next();; Person person = ( Person ); result.get( "person" );; System.out.println( person.getName(); + "\n" );; } 不过我目前好像用不到这么高级别的东东。 没有那么高级吧,我只是想从db中获取一些符合条件的数据,因为不是在内存中,要利用db的性能。 |
|
返回顶楼 | |
发表时间:2006-08-11
partech 写道 这也让我忍不住跳出来说两句,specification固然是个好东西,但是如果查询统统通过specification也是不可能的,不是每一个DomainObject都有specification啊。 是否所有的domain object都要有spec,我目前还不能确定。 但我知道应用了specification后,系统设计在概念很清晰。 当然在不考虑闭包能力的情况下,仅靠这点吸引不了众人:不过是把代码从一个地挪到另一个地,还可能背上类型膨胀的罪名,太不实用。而且话说回来了:即便是都有specification了,其内部的sql组合也是个问题。 嘿嘿,边上的大佬们都在冷笑了:小伙子,自己都不确定就跳出啷啷了。 小弟也是在尝试,因为DDD的specification及其闭包实在太诱人,在无法证明其是无法实行的情况下,只能认为是小弟功力不够! 这里算是抛了一个砖,等着各位老大给点玉呢! |
|
返回顶楼 | |