论坛首页 Java企业应用论坛

高举Domain Specification,应用函数式编程

浏览 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的思路做。
   发表时间: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" );;
}


不过我目前好像用不到这么高级别的东东。
0 请登录后投票
   发表时间: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啊。
0 请登录后投票
   发表时间: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的性能。
0 请登录后投票
   发表时间:2006-08-11  
partech 写道

这也让我忍不住跳出来说两句,specification固然是个好东西,但是如果查询统统通过specification也是不可能的,不是每一个DomainObject都有specification啊。


是否所有的domain object都要有spec,我目前还不能确定。
但我知道应用了specification后,系统设计在概念很清晰。
当然在不考虑闭包能力的情况下,仅靠这点吸引不了众人:不过是把代码从一个地挪到另一个地,还可能背上类型膨胀的罪名,太不实用。而且话说回来了:即便是都有specification了,其内部的sql组合也是个问题。

嘿嘿,边上的大佬们都在冷笑了:小伙子,自己都不确定就跳出啷啷了。
小弟也是在尝试,因为DDD的specification及其闭包实在太诱人,在无法证明其是无法实行的情况下,只能认为是小弟功力不够!

这里算是抛了一个砖,等着各位老大给点玉呢!
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics