为什么 java 写 mvc 的时候,都要写个 Dao、Service 接口,然后再写个 DaoImpl、ServiceImpl?

2015-07-23 14:34:21 +08:00
 li24361

遇到公司,基本都这么写,我感觉dao这个接口没卵用啊,就是生命一个接口里面的方法,总不会说别人给你写个dao,然后你去实现方法吧

8842 次点击
所在节点    问与答
34 条回复
ieiayaobb
2015-07-23 14:52:00 +08:00
好听点就是分层解耦,层次清晰,利于重构。难听点就是java版本的八股
chocotan
2015-07-23 15:03:16 +08:00
因为你遇到的只有一个实现
li24361
2015-07-23 15:13:25 +08:00
@chocotan 求详解
incompatible
2015-07-23 15:14:27 +08:00
为Dao写接口的确是件然并卵且蛋疼的事情。

为Service写接口还是有必要的。
比如一个调用外部资源的服务,在开发和测试时可以使用MockImpl,在生产环境里可以用ProductionImpl。
再比如当项目规模变大、需要做服务化的时候,要实现RMI,就要有接口。
qiayue
2015-07-23 15:15:29 +08:00
比如数据库连接,可能有 MySQL 也可能有 Oracle 还可能是直接自己读写文本文件
每一种都是一种实现
kaedea
2015-07-23 15:20:44 +08:00
如果你只有一个实现方案的话,可以不用接口啊;
但是接口还有个功能就是方便后面的人理解业务。
ob
2015-07-23 15:21:20 +08:00
等你遇到需要多种实现的时候就知道用处了。
idamien
2015-07-23 15:51:52 +08:00
因为你接触的项目可能在起步阶段, 实现可以使用不同的数据库,另外接口可以方面以后做单元测试 mock.

另外一个比较严重的问题就是你说java mvc, DAO不属于mvc 你们有service 有 dao,所以架构上是mvc 3-tiers,不是单纯的mvc
qw7692336
2015-07-23 15:55:44 +08:00
我觉得有ORM框架的话,就没有必要DAO了。
至于service,其实很多人建议把service的业务逻辑写在domain model。
powerfj
2015-07-23 16:35:43 +08:00
瞬间创造了无数的工作..
thinkmore
2015-07-23 17:01:32 +08:00
这样才有工作量嘛。。。其实如果换了数据库实现就需要dao了,毕竟orm不能完全解决我们的问题,当然大部分时候都是可以的
sjtlqy
2015-07-23 17:14:12 +08:00
装逼用的,呵呵
sohoer
2015-07-23 17:26:40 +08:00
面向接口,主要也是为了方便以后扩展
mgcnrx11
2015-07-23 17:36:34 +08:00
有多少项目,会写着写着就换了一个数据库的呢?Dao还真必要性不大
EVA1992
2015-07-23 17:39:09 +08:00
八股文
otakustay
2015-07-23 18:21:05 +08:00
直到3年前我也以为是八股

有些事,不是你自己写上百万行代码,删上几十万行代码,别人怎么说你都不会明白的
FrankFang128
2015-07-23 18:30:18 +08:00
这是过早优化或者是恰当优化
hitsmaxft
2015-07-23 18:53:06 +08:00
是因为你没见过代码崩坏的项目
happypy1
2015-07-23 19:03:52 +08:00
刚在读effective java,正好讲到了interface与class,我就说说我的感受。

dao和service这些其实都是抽象你的逻辑层从而达到高内聚和低耦合的概念,便于日后的维护。举个生活中的例子,家用电源的三头插口,这是一个业界标准(接口),家电生产商不需要管这个三头插背后是怎么实现的,他们只需要知道,插上这个接口,他们的电器就会有220伏特的电能供应。Java里面的collection也是一个遵循这种设计的典范,List抽象了所有具体List(ArrayList, LinkedList)的接口,当你创建一个List的时候,根据你的需求(性能?容量?唯一性?)赋予它不同的实现,但是变量仍然是List这个类型,这样如果以后你要改动这个变量的实际类型,你就只需要改动赋值的那行,否则的话,你还要到处找到调用这个变量的地方进行修改。

说了这么多话,其实就是方便日后的维护和扩展。
cloudhunter
2015-07-23 19:34:31 +08:00
对于 spring mvc 来说,interface 规定了方法签名,框架才能放心大胆的把各种 IoC,class 增强的黑魔法玩出花样。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/207800

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX