用户操作
[即时聊天] [发私信] [加为好友]
wanghailongID:buaawhl
100790次访问,排名894好友0人,关注者1
buaawhl的文章
原创 49 篇
翻译 0 篇
转载 0 篇
评论 152 篇
最近评论
bruce_lau:看看这个解决方案,对象的缓存和jive差不多,列表也是选id,但是对列表还有缓存,还可以根据字段作散列列表缓存,这样列表的缓存命中率非常高,是一个比较好的数据库缓存解决方案。参见http://shedewang.com/akaladocs/api/com/akala/dbcache/core/BaseManager.html
yipeng6213:个人觉得fastm真的很不错,我之前的模板是用velocity写的,我现在想把它转换成fastm的,但其中velocity模板中的if elseif else 怎么 用fastm替换呢?请问有没有具体的实例 给我参考一下,急!
lidaoguang00109:谢谢您的努力.
这个FastM我使用过了,觉得很不错.
容易上手,特别是可以直接用HTML观察模版的布局形态,有利于界面效果的评估.
现在有一个问题一直困扰我.
就是如果实现一个Table,每一个列被点击后都能排序,用FastM如何实现呢?每一次ValueSet DOM都要重新设置吗?
vkuja2003:楼主做学问的方法很值得学习
noia_zhou:我拜读了你的持久层和cache设计的一些文章,觉得想法很不错。我觉得现在的持久层框架还是挺复杂的,如hibernate等,单看看它10几兆的开发包就知道了,我的初步想法是利用po跟table的字段一致性,通过反射po得到要执行的sql。这样做的好处是少了很多表结构的配置文件。然后做一个简单dao来完成。这里我的想法是做两个dao,一个BaseDao,BaseChaheDao。其中两者都是 继……
文章分类
收藏
    相册
    友情blog
    http://smsbim.bokee.com/
    存档
    软件项目交易
    订阅我的博客
    XML聚合  FeedSky
    订阅到鲜果
    订阅到Google
    订阅到抓虾
    订阅到BlogLines
    订阅到Yahoo
    订阅到GouGou
    订阅到飞鸽
    订阅到Rojo
    订阅到newsgator
    订阅到netvibes

    原创 Domain Pollution Resolution 域污染解除收藏

    新一篇: Domain Pollution Resolution (English) | 旧一篇: Java Web开发构想(5) -- 7.O/R; 8.总结

    Domain Pollution Resolution

    域污染解除

    0. Domain 名词解释

    首先说明一下 Domain 在本文中的意思。

    <<Domain Driven Design>> 一书,令 Domain 这个词很火。引起了广泛争论:哪些Logic 应该放在 Business Service Layer, 哪些应该放在 Domain Object里面。这类争论纷纷扬扬,最后通常都上升到哲学高度,世界观高度,认知心理学高度。如果不幸发展到极端情况,双方很可能开始相互质疑对方的智商和对世界的基本理解能力。

    这个层次的Domain 纷争,不是本文所关心的话题。

    我一向认为,设计能够满足如下的条件,就可以称为是一个好的设计:能够使用多态性,代替Hard-Coded if else switch 等逻辑分支;新需求来的时候,不需要在旧代码里面添加if else switch等逻辑分支,而只需要加入一个新的Class;尽量避免 Package, Class 级别的交叉引用。

     

    本文所关心的Domain 是一个更高的层次,类似于DSL, Domain Specific Language 里面的Domain的意思。

    本文主要讨论如下议题:

     

    HTML是否只应该用来表示结构?

    HTML是否应该包含逻辑?

    HTML是否应该包含服务器端脚本逻辑?比如,JSP, Velocity, Freemarker.

    HTML是否应该包含浏览器端脚本逻辑?比如,Java Script.

     

    Java 代码中是否应该输出HTML标签?比如,Taglib, Tapestry Page Component, etc?

    Java 代码中是否应该使用框架特殊的HTML View Model? 比如,XMLC, Wicket, Echo, etc.

     

    HTTP Web Server本来的设计宗旨是无状态,支持大用户量,多连接。目前的server sidepage flow, web flow, continuation, 力图使得HTTP Web Server保持用户的流程状态。这种做法是否应该推荐?

     

    SQL是一种可读性很好,应用广泛的一种DSL。如何动态拼装SQL,一直是一个难以解决的问题。

    是否应该在Java 代码中嵌入SQL?

    是否应该在Java 代码中使用 Criteria API?

    是否应该在SQL Template中加入动态语言脚本逻辑?比如 iBatis 使用XML if otherwise,  OR Bridge中使用velocity?

    HQL, OQLSQL中引入了OO语言的特性,似乎操作的是对象数据库,而不是关系数据库。这种做法是否应该推荐?

     

    Hibernate 动态期间篡改用户代码的做法,是否应该推荐?

    JDO静态期间篡改拥护代码的做法,是否应该推荐?

     

    Dynamic Proxy, CGLib等动态篡改用户代码的做法,是否应该推荐?

    Reflection绕开了 Java 的类型检查机制,是否应该推荐?

    Thread Local是一种隐式契约,相当于绕开了显式契约(方法签名method signature),这种做法是否应该推荐?

     

    这些属于开发模式、代码风格方面的问题,正如所谓Code Smell的感觉一样,也避免不了主观的成分。所以,下面的陈述并非论断,而只是“在我看来”。

    1. HTML Template Layer

    HTML应该尽量只用来表示结构,排除所有逻辑。

    JSP, Velocity, Freemarker等服务器端脚本逻辑,属于Java Code或者Script CodeHTML的污染。

    不仅应该排除JSP, Velocity, Freemarker等服务器端脚本逻辑,而且应该排除浏览器端脚本逻辑,比如Java Script.

    当然,这里不是说,不用Java Script,而是说,不要把Java Script放在HTML里面。把Java Script放在一个单独的.js文件里面,在HTML中引入,并使用CSSHTML Element Java Script Event Handler 联系起来。

    这方面的资料有:

    Unobtrusive Javascript
    http://www.onlinetools.org/articles/unobtrusivejavascript/

    http://www.kryogenix.org/code/browser/aqlists/

    http://www.bobbyvandersluis.com/articles/goodpractices.php

    如何排除HTML中的Server Side Logic呢?

    Ajax!

    Ajax fans一定反应迅速,给出答案。

    没错。Ajax可以做到。Ajax的主要问题在于使用和掌握难度。

    除了Ajax呢?

    有几个选择,XMLC, Jivan, fastm, Wicket, Echo等。(and Tapestry?)

     

     fastm是我做的一个模板层,具体内容可以在此下载。

    https://fastm.dev.java.net/files/documents/1911/25042/fastm1.0c.zip

     

    fastm采用 XML Comment 作为文档结构标记。注意,是结构标记,而不是逻辑标记。不含有for if else

    可见,fastm并不是毫无污染,只是没有逻辑污染。fastm只在HTML中添加了自定义的结构标签,也勉强算没有违背HTML只用来表示结构的原意。

    Ajax, XMLC, Jivan HTML很干净,而且对HTML 结构的控制能力很强,能够用代码动态控制布局。fastm也能够动态控制布局。Site mesh, tiles taglib, jsp, velocity, freemarker等做不到。

    fastm 里面的例子中,包括一个分页的例子,和一个动态组装SQL的例子

    2. Java Web Layer

    Taglib, Tapestry Page Component, Echo, Wicket等在Java 代码中输出HTML标签,这也是一种,而且要求在Java 代码中使用框架特殊的HTML View Model,比如Table, List, Label, Formbean View Object。使用了这些框架,Java 代码的编译就需要依赖于这些框架了。

    这相当于HTML标签对Java 代码的污染。

    JSP, Velocity, Freemarker都不存在这种情况。Java 代码只是提供POJO,然后 HTML里面的Server Side Script使用这些POJO

    fastm不支持逻辑,所以这个方面弱一些。fastm要求Java Codeif, else 等逻辑分支变成一个Map 结构。由于Map属于java的基本类,所以,fastm也不需要在Java code中使用任何特殊的框架相关的view model

    3. Web Layer - Stateless or Stateful

    与其在服务器端支持 page flow, web flow, continuation,那不如在浏览器端支持状态。这种场合下,我觉得,正是使用Ajax的最佳场所。

    我倾向于这样的设计,服务器端尽量无状态,如果确实需要状态,那么尽量在浏览器段保持状态。

    lightweb是我做的一个Web框架。

    https://lightweb.dev.java.net/files/documents/4371/25044/lightweb0.9b.zip

     

    主要的特点是,URL-Centric, 鼓励无状态的Service Oriented设计。支持三种Service模型,

    Action (like WebWork Action),

    Controller (like Spring MVC Controller),

    Channel (like Struts Action Dispatcher),

     

    lightweb支持多级模块寻找,使用几条匹配规则,代替庞大的Site Map 配置文件。

    lightweb查找View的时候,不是根据Site Map 文件里面的那种小型状态机的配置(success -> showIt.jsp;  fail-> this page, 而是直接资源定位。lightweb继承了fastm的观点,把template看作资源,而不是一段运行脚本。

     

    Lightweb设计为IoC友好。在各个环节都暴露出插件接口。程序员可以自己选择IoC策略。可以采用一般的做法,用一个IoC container集中管理,比如,Spring IoC, Pico, Nano等;也可以分散到各子模块,进行管理;也可以分散到每个Action Validator里面管理。

     

    4. ORM Layer

    Hibernate 动态期间篡改用户代码,JDO静态期间篡改用户代码。

    令我想起黑客,木马,夹带,偷梁换柱等。这属于语义上的Pollution。就是说,从原有的Source看起来,Domain Object并没有那样的行为,运行起来却有那样的行为。

    iBatis采用reflection,确实干净。但是,性能、功能上又不够强大。某些功能的实现,确实需要代码生成。

    lightor是我做的一个ORM框架。

    https://lightor.dev.java.net/files/documents/4370/25043/lightor0.5a.zip

     

    lightor也需要代码生成。区别在于,lightor不修改任何代码,只是产生新的Mapper代码。Domain Object运行的时候,还是你原来的Domain Object。这就避免了语义的污染。

    lightor生成的Mapper代码,可以编译期类型检查,可以阅读,跟踪,调试。这些生成的代码,也都遵循本文的原则。Java 代码里面不含有SQL片断,SQL都存在于单独的资源文件中。

    (另外,不采用CGLib,也是为了实现的简单)

    lightor直接使用Native SQLLightor的目的不是屏蔽关系数据库,而是恰好相反。lightor的目的是,帮助程序员更清楚地认识关系数据库,SQLJDBClightorJDBC不冲突,可以一起使用。

    lightor努力的第一个主要方向就是效率。大数据量查询和处理的效率。

    据我所知,目前只有lightor才支持大数据量批量处理,因为只有lightor不惜降低ORM的身份和封装层次,能够接受ResultSet作为参数。

    lightor的缓存策略比Hibernate更前进了一步,把query cache ID Cache集成在一起。以便得到更好的控制。并且,把缓存API暴露给程序员,以便智能的控制某个特定的缓存。

    5. SQL

    HQL, OQLSQL中引入了OO语言的特性,似乎操作的是对象数据库,而不是关系数据库。

    我感觉,这是一种语法层次上的Domain PollutionOO语法对SQL语法的污染。

    正如感觉LinkQ是数据库查询语法对OO语法的污染。

    Java 代码中使用 Criteria API,也属于数据库查询领域对OO领域的污染。

     

    SQL是一种可读性很好,应用广泛的一种DSL

    我的看法是,尽量把完整的SQL放到单独的资源文件中,可以直接CopySQL Client就可以运行。特殊优化过的Native SQL,也是同样的地位。

    HQL, OQL阻碍了用户对SQL进行特殊优化。

     

    如何动态拼装SQL,一直是一个难以解决的问题。

    直接在Java 代码中嵌入SQL,肯定不行。前面说了,Java里面最好不要有SQL片断,最好放到另外的资源文件中。

    Java 代码中使用 Criteria API? 前面也否定了。

    SQL Template中加入动态语言脚本逻辑?比如 iBatis 使用XML if otherwise,  OR Bridge中使用velocity?

    这种方法还是不错。不过仍然在SQL里面引入了脚本逻辑。

    我也没有好的做法。我采用fastm来处理。在SQL里面引入结构标记。这也相当于污染。因为SQLHTML不同。SQL不是描述结构的,而是一门DSL

    这种做法的一个好处是,整段SQL还是可以CopySQL Client里面,稍微修改一番,就可以直接运行。

    6. A Demo Forum

    farum是我做的一个简单的forum demo. 使用了fastm, lightor, lightweb, 也尽量体现我前面提出的原则。

    https://farum.dev.java.net/files/documents/4372/25045/farum0.5a.zip

     

    我觉得,使用一门语言,应该尽量发挥它的特长,而不是针对它的短处,修修补补。

    Java作为静态类型编译语言的好处,就是编译期类型检查。那么如何发挥这个优势?前面说的Mapper源代码生成,就是一种尝试。

    另外,其它的类似的胶水粘合部分,比如,IoC, Validation等,都可以进行这方面的尝试。目前,farum就是采用这样的做法,自己写的Validator Source进行validation, value setting, service implementation injection等工作。

    farum没有使用Dynamic Proxy, CGLib等动态篡改用户代码的做法。

    尽量不使用Reflection,因为Reflection绕开了 Java 的类型检查机制。与其使用reflection,真不如使用动态脚本语言。

    当然,reflection是非常难以避免的。farum也少许使用了reflection

    Thread Local是一种隐式契约,相当于绕开了显式契约(方法签名method signature)。WebWork的一些用法,Spring FrameworkOpen Session In View,等都是采用了Thread Local

    farum没有采用Thread Local,而是采用了另一种方法实现了Open Session In view。而且如果缓存命中,甚至不需要从connection pool中获取Connection

    总结

    <<Web开发构想>>一文中,我提出了,理想中的Web开发架构是这样的:

    开发速度快,运行速度快,结构清晰优雅。

    具体到每一层。

    Web框架层主要追求 开发速度快。

    O/R层主要追求 运行速度快。

    页面资源层和页面模板层主要追求 结构清晰优雅。

     

    下面就是我对这些理想的初步实现。

    还远远达不到完美的程度,而只是朝这个方向努力。

     

    Template Layer

    fastm

    https://fastm.dev.java.net/files/documents/1911/25042/fastm1.0c.zip

     

    Web Layer

    lightweb

    https://lightweb.dev.java.net/files/documents/4371/25044/lightweb0.9b.zip

     

    ORM Layer

    lightor

    https://lightor.dev.java.net/files/documents/4370/25043/lightor0.5a.zip

     

    A forum demo using fastm + lightor + lightweb

    farum

    https://farum.dev.java.net/files/documents/4372/25045/farum0.5a.zip

     

    -------------------------------------


    补充说明。由于java.net可能还没有通过公布项目的申请。有些link可能由于权限问题,不能下载。
    我都在fastm的公开目录下,同样放了一份 所有上述项目。可以从此下载。

    https://fastm.dev.java.net/servlets/ProjectDocumentList?folderID=4520



    发表于 @ 2005年12月05日 09:07:00|评论(loading...)|编辑

    新一篇: Domain Pollution Resolution (English) | 旧一篇: Java Web开发构想(5) -- 7.O/R; 8.总结

    评论

    #Arcko 发表于2005-12-09 09:37:00  IP: 218.24.136.*
    1/3理想
    努力中
    #felix 发表于2005-12-14 10:03:00  IP: 61.149.240.*
    这是谁写的?可以称得上狗屁了。
    #rongsantang 发表于2005-12-15 14:23:00  IP: 222.66.41.*
    很佩服buaawhl做实事的精神,反观自己连仔细别人项目的毅力都没有,惭愧阿,有机会一定好好研究下。
    #buaawhl 发表于2005-12-15 14:42:00  IP: 222.76.201.*

    这个felix 的素质可真差。
    1. 口出秽语。
    2. 提不出任何证据,只会骂街。你至少要说出个一二三,给出些论据,证明写的是狗屁。
    3. 给不出论据,有几种原因。有可能因为无知,也有可能怕说出来的东西,暴露自己的无知。

    至于为什么,felix为什么情绪激动、口不择言的发出这句咒骂?
    这种心理状态也很常见。也许felix看懂了本文,也许没有看懂,以为自己看懂了某些片断,以为本文中的某些东西,和felix现有的思路相抵触,或者感觉层次太低,全是废话。
    于是,一时都激愤的不知道说什么。只好咒骂一句,发泄心中的感觉。

    以上,是从年少轻狂的心理角度,做出的比较合理的解释。
    还有可能干脆就是冒名顶替,损害某个felix达人的名声。
    不管出于何种可能。这个评论,都有保留价值。
    一是作为某少年英雄 的 亮点或者污点 的纪录。
    二是为了本帖的人气。据我所知,大家都有看热闹的爱好。如果某个帖子有人吵架,一定能吸引众多人气。
    三也是为了努力净化一点空气。这种年少轻狂、口不择言的网上咒骂,应该说相当普遍,背后的心里原因是什么?一定是有点能力,至少有些人吹捧的,而且感觉自己怀才不遇,压抑的,加上缺乏基本的素质教育,加上网上的无责任开骂求个爽的心理愉悦感,产生了这类现象。
    就让本评论成为这类案例之一吧。如果有幸能发展成经典案例。也算是本帖的荣幸了。

    各位希望留名的朋友,可以来本潜力贴留名。越早越能得到一个好座次。多谢。
    #buaawhl 发表于2005-12-15 14:49:00  IP: 222.76.201.*

    感谢一下 rongsantang 的关注。:-)
    发表评论  


    当前用户设置只有注册用户才能发表评论。如果你没有登录,请点击登录
    Csdn Blog version 3.1a
    Copyright © buaawhl