siro-2155:基于接口编程VS基于实现编程
来源:百度文库 编辑:偶看新闻 时间:2024/05/05 16:11:13
fhjxp同学在看完我的Struts2.0+Spring+Hibernate的在线音乐系统的代码时:
fhjxp 写道
引用
看了一下源码,问一下,dao,service定义每个都定一个接口有什么用啊?有什么好处?
基于接口而不是类编程,这样Service层依赖于dao层的接口而不是实现,可以方便的替换dao的实现。基于接口 编程提供了可插拔的松耦合的编程方式。Spring倡导基于接口编程的方式,这是一种良好的编程习惯,在Spring中使 用接口是自然的,被鼓励的。
fhjxp 写道:
引用
你的回答里面我只看到一个理由:方便替换实现。为什么要松耦合、面向接口、好习惯还是为了这个。
真的方便了么?
1,首先说90%以上的项目,都不存在另外作多套Dao,Service需要进行切换,我接触过到的项目(开发时间近三年)都没有遇到过这个情况,偏偏每个项目都要搞了接口,不管开发还是维护都没有得到什么好处。
2,如果某个service方法要修改具体实现,不管有接口还是没有接口都需要同样的修改代码。如果还需要修改方法的名称或参数,同时还得修改接口类,得改两处,反而麻烦了。
1、我曾经参加过一个项目,原来使用Hibernate,从这个项目派生出一个项目要用JPA,有了DAO接口就可以方便替换了,否则,你在每个Service中找使用的HibernateDAO,然后改成现在的JPA实现的DAO,这是一个烦琐而易出错的事情,这就是依赖于具体实现的害处。
接口作为一种契约,其他使用你代码的人只需要知道你接口中提供的方法,就可以使用你的代码了,而接口通常是方法的最小子集(要暴露给用户使用的部分)。如果你只有实现类,往往会让使用你代码的人陷于细节,自己查找你到底暴露那些方法给我用。维护方面,如果你的实现需要很大改动的时候,有了接口别人在修改你代码的时候,就会知道我只要实现了你定义的接口的功能就ok了,其他的细节和我无关。
2、你所说的得改两处,是因为接口没有定义好,改动两处当然是不可避免的。如果你没有接口,别人要修改的话,他都不知道他的改动对其他部分的影响有多大,因为他很可能不知道,你要暴露什么,其他部分依赖于哪些方法。
3、基于实现类违反了面向对象的设计原则:OCP、LSP、DIP
在ThisWorld的帖子中:
ThisWorld写道:
引用就为了OO倡导的接口跟实现分离就用IoC?不稳定的接口怎么解决?为什么不等到重构的时候再用?
接口基本上应该是稳定的,当然随着对需求的进一步理解,可能开始抽象的不够,引起接口的变动。不过这种情况下,一般只是在接口中添加内容,对其他部分影响不大。如果是在需要合并接口或其他的方式引起的接口变动,这样可能影响的范围会很大,所以开始就应该仔细设计接口。
但如果不使用IoC,接口和实现分离也是应该倡导的一个好的编程方式,如果你开始所有的都是基于类编程的,等你对需求了解深入了,项目完成大半了,再试图重构出接口,困难会非常大(本来能重构的一个等级的,而这些方法的命名因为不一致而使重构变得困难甚至不可能),除非你在设计每个类的时候就考虑,将来要和某某类抽象出接口(如果你是遇到能抽象出接口的几个类就重构出接口,那么将和开始就使用接口类似,产生不稳定的接口,甚至更糟,你看的可能太局部了,而开始就仔细设计接口,许多时候会设计出高质量的接口)。
其实接口作为一种协议、规范,大家在写代码的时候就会遵循这个规范去写实现类,如果开始没有了这个规范,就会乱做一团。
所以我感觉关键是在开始就要仔细的设计接口。
fhjxp 写道
引用
看了一下源码,问一下,dao,service定义每个都定一个接口有什么用啊?有什么好处?
基于接口而不是类编程,这样Service层依赖于dao层的接口而不是实现,可以方便的替换dao的实现。基于接口 编程提供了可插拔的松耦合的编程方式。Spring倡导基于接口编程的方式,这是一种良好的编程习惯,在Spring中使 用接口是自然的,被鼓励的。
fhjxp 写道:
引用
你的回答里面我只看到一个理由:方便替换实现。为什么要松耦合、面向接口、好习惯还是为了这个。
真的方便了么?
1,首先说90%以上的项目,都不存在另外作多套Dao,Service需要进行切换,我接触过到的项目(开发时间近三年)都没有遇到过这个情况,偏偏每个项目都要搞了接口,不管开发还是维护都没有得到什么好处。
2,如果某个service方法要修改具体实现,不管有接口还是没有接口都需要同样的修改代码。如果还需要修改方法的名称或参数,同时还得修改接口类,得改两处,反而麻烦了。
1、我曾经参加过一个项目,原来使用Hibernate,从这个项目派生出一个项目要用JPA,有了DAO接口就可以方便替换了,否则,你在每个Service中找使用的HibernateDAO,然后改成现在的JPA实现的DAO,这是一个烦琐而易出错的事情,这就是依赖于具体实现的害处。
接口作为一种契约,其他使用你代码的人只需要知道你接口中提供的方法,就可以使用你的代码了,而接口通常是方法的最小子集(要暴露给用户使用的部分)。如果你只有实现类,往往会让使用你代码的人陷于细节,自己查找你到底暴露那些方法给我用。维护方面,如果你的实现需要很大改动的时候,有了接口别人在修改你代码的时候,就会知道我只要实现了你定义的接口的功能就ok了,其他的细节和我无关。
2、你所说的得改两处,是因为接口没有定义好,改动两处当然是不可避免的。如果你没有接口,别人要修改的话,他都不知道他的改动对其他部分的影响有多大,因为他很可能不知道,你要暴露什么,其他部分依赖于哪些方法。
3、基于实现类违反了面向对象的设计原则:OCP、LSP、DIP
在ThisWorld的帖子中:
ThisWorld写道:
引用就为了OO倡导的接口跟实现分离就用IoC?不稳定的接口怎么解决?为什么不等到重构的时候再用?
接口基本上应该是稳定的,当然随着对需求的进一步理解,可能开始抽象的不够,引起接口的变动。不过这种情况下,一般只是在接口中添加内容,对其他部分影响不大。如果是在需要合并接口或其他的方式引起的接口变动,这样可能影响的范围会很大,所以开始就应该仔细设计接口。
但如果不使用IoC,接口和实现分离也是应该倡导的一个好的编程方式,如果你开始所有的都是基于类编程的,等你对需求了解深入了,项目完成大半了,再试图重构出接口,困难会非常大(本来能重构的一个等级的,而这些方法的命名因为不一致而使重构变得困难甚至不可能),除非你在设计每个类的时候就考虑,将来要和某某类抽象出接口(如果你是遇到能抽象出接口的几个类就重构出接口,那么将和开始就使用接口类似,产生不稳定的接口,甚至更糟,你看的可能太局部了,而开始就仔细设计接口,许多时候会设计出高质量的接口)。
其实接口作为一种协议、规范,大家在写代码的时候就会遵循这个规范去写实现类,如果开始没有了这个规范,就会乱做一团。
所以我感觉关键是在开始就要仔细的设计接口。
怎么学好基于arm 嵌入式的编程
VC++中基于对话框的编程。
谁有基于com的matlab6.5与C++Builder6.0混合编程的实现书籍的下载
基于FPGA的多种形式分频的设计与实现 要过程调用的那种谁会编程
基于Windows的C编程是指什么意思?
VC中基于对话框的编程如何改变按钮显示?
VC中基于对话框的编程如何改变按钮显示?
VC中基于对话框的编程如何获得按钮标题?
VC中基于对话框的编程如何改变按钮位置?
基于S3C44BOX的闹铃系统该如何编程啊?
求C51编程:基于AN2131的USB开发板固件程序设计。
求教电路图和编程.基于AT89C2051的,其P3.0口输出每秒1个脉冲,用数电方法(74LSxx)实现60秒记数,定时并显示
基于XML技术实现留言板?
我想学习基于linux平台的软件编程,请介绍几本书给我!
谁做过"基于手机编程的电子像册"的开发?
VC中基于对话框的编程如何使按钮不可用?
WINDOWS是基于什么编程语言做出来的?C吗?
基于web的数据挖掘 如何实现?
EJB是基于哪些技术实现的?
基于浏览器的工程管理软件实现
基于verilog2.5分频的实现程序
使用Socket编程接口,实现FTP客户端软件
基于套接口(Socket)的聊天程序的设计,能够实现不同计算机的多用户之间的聊天。
java编程中,基于线程的多任务处理环境,执行特定任务的可执行代码的最小单位是