north521
V2EX  ›  问与答

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

  •  
  •   north521 · Jul 23, 2015 · 10435 views
    This topic created in 4132 days ago, the information mentioned may be changed or developed.

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

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

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

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

    有些事,不是你自己写上百万行代码,删上几十万行代码,别人怎么说你都不会明白的
    FrankFang128
    FrankFang128
    Jul 23, 2015❤️1
    17
    这是过早优化或者是恰当优化
    hitsmaxft
    hitsmaxft
    Jul 23, 2015 via iPhone
    18
    是因为你没见过代码崩坏的项目
    happypy1
    happypy1
    Jul 23, 2015
    19
    刚在读effective java,正好讲到了interface与class,我就说说我的感受。

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

    说了这么多话,其实就是方便日后的维护和扩展。
    cloudhunter
    cloudhunter
    Jul 23, 2015
    20
    对于 spring mvc 来说,interface 规定了方法签名,框架才能放心大胆的把各种 IoC,class 增强的黑魔法玩出花样。
    yakczh
    yakczh
    Jul 23, 2015
    21
    所以说php是最好的语言,就是这么来的
    yakczh
    yakczh
    Jul 23, 2015
    22
    php一样写dao 一样写service,但不用写daoimpl serviceimpl 瞬间让很多java程序员失业了
    vietor
    vietor
    Jul 23, 2015 via Android
    23
    是一种累赘,十几年前流行的方法论,现在不入流了。
    GeBron
    GeBron
    Jul 23, 2015
    24
    用了 mybatis 之后就不用写 daoimpl 了……
    iyangyuan
    iyangyuan
    Jul 24, 2015 via iPhone
    25
    都说dao层抽象之后可以无缝切换数据库,什么情况下才会换数据库呢?求教
    north521
    north521
    OP
    Jul 24, 2015
    26
    总结了一下答案,90%的项目不需要写,真等到重构了,用ide工具分分钟抽取出来
    phx13ye
    phx13ye
    Jul 24, 2015
    27
    Dependency Inversion principle: Depend upon abstractions. Do not depend upon concrete classes.
    donyee
    donyee
    Jul 24, 2015
    28
    小项目都不需要这么写了吧,数据库一般也不会切换;
    FrankFang128
    FrankFang128
    Jul 24, 2015❤️1
    29
    @iyangyuan 基本不会切数据库,就算切,工作量也不在这几个类那里 XD
    mouhong
    mouhong
    Jul 24, 2015
    30
    @ieiayaobb 八股+1
    RagingSweet
    RagingSweet
    Jul 24, 2015
    31
    楼上一群人不要误导人好伐,这样提炼接口是为了使用JDK的动态代理
    north521
    north521
    OP
    Jul 24, 2015
    32
    @RagingSweet 比如?
    RagingSweet
    RagingSweet
    Jul 27, 2015
    33
    @li24361 比如什么?JDK自带的动态代理必须要接口
    incompatible
    incompatible
    Jul 28, 2015 via iPhone
    34
    @li24361 比如事务的实现啊
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Privacy   ·   Solana   ·   1958 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 69ms · UTC 02:53 · PVG 10:53 · LAX 18:53 · JFK 21:53
    ♥ Do have faith in what you're doing.