论坛首页 Java企业应用论坛

对于接口越来越迷茫

浏览 33578 次
精华帖 (0) :: 良好帖 (6) :: 新手帖 (4) :: 隐藏帖 (0)
作者 正文
   发表时间:2012-02-24  
业务越复杂,越应该用借口。
0 请登录后投票
   发表时间:2012-02-25  
youarestupid 写道
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实现类。

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


不错,我的观点跟你较接近。但有些差异,我说说我的看法,我认为对外开放的都应该要用到接口,因为变更接口的成本很高,所以要隔离定义与实现,对内用接口类就比较多余了,来来去去就是自己或团体成员在用,改来改去的,搞这么多接口类,又要在xml里定义,给重构带来很大的麻烦,维护时也麻烦,明明改一行就可以了,结果还要改其他几个地方,重复劳动,意义不大,所以对于经常改动的应用层,我非常同意尽量不用。我一直认为接口是提炼出来的而不是定义出来的,这是一个先后顺序问题。我不知道别人为什么这么喜欢用,反正我一般不用,但用起来很不一般。
另外,Spring所体现的也只是依赖倒置的原理,就是说上层模块不应该直接依赖底层模块,而是依赖抽象,这样的好处是更好的分离模块,互不干扰,所以只要明白原理就行了,不一定要用Spring写一堆的xml配置,把代码弄得支离破碎,反而不好维护和重构。
总结:接口不在多,而在精,就像Comparble,Iterator一样,把最核心的东西抽出来,做成接口。
0 请登录后投票
   发表时间:2012-02-25   最后修改:2012-02-25
hngmduyi 写道
编码中遇到类似的迷惑,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-25  
dongcb678 写道
做了3年多的应用开发 就没见过接口发挥过用处 但是还是一味的在写
我现在觉得完全可以抛弃接口和DAO了 一个公共DAO完全够用
接口完全是增加工作量 虽然说法很偏激 但是开发时的确如此

不偏激,事实就是如此,当年我不用SSH,所有的6个项目都成功上线了,而用SSH的另一个Team,只有一个项目成功上线,而且还严重超时,到后期维护都成问题,只有一个主程能维护,其他人都在帮他打杂。虽然不能与偏盖全,但是有一定的代表性。http://ffychina.iteye.com/blog/996144
0 请登录后投票
   发表时间:2012-02-25  
flashing 写道
老夫见这位小兄弟面目清奇,与我有缘,特给你指条明路~
待你看明白jdbc里面Connection-Statement-Result的关系以及如何加载的各种Driver,你就明白了什么时候真正该用接口了。

大多数小项目里面弄一堆dao和service接口,都是很2的行为,或者说在骗自己。。。

不解释,大家都懂的。
0 请登录后投票
   发表时间:2012-02-25  
tianzizhi 写道
一般有两种情况用抽象和接口
1 写给别人用的框架
2 写自己的业务,且业务较复杂且易变

其它情况可以不用

这位大侠看你霉精木瘦,气语不烦,果然是人才。
0 请登录后投票
   发表时间:2012-02-25  
lvjun106 写道
看到上面众多讨论项目角色任务的言论,我想提醒一下,
此贴是讨论什么时候用接口,接口的实际应用场景,而不是讨论该什么人用,什么人不该用。
-------------------
同意这些应用场景
1、通用DAO接口;
2、收发Email接口;
3、数据导入、导出接口;
4、Web Service交互封装接口;
5、动态表数据保存逻辑封装接口;
6、JMS封装接口;
7、服务器端推送封装接口;
。。。。。希望大家继续补充

考虑得很全面,学习了。
0 请登录后投票
   发表时间:2012-02-25  
blackstreet 写道
我认为,业务的烦杂,能过分层很难来解决,
如crud这种,我现在直接在action层搞定,复杂的业务,建个server类 的方法来解决

没必要action->IServer->serviceImpl->IDao->daoImple, 累不累呀,代码分开都不知道找哪个类

大家都是写代码赚几个钱的,不要为难自己为难别人,过度设计比没有设计更可怕。据我所知,有些有理想的程序员就是看不惯这种乱七八糟的接口类实在忍不下去了而提出辞呈,而设计这接口的所谓架构师还固执地认为幸好我定义了这些接口,否则人跑光了就更难维护了。
把复杂的,有共性的,可重用的,可代替的类抽象提炼出接口,才真正体现出也高级程序员与普通程序员的区别。
架构师,主要职责不是写接口的,把需求变成现实的过程,才是架构师要做的事。
0 请登录后投票
   发表时间:2012-02-25  
推荐看下《java与模式》---阎宏,感觉写的很不错。里面有专门讲接口的,在很多设计模式的例子中也可以看到接口的妙用。第五章专门对接口讲解了下。
0 请登录后投票
   发表时间:2012-02-25   最后修改:2012-02-25
relic6 写道
推荐看下《java与模式》---阎宏,感觉写的很不错。里面有专门讲接口的,在很多设计模式的例子中也可以看到接口的妙用。第五章专门对接口讲解了下。

这书都可以当枕头了,当年刚出来的时候这书被夸上天了,当时刚好有时间,我花了一个礼拜功夫看了一遍
感觉就是这人巨啰嗦,这不是在写技术书这是在写小说呢,改改都能发起点混月票去了。

最近几年我明白个道理,东方的xx博士,还不光是中国的,日本什么的也是,因为文化的关系,写东西喜欢讲的很复杂
做学问的都是以把最简单的东西写的云里雾里的你看不明白那叫牛
做应用的都是以把最复杂的东西几句话讲明白那叫牛

设计模式不在于讲解,在于思考,最简单的文字和代码说明一个模式足以,更多的是具体的案例尤其是jdk的source code对应的模式是最好的。学成也不在于背住几个案例,而是你能否真正理解why

当然在java里面你要想真正理解很多模式的why,还必须理解classloader,要是能理解bytecode就更好了
0 请登录后投票
论坛首页 Java企业应用版

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