论坛首页 Java企业应用论坛

对于接口越来越迷茫

浏览 33417 次
精华帖 (0) :: 良好帖 (6) :: 新手帖 (4) :: 隐藏帖 (0)
作者 正文
   发表时间:2012-02-23  
george_space 写道
关于接口的时候,我一般是分为两层来对待:架构层 和 应用层。

架构层:
接口用得很广泛,理论上,一个成熟架构暴露给应用层使用的,都是接口,比如:2001年,你使用如下代码实现发送短信:
com.chinaunicom.sms.SmsSender sender = SenderFactory.getDefaultSender();
Result result = sender.send("13999999999","Just a test.");

上面代码中,com.chinaunicom.sms.SmsSender是一个接口,在2001年,它的实现类是:GeorgeSmsSenderImpl

到了2012年,com.chinaunicom.sms.SmsSender接口的实现类已经变了三次,现在的实现类是:
AndySmsSenderImpl,但是对于应用层的使用者而言,他们发送短信仍然使用:
com.chinaunicom.sms.SmsSender sender = SenderFactory.getDefaultSender();
Result result = sender.send("13999999999","Just a test.");

应用层使用者的代码完全不用变,这就是接口的好处。

所以,在价构成,要尽量使用接口,理论上,架构层暴露给应用层使用的,应该全是接口。

应用层:
在应用层,接口能不用就不用,代码越简单越好,像楼主举例说的Service、Dao,完全没有必要定义接口,除非你每个Service都有不同的实现类,如果一个Service就是完成一种特定的业务,在可预见的未来也不会有其他实现方式,那样的话,如果你非得给每个Service定义一个接口,只是在自找麻烦。

在我的系统中,每个Service只继承一个通用的基础父类,不用实现任何接口;
对于DAO,则使用如下方式使用DAO来完成数据库访问:
HelloWorld bean = dao.getOne(HelloWorld.class,SqlParam.add("id",100));

至于dao这个变量是怎么来的,应用层使用者完全不用关心,只管放心在Service类或者控制器中,甚至在jsp中使用这个变量即可,更不用费劲地去定义什么Dao接口,写什么Dao实现类。

所以,在应用层,使用者写得代码越少越好,代码越简单越好,接口能不用就不用。

1 请登录后投票
   发表时间:2012-02-23  
顶楼上的,某种程度来说,架构设计的一个成果物就是接口定义,从管理角度来说这也是一个规约。
业务层、服务层应该是接口最活跃的地方,这里可能的代码重构情况最多,需要重写或继承的情况最多。
楼主慢慢就明白了,都这么过来的,想当初对spring根本就不屑一顾啊,现在当宝。
0 请登录后投票
   发表时间:2012-02-23  
hamber 写道
有些事情就像看A,看的人很爽、做的人却未必。

有点道理
0 请登录后投票
   发表时间:2012-02-23  
普通功能类的接口应用对功能改变或扩展意义不大,但是在开发初期可以更清晰的表现出系统的整体结构和类功能,便于设计开发计划,功能模块的划分。多人合作开发时只要确定了功能接口,即可根据需要调用接口方法,无依赖的开发自己分管的模块。
对于一些特殊功能的类,接口就十分有意义了,比如连接数据库使用接口和实现类,你分管的模块需要连接数据库时只要调用连接数据库的接口即可,接口的实现可以是针对oracle或mysql,根据不同的需要分配给你不同的实现类。

之前也怀疑过中小项目中接口是否有必要,随着开发的程序多了,发现接口为项目开发带来了很多方便,虽然项目中增加了一些接口文件,但总的来言是利大于弊的。
0 请登录后投票
   发表时间:2012-02-23  
ShorenG 写道
新项目要采用S2SH,结合上次的经验,我感觉不出接口给我带来多大的好处

摘一段:

对于接口的作用,在一些小的项目上,很难看出其发挥的优势。这就使一些经常的做小项目的开发人员,做时间久了就感觉不到它有什么好的,有时候写起来还麻烦,干脆不用了。其实,在一些大项目上,接口的作用是发挥地相当的明显的。

比如:如果你开发业务逻辑代码,当你好不容易的实现了它全部的功能,突然用户需求要改,你在修改你代码的同时,调用你代码的其它人也会改,如果代码关联性强的话,会有很多人都要改动代码,这样一来二去,程序会变得相当的不稳定,而且可能还会出现更多的新Bug,所有人都可能会陷入混乱。
但如果使用接口的话,在你使用它之前,就要想好它要实现的全部功能(接口实际上就是将功能的封装)。确定下这个接口后,如果用户需求变了,你只要重新写它的实现类,而其它人只会调用你的接口,他不管你是怎么实现的,它只需要接口提供的功能。这样,很可能只需要把你的代码修改就可以了,其他人什么都不用做。
同时:这样做的话,使得开发人员能够分工明确,只要确定下来接口了,就可以同时进行开发,提高开发效率。
另外,使用接口还有使用方便,可读性强,结构清晰等优点。


要说项目小也不算小,除了最后的同时我真的没觉得有什么好处,有时候说需求改变只改实现就可以,但是如果没有接口也可以直接改里面的代码来实现,只要调用方法不变即可。

还请高人能用简易的例子说说实际中接口的好处
拜谢


标准接口,既然已经定义,为什么要改呢?要是需要改,那可就是架构问题了。你自己也说出了弊端:大家都得改。
你如果对接口有特殊需要,或者说变更,为什么不定义自己的接口,然后继承标准接口,重写你要的方法呢?
在引用处,将原接口强制转型成新的接口就可以了。谁都不会影响。

0 请登录后投票
   发表时间:2012-02-23  
说什么都不权威,推荐楼主看一下设计模式的入门书籍,比如 head first 设计模式

在设计模式中有一个 “开闭原则”-- 对修改关闭,对扩展开放。
面向接口编程十分重要的,所以才诞生了当初的EJB 和后来的Spring
0 请登录后投票
   发表时间:2012-02-23  
编码中遇到类似的迷惑,action层,service层,dao层,dao层写了泛型接口访问,如果想在ACTION层根据ID去加载某个实体类的时候,一般是在ACTION层获取request中的ID,然后调用service层的接口方法,getSortById(int id),而这个service层的接口实现,是调用泛型dao的findModelById(Class<T> entityClass, Serializable entityid)方法。感觉这个service层接口和实现方法都是多余的,思考再三,决定在ACTION层,直接获取泛型dao的bean,然后直接一句话去调用泛型方法findModelById(Class<T> entityClass, Serializable entityid)来加载实例,这样,省去了service层的两个方法
一些编程经验告诉我们要面向接口编程,但是在简单的业务下,不用接口,应该能省下点代码。 不知道这样合适不?欢迎讨论
0 请登录后投票
   发表时间:2012-02-23  
做了3年多的应用开发 就没见过接口发挥过用处 但是还是一味的在写
我现在觉得完全可以抛弃接口和DAO了 一个公共DAO完全够用
接口完全是增加工作量 虽然说法很偏激 但是开发时的确如此
0 请登录后投票
   发表时间:2012-02-23  
hamber 写道
有些事情就像看A,看的人很爽、做的人却未必。

有不有好的网站,推荐下,我们要做爽的人
0 请登录后投票
   发表时间:2012-02-23  
对接口和抽象类迷茫是我工作2年的时候的情况,第三年就开始不迷茫了,然后开始痴迷。如今快五年了。
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics