为什么 java 写 mvc 的时候,都要写个 Dao、Service 接口,然后再写个 DaoImpl、ServiceImpl? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
north521
V2EX    问与答

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

  •  
  •   north521 2015-07-23 14:34:21 +08:00 9360 次点击
    这是一个创建于 3735 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

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

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

    有些事,不是你自己写上百万行代码,删上几十万行代码,别人怎么说你都不会明白的
    FrankFang128
        17
    FrankFang128  
       2015-07-23 18:30:18 +08:00   1
    这是过早优化或者是恰当优化
    hitsmaxft
        18
    hitsmaxft  
       2015-07-23 18:53:06 +08:00 via iPhone
    是因为你没见过代码崩坏的项目
    happypy1
        19
    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
        20
    cloudhunter  
       2015-07-23 19:34:31 +08:00
    对于 spring mvc 来说,interface 规定了方法签名,框架才能放心大胆的把各种 IoC,class 增强的黑魔法玩出花样。
    yakczh
        21
    yakczh  
       2015-07-23 19:49:19 +08:00
    所以说php是最好的语言,就是这么来的
    yakczh
        22
    yakczh  
       2015-07-23 19:51:45 +08:00
    php一样写dao 一样写service,但不用写daoimpl serviceimpl 瞬间让很多java程序员失业了
    vietor
        23
    vietor  
       2015-07-23 20:53:22 +08:00 via Android
    是一种累赘,十几年前流行的方法论,现在不入流了。
    GeBron
        24
    GeBron  
       2015-07-23 22:40:49 +08:00
    用了 mybatis 之后就不用写 daoimpl 了……
    iyangyuan
        25
    iyangyuan  
       2015-07-24 08:38:01 +08:00 via iPhone
    都说dao层抽象之后可以无缝切换数据库,什么情况下才会换数据库呢?求教
    north521
        26
    north521  
    OP
       2015-07-24 09:10:02 +08:00
    总结了一下答案,90%的项目不需要写,真等到重构了,用ide工具分分钟抽取出来
    phx13ye
        27
    phx13ye  
       2015-07-24 09:32:37 +08:00
    Dependency Inversion principle: Depend upon abstractions. Do not depend upon concrete classes.
    donyee
        28
    donyee  
       2015-07-24 10:56:02 +08:00
    小项目都不需要这么写了吧,数据库一般也不会切换;
    FrankFang128
        29
    FrankFang128  
       2015-07-24 11:04:06 +08:00   1
    @iyangyuan 基本不会切数据库,就算切,工作量也不在这几个类那里 XD
    mouhong
        30
    mouhong  
       2015-07-24 11:35:39 +08:00
    @ieiayaobb 八股+1
    RagingSweet
        31
    RagingSweet  
       2015-07-24 14:35:22 +08:00
    楼上一群人不要误导人好伐,这样提炼接口是为了使用JDK的动态代理
    north521
        32
    north521  
    OP
       2015-07-24 18:56:59 +08:00
    @RagingSweet 比如?
    RagingSweet
        33
    RagingSweet  
       2015-07-27 14:35:17 +08:00
    @li24361 比如什么?JDK自带的动态代理必须要接口
    incompatible
        34
    incompatible  
       2015-07-28 02:35:49 +08:00 via iPhone
    @li24361 比如事务的实现啊
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     5541 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 34ms UTC 08:58 PVG 16:58 LAX 01:58 JFK 04:58
    Do have faith in what you're doing.
    ubao snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86