V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
li24361
V2EX  ›  问与答

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

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

    遇到公司,基本都这么写,我感觉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
    因为你遇到的只有一个实现
    li24361
        3
    li24361  
    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  
       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层抽象之后可以无缝切换数据库,什么情况下才会换数据库呢?求教
    li24361
        26
    li24361  
    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的动态代理
    li24361
        32
    li24361  
    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   ·   我们的愿景   ·   实用小工具   ·   1748 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 27ms · UTC 16:41 · PVG 00:41 · LAX 09:41 · JFK 12:41
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.