`
riss
  • 浏览: 14922 次
  • 性别: Icon_minigender_1
社区版块
存档分类
最新评论

我认为......

    博客分类:
  • web
阅读更多

我认为在使用Java开发Web项目时:
DAO与Action之间应该有一些个Service.
   有人喜欢把业务逻辑写于DAO中,也有人喜欢将业务逻辑写于Action中。 写于DAO中原因,我想这些人是觉得在DAO中实现方便, 而写在Action中,是那些人觉得控制事务比较合理(执行一次Action,操作完全成功,提交,要不回滚!)
   我个人觉得,无论将业务逻辑放于DAO中,还是Action中都会造成它们“肥大”而难于控制。
   放于DAO中,业务逻辑与真正的访问数据发生混淆,如果业务逻辑不复杂,将代码整理清晰还行,但我总觉得不够自然,分开可以认人直观的认识到那些是真正的与数据库打交道,那些是业务逻辑。所以我认为应该有必要增加一个业务逻辑层,利用现的DAO接口为Action服务.将业务逻辑轻松从DAO中的提取并描述出来。  
   放于Action中,也许常常由于为了某个功能实现上的方便,想当然的增加一个数据访问接口。 其实,我在做练习(或项目)也通常会这样,不过我认为这是个不好的习惯
   首先,一个清晰的架构应该在事先将接口都已定义好了,除非功能上发生了扩展或其他变化,在先前定义的接口不能满足的情况下才应该扩展底层接口。如果定义接口的人认为在不扩展的情况下仍可以利用现有的接口完成,就不应该扩展。比如,查询数据库中是否存在一个为相应名称的用户, 如果一开始就定义了获得所有用户的接口,而在实现时你更喜欢写一个SQL去查询判断结果的记录数,就想当然的增加一个判断用户姓名是否唯一的接口。

   试想,如果现在几个人协作开发,一个人架构,其他各层由专门的人负责写,也就是说写Action的人不必关心写DAO的人如何实现,他只能使用设计时底层所定义的接口来完成目前所有工作,在这种情况下,写Action人是不是该告诉写DAO的:“我觉得你应该提供给我 一个接口,这个接口的功能就是根据用户名称判断是否已经存在”,而写DAO的却说:”我已经提供给你了所有用户,你还没法判断吗?“,写Action认变写DAO的实现方便,而写DAO的却说定义的接口已经有能力完成你所要功能
   (你该获取所用户后,再进行比对),如果是你,你认为谁有理呢?(都有理,架构师的错!他干吗不事先写考虑到呢)
   如果我是写Action的,我会给架构师一个请示,如果不答应我就只能利用现有的接口去实现这个功能.因为写各层的人通常不会有大局观,不会关心修改接口的定义是否对其他人造成什么影响。对于软件更改接口不是件太难的事,如果是硬件呢,我想你不会“想当然”了吧,说在插糟那个地方打个“洞”就打个”洞“,本来有个三项插孔,并且这个三项插孔也完全可以插两个的插头,干吗还要再添加一个具有两个孔的呢,那时你还得考虑整体的美观等等的因素,做软件的“看”不到什么美不美,除了字母就是字母,看得到的就是代码是否漂亮,再就是架构是所产生的图是否清晰、优雅,没有硬件那么直观。
   其实不管是做软件还是做硬件的,道理是差不多的。总之,做事情要慎重。三思而后行!(我小提大作了!)
   所以我还是主张有个Service,将业务逻辑放在里头,即方便写测试,也将层次划分的更清晰。Action中应该是只存在控制逻辑,如果业务逻辑与控制逻辑写在一起,日子久了就难以控制了(我觉得这样做比写在DAO中更糟糕)。
   另外,说到事务处理,我个人认为放在Service更为合理,如果控制表现于DAO层那么只能对单一具体访问数据库的操作进行控制--请注意是对单一访问数据库的操作(大多时候一个Action也就对应着一个DAO操作),连续操作的控制就没招了。 如果控制表现于控制逻辑层,就只能对一次界面操作进行控制,如果一次界面操作中一个数据访问操作失败,就都失败了。控制于业务逻辑层,当然是最理想的了,因为业务逻辑才是真正程序功能的核心,是最为关键的一部分。一次界面操作或许包含多个业务操作(像工作流),而每个业务操作又或许包多个数据访问操作.控制于业务逻辑层就表现于。如果一次界面操作中一部分业务操作成功而另一部分操作失败,不会完全回滚。幸而通知用户那些操作已经进行了,那些失败及其原因。用户可以从失败的操作处进行究正,而不是从头来过,一般情况下这种情况很少,至少我像是没有遇到过.
  
 与Java相比,ROR中,有人推荐将业务逻辑写于model中,我对RoR没什么实践经验暂不发表个人观点,但从ROR测试的分类来看Java,Java的DAO测试应该是Unit Test,业务逻辑测试应该是Function Test,而控制逻辑测试应该是Integration Test,你说呢?(也是我比较欣赏ROR的一个理由吧!)

这次先说到这里,首先声明我对Java的学习与实践不多也不长,其次,我也只不过做过一个实际的Web项目,没什么经验!如果误导了你,我只能表示抱歉,可没有经济赔偿啊!如有不同意见或我有说错的、说的不好的地方请留言,我会认真改过,与那些经验老到的不能相提并论,只地发表些个人的想法,也是希望集大家的力量帮助你,我,他一起成长!

下面我会上传一个压缩文件,其中有Webwrok,Struts2和ROR的练习,还请多多指点,其中对Webwork,与Struts2练习中的服务层写的不满意,如果你有更好的见议,请与我分享,在此表示感谢!我之所以没有提供struts1的练习,是因为现在也许没多少人在去学习它,我做的第一个Web项目就是用它作的.
 如果你是真正的新手,相信会对你有所帮助,其中在看源代码时请留意Webwork或struts2中配置文件的组织,虽然还不尽理想,但我认为对你会有所启发.

分享到:
评论
4 楼 riss 2007-07-12  
oh.sorry!I hasn't msn.
3 楼 mario 2007-06-18  
to_riss:
  不好意思,现在才看到你的回复。对于设计上和开发上取舍,是个度的问题。是需要具体情况具体分析的,这是个典型的废话。设计变化的可能性取决于对业务理解和认识程度。也是唯一能通过主观能控制的变化。有机会多沟通吧,我的msn: yuyang at meritit.com
2 楼 riss 2007-06-09  
mario:
说得有道理!
与平常人们怎样理解什么情况下是过度设计,有关系。
因为常常中做项目时,由于各种原因,也许不可能考虑得面面俱到;也或许,在项目完成后,需要进行长期的维护并且带有扩展(版本升级);这就取决于一开始的设计是否更有得于扩展,重构.要求设计人员考虑问题慎重,既要考虑到现有的各种情形,还要考虑到未来可预见的情形。这样对将来的维护和升级更有利。
1 楼 mario 2007-05-30  
我觉得问题核心是在service和dao的保留上。
service的接口面向Action,是事务性质的,或者业务性的。
dao的接口面向service,是原子性的,比如add,delete,query。一个service接口有很多dao接口组成。
当业务简单的情况下,每个service和dao一一对应。似乎dao就多余了。
当业务复杂的情况下,每个service和dao一对多,似乎dao就不多余了。
尤其是spring的HibernateTemple成了通用版的dao或者别的基于泛型的dao,dao似乎变成了鸡肋。
必须有的所以我认为在service情况下,dao是可选的。 是需要根据实际情况演化出来的。

相关推荐

    大学英语作文模板.doc

    变得越来越...",然后引入不同的看法:"一些人认为...,另一些人则认为...". 接着,明确提出自己的观点,比如:"在我看来,我支持第二种观点",并预告下文将列出原因。第二段列举论据,通常分为两到三个点,可以使用...

    BSL_v8.0.01_RTX.zip

    90FPS通常被认为是流畅游戏的一个基准,能提供非常顺滑的游戏感受。此外,“画面真实,调色舒服”表明光影包的设计注重色彩的平衡与和谐,既增强了游戏的现实感,又避免了过于刺眼或不自然的效果,对玩家的眼睛更为...

    UnSHc, UnSHc如何解密 SHc *.sh.x 加密文件?.zip

    UnSHc, UnSHc如何解密 SHc *.sh.x 加密文件? UnSHcUnSHc - 如何解密 SHc *.sh.x 加密文件?请注意我不会给任何人解密任何文件。 GitHub上的问题只是讨论 Bug 和/...如果你认为你找到了一个 Bug,请给我加密的文件 和未

    daemon.rar daemon.rar

    它的工作原理是通过模拟CD/DVD驱动器硬件接口,使得操作系统误认为有一个真实的光驱在运行。 使用Daemon Tools的好处包括: 1. **速度**:由于无需物理读取光盘,虚拟光驱的访问速度远超实体光驱,尤其是在多次读取...

    stable-diffusion-webui codeformer.pth

    我认为这与损坏的安装有关。就我而言,我在“\models\Codeformer”上的 Codeformer.pth 已损坏。替换为手动安装的https://github.com/sczhou/CodeFormer/releases/download/v0.1.0/codeformer.pth。 解决了这个问题...

    高考英语作文高分句型.doc

    3. 我认为这个论点是正确的,因为...I believe the title statement is valid because…. 4. 我无法完全同意...的观点,I cannot entirely agree with the idea that ..., I believe.... 5. 对于...,我的立场是......

    我认为的史学方法论.docx

    我认为的史学方法论.docx

    802.11无线网络权威指南+第二版(中文版).pdf

    因此,我将基于【标题】“802.11无线网络权威指南+第二版(中文版).pdf”来展开知识点的说明。 802.11是IEEE(电气和电子工程师协会)制定的一系列无线局域网通信标准。该标准详细规定了无线局域网在2.4GHz波段...

    面试答题过渡句合集.zip

    - "首先,我认为..." - "就这个问题,我想从...的角度谈谈..." - "在我看来,一个关键的考虑因素是..." 2. 转折思路: - "然而,另一方面..." - "尽管如此,我们也需要考虑到..." - "不过,如果从另一个角度...

    JScript语言参考.chm

    JSCRIPT是微软的产品,而JAVASCRIPT则是另一空公司的产品(叫什么我忘了). JAVASCRIPT刚出来时还没有JSCRIPT,当时JAVASCRIPT很火.微软很看不过眼.所以就出了一个自已的脚本语言,命名为JSCRIPT.在当时的这二种脚本语言...

    同等学力研究生英语考试短文写作技PPT课件.pptx

    3. 引用他人观点的句型:“有人认为...,然而我认为...”、“正如...所说...”。 4. 表达个人观点的句型:“我个人认为...”、“在我看来...”。 5. 引入例证的句型:“以...为例...”、“比如...”。 掌握这些技巧...

    用lcx.exe做内网端口映射

    这时候就要用到端口映射了,这方面的工具很多,个人认为还是lcx.exe比较好用一点...下面就给大家演示如何把内网肉鸡映射出来,让我们可以连接. 这里我已经有一个shell了,至于得到shell的过程就不说了,大家自己发挥....

    6502编程大奥秘.chm

    我又不禁想起当年那场轰轰烈烈"革命","昔日杨柳,今日残枝",此情此景,如何叫人不感慨万端. 诚然,汇编高手不少,例如SUN,LEE等,但这些年来,没有任何高手编写过一本关于汇编的书,我自认为自己没有资格做这件事,但是我...

    中国电信市场分析......

    - **我的e家**:面向家庭用户,旨在打造便捷的家庭网络生活体验。 - **天翼**:移动业务品牌,满足客户的移动通信需求。 - **号码百事通**:基于114台的增值业务,提供多种信息服务。 - **中国宽带互联网(CHINANET...

    考研英语书信的万能模板精选.doc

    - "听说您在寻求建议,我认为...。一方面,您可以考虑不必过于关注...。此外,我强烈推荐您尝试...。另一方面,...。因此,我相信...。希望我的观点对您有所帮助,如有疑问,请随时与我联系。" 4. **求职信** - ...

    英文商业书信用语概述页.pdf

    9. "I should esteem it a favour if you would inform me that (of)...":如果您能告知我,那将是我莫大的荣幸... 10. "I will thank you to inform me that (of)...":如果您能告知我,我将表示感谢... 11. "You ...

    OG题目托福口语讲义(教师版).pdf

    2. 我认为... 3. 我记得... 4. 这是因为... 5. 由于... 6. 原因是... 7. 例如... 8. 就像... 9. 我的意思是... 10. 换句话说... 11. 我记得... 12. 第二个原因是... 13. 另一个理由是... 在面对托福口语Task 1的...

    四六级作文模板大全.doc

    如“有的人认为...,另一些人则认为...”,然后引入自己的观点,如“至于我本人而言,我同意...”。接着用“一方面,我坚信...”、“另一方面,...”来论述理由,并举例佐证。最后,通过“考虑到所有这些因素,我们...

    英语作文模板整理.doc

    我认为...可以改进,例如...。我相信这将有助于...。期待你的反馈,感谢你的关注。 ``` **句子模板** 在文章开头、引出不同观点、得出结论、提出建议、预示后果和结尾部分,都有相应的万能句子模板,可以帮助我们...

Global site tag (gtag.js) - Google Analytics