原创作者: yimlin   阅读:1490次   评论:0条   更新时间:2011-05-26    
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的思路做。
评论 共 0 条 请登录后发表评论

发表评论

您还没有登录,请您登录后再发表评论

文章信息

Global site tag (gtag.js) - Google Analytics