论坛首页 Java企业应用论坛

关于面向接口编程、DAO

浏览 19570 次
精华帖 (0) :: 良好帖 (3) :: 新手帖 (6) :: 隐藏帖 (4)
作者 正文
   发表时间:2009-07-28   最后修改:2009-07-28
今天稍微看了一个开源bbs:lforum的源代码。没有DAO,只有Service,所有的业务处理都是在service中用hql。而且Service也没有提供接口,@Service和@Transactional两个注解。
还是老问题:DAO真的有必要,面向接口编程真的有用吗,spring提供@Service后是不是接口就不在需要定义了。

DAO有必要吗,业务逻辑和实现逻辑的分离,但是这种分离有必要吗,如果说是hibernate还可以理解,hibernate提供一个baseDao,包括CRUD。所有的业务处理在Service中调用Dao来完成,但是这样子,效率会不会太低了,hibernate效率本身就不高,再这样分下,效率不是更低了吗?比如我使用ibatis,service层还有必要吗,所有的业务逻辑都是直接通过操作sql来实现,如果在使用service的话,ibatis实现CRUD,servie实现业务,那这效率不是比直接使用sql来实现业务低了很多吗。Service+Dao的分层真的有必要吗?

至于面向接口编程,我真的体会不到什么好处,先抛开aop,就说spring的接口用处,我敢说,绝大多数项目都是一个接口对应一个接口实现类(不包括ssh中的baseDao和baseService这两个通用的接口),那这接口还有什么用,只是增加了一个繁琐罢了。而且spring2.5中提供了@Service后,接口还有什么用。dao接口,很多人都说是为了方便跨数据库开发,可是真的有几个项目用到两个以上的数据库。即使有,我针对不同的数据库写不同的dao不就行了,不可能说一个CRUD同时操作两个数据库吧,那也太BT了吧。还有一个说法是说,面向接口编程能开发人员分工更清楚,怎么更清楚,我看不出来,难道只是因为dao代码少吗?那我把实现代码收缩起来看起来不也是一样的了吗。。

很多人说做大系统时,就能看出接口的好处了,可是我看不出来,请各位大牛指点下,大系统怎么个好处法,什么好处,不要老说大系统有好处有好处,说出号出来,最好能举例说明下,感激不尽!!!

补充一句:面向接口编程,调试真的很不方便。。
   发表时间:2009-07-29  
    我也只是个菜鸟,也还是个学生,在这我只是发表一点自己的理解,如果错误的请大家见谅及纠正,谢谢!
     楼主你说的,直接在service理调用sql就行了?那我要说的是,如果你的service在不同的业务中用到了相同的sql操作,那你是不是要复制黏贴了?而这样的代码复用是效率最差的吧,因为当你要修改的时候,你必须同时修改所有如此sql操作的地方,当然,楼主可以说,你可以压缩相同的sql操作到一个帮助方法中,但是这样的话,和创建1个专门的DAO不就没区别了么!
    其实看接口,我们可以看我们的电脑构造,因为我们的电脑也是面向接口的,这样才使我们能够更换使用不同的显卡,不同的内存等等,试想,如果你只面对威刚的内存条,当你觉得威刚内存条不好时怎么办?(只是打比方而已,不是说威刚内存条不好哦),现在你只用sql没问题,但是当客户需要别的数据库时呢?一个项目是有变化因素的,我们必须尽可能的考虑周全,当然这应该已经到了一个架构师的高度,我要说的是,用接口,还提高了一定的灵活性!
    小弟在这吹嘘了,忘高人还多多指出错误之处,不甚感激!
1 请登录后投票
   发表时间:2009-07-29  
建议LZ去看看设计模式
0 请登录后投票
   发表时间:2009-07-29  
楼主的疑问和我一样,我也超级怀疑,dao存在的必要性,在项目中试着将dao曾去掉,用一个泛型curd工具类,直接用servicesImp 操作session!!
0 请登录后投票
   发表时间:2009-07-29  
lijia871022 写道
    我也只是个菜鸟,也还是个学生,在这我只是发表一点自己的理解,如果错误的请大家见谅及纠正,谢谢!
     楼主你说的,直接在service理调用sql就行了?那我要说的是,如果你的service在不同的业务中用到了相同的sql操作,那你是不是要复制黏贴了?而这样的代码复用是效率最差的吧,因为当你要修改的时候,你必须同时修改所有如此sql操作的地方,当然,楼主可以说,你可以压缩相同的sql操作到一个帮助方法中,但是这样的话,和创建1个专门的DAO不就没区别了么!
    其实看接口,我们可以看我们的电脑构造,因为我们的电脑也是面向接口的,这样才使我们能够更换使用不同的显卡,不同的内存等等,试想,如果你只面对威刚的内存条,当你觉得威刚内存条不好时怎么办?(只是打比方而已,不是说威刚内存条不好哦),现在你只用sql没问题,但是当客户需要别的数据库时呢?一个项目是有变化因素的,我们必须尽可能的考虑周全,当然这应该已经到了一个架构师的高度,我要说的是,用接口,还提高了一定的灵活性!
    小弟在这吹嘘了,忘高人还多多指出错误之处,不甚感激!

实际中有多少项目到底是经常换数据库呢!!
0 请登录后投票
   发表时间:2009-07-29  
呃。接口至少有两个好处:
1、动态代理。没办法,只能用接口,没什么说的。
2、业务切分。呃,就是一个实现类里面有很多方法,但是给某个模块使用一部份。。。举个JDK的例子,LinkedList实现了好几个类,在不同的场合他可以作为不同的身份出现,我记得好像有List, Iterator, Queue, Collection,还有啥忘了。。

如果想了解接口的用途,最好看看JDK的结构。。。

框架里面一个接口对一个实现类,其实是第一个原因造成的,如果没有用到,可以不跟风~~
1 请登录后投票
   发表时间:2009-07-29  
我对接口不怀疑,只是一直质疑dao存在的必要性!!
0 请登录后投票
   发表时间:2009-07-29  
kjj 写道
我对接口不怀疑,只是一直质疑dao存在的必要性!!

呃~我回的是原帖。。。

DAO。。。有必要就要,没必要就不要好了。ROR不就基本上不用DAO吗?Active Record基本就等于封好的Domain Object + Dao。。。何必把分层的东西看得那么重?3层,4层,5层,6层的系统多得是,没有什么好规定的,Java社区太多这种无谓的辩论了。。。

要还是不要,没有谁能给出肯定得答案,谁都说服不了谁。。。

这种争论就算了吧,没个人心中都有答案。你的答案不就是不要么?不要,也可以做出好的系统的,不会造成瓶颈的。
0 请登录后投票
   发表时间:2009-07-29  
lijia871022 写道
    我也只是个菜鸟,也还是个学生,在这我只是发表一点自己的理解,如果错误的请大家见谅及纠正,谢谢!
     楼主你说的,直接在service理调用sql就行了?那我要说的是,如果你的service在不同的业务中用到了相同的sql操作,那你是不是要复制黏贴了?而这样的代码复用是效率最差的吧,因为当你要修改的时候,你必须同时修改所有如此sql操作的地方,当然,楼主可以说,你可以压缩相同的sql操作到一个帮助方法中,但是这样的话,和创建1个专门的DAO不就没区别了么!
    其实看接口,我们可以看我们的电脑构造,因为我们的电脑也是面向接口的,这样才使我们能够更换使用不同的显卡,不同的内存等等,试想,如果你只面对威刚的内存条,当你觉得威刚内存条不好时怎么办?(只是打比方而已,不是说威刚内存条不好哦),现在你只用sql没问题,但是当客户需要别的数据库时呢?一个项目是有变化因素的,我们必须尽可能的考虑周全,当然这应该已经到了一个架构师的高度,我要说的是,用接口,还提高了一定的灵活性!
    小弟在这吹嘘了,忘高人还多多指出错误之处,不甚感激!


我想说,大部份的过度设计就是从这种思想产生的。。。。

然后到处模式满天飞,这个架构那个架构。。。

切切实实把事情做好,少点点这些形而上学的讨论吧。
0 请登录后投票
   发表时间:2009-07-29  
不要为了接口而接口,同样不要为了DAO而DAO,带来方便的设计才是好设计,JAVA世界已经足够复杂了,简单就是美。
1 请登录后投票
论坛首页 Java企业应用版

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