`
october731
  • 浏览: 85810 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

接口存在的意义只在于接口依赖注入

 
阅读更多
关于接口存在的意义,之前有一篇帖子讨论过(http://www.iteye.com/post/957921?page=1),并且跟帖无数,我也看过,这里发表一点自己的看法。抛砖引玉。
我的立场是站在spring的依赖注入的角度上来思考这个问题的。个人认为,接口存在的意义只在于接口依赖注入的时候得到淋漓尽致的体现。至于其他时候,作用则并不是那么大了。其理由如下:
1. 在非接口注入的情况下,接口的定义,某种程度上可以理解为对类的一个总的设计,因为其方法并不需要实现,所以可以更多的去思考业务上的逻辑问题,一方面更多心思的去想如何把功能点设计的更加全面,另一方面当我们在实现这个接口的时候,就会受到这个接口的方法定义的约束,这个时候尽可能多的就是考虑如何实现具体的业务的问题,而不用去考虑业务的设计的是否周全的问题。
2. 我的第二点略带否定第一点的意味。如果说只是起一个总领的作用的话,相信当初在设计这个类的时候的UML图里面就已经写的很详细了。即使我不需要这一个接口,我根据我设计完备的UML图,我一样的可以在写类的方法的时候只关注我的类的方法的实现,而不用去考虑类的方法设计是否完备。
3. 在spring的接口注入的时候,这个时候方才体现了接口的优势。我们只调用接口,接口的具体实现可以有一个,也可以有N个,但是具体调用哪一个实现,我们可以动态的根据配置文件,在具体运行的时候再来决定。这就相当于用调用接口,把更多的灵活性留给了以后的开发和维护,以及功能模块的添加。
更多的暂时还没有去想,比较仓促就先写到这里。我先抛出观点。欢迎拍砖。
分享到:
评论
38 楼 kj2ff 2009-04-10  
楼主还没明白接口的意思所在,并不是只有java中有接口,而接口也并不是只为ssh中表现的那样,接口的威力只能在项目中的具体业务建模时候才能看得见,弄几个service调几个dao你就以为这是设计和接口的全部了?

设计模式的精髓是不要依赖具体实现而是依赖抽象,这里的依赖不是你所理解的spring DI。
37 楼 yongyuan.jiang 2009-04-10  
kaipingk 写道
有了万有引力定律,我们可以摘到苹果了, 某天楼主恍然发现原来万有引力存在的意义是摘苹果。。。。。


36 楼 agiha 2009-04-10  
看着项目中不同数据库的接口,我无语了。
现在这个项目中,同时用2个数据库,其中一个是ORACLE。
日本人没舍得让我们直接部署他们的那个用COBOL的妖怪数据库,就实现了ORACLE版模拟。
所以看起来我们用2种数据库在开发,实际后台只用了一种数据库。

请问,这个和注入有关系么?

楼主莫要混淆接口隐藏实现。
35 楼 phlsbg 2009-04-10  
反正我做架构的是后就是把DAO和servic和在一起的什么interface的都不要。
怎么省事怎么来。
整个项目用到interface很少,用到interface的原因是确实有多个实现。
34 楼 kaipingk 2009-04-10  
有了万有引力定律,我们可以摘到苹果了, 某天楼主恍然发现原来万有引力存在的意义是摘苹果。。。。。
33 楼 abiandbel 2009-04-10  
我现在很庆幸我放弃.NET,和语言无关,而是.NET圈子人的思想。

看见这个结论我真是吓一大跳,楼主把这个结论发到.NET社区,没准有人同意你的。

OMG.......
32 楼 guooscar 2009-04-10  
skydream 写道
偏门一点的心得,关于接口,最近用jmock,easemock用的多了,发现如果是interface的话mock的时候要方便的多。

=============扯远了=================

还是再重复一次,接口存在的意义真的和注入无关,远在依赖注入,spring流行前,接口就存在了。可以预见的是当di,spring不再流行时,接口依然会顽强生存。注入只是接口的一种使用方式而已,仅此而已。

就像家里的电线一样,他存在的意义是供电,这个是强大和泛化的功能,你不能因为你每天回到家里就是看看电视上上网就下结论说,电线的功能就是可以看电视开电脑而无视其他......

正解~~~~~
31 楼 DoubleEO 2009-04-10  
以前开发的时候,总是按规范来,一个接口对应一个或几个实现,后来写多了发现了,一个借口一般都只对着一个实现,好像90%是这样的,从此,我们就把接口干掉了,service层和DAO层只有实现
30 楼 zean 2009-04-10  
抛出异常的爱 写道
由于设计失败我看见过的N多项目dao是以页面逻辑分块开发的.....正常的DAO与页面逻辑关系非常的小.
我想说的只有这句话.

我很少定义dao,我只想说这句话.
29 楼 skydream 2009-04-10  
偏门一点的心得,关于接口,最近用jmock,easemock用的多了,发现如果是interface的话mock的时候要方便的多。

=============扯远了=================

还是再重复一次,接口存在的意义真的和注入无关,远在依赖注入,spring流行前,接口就存在了。可以预见的是当di,spring不再流行时,接口依然会顽强生存。注入只是接口的一种使用方式而已,仅此而已。

就像家里的电线一样,他存在的意义是供电,这个是强大和泛化的功能,你不能因为你每天回到家里就是看看电视上上网就下结论说,电线的功能就是可以看电视开电脑而无视其他......
28 楼 jansel 2009-04-10  
接口设计从有了依赖注入之后才变得容易,想想曾经也是class.forName这样去获取接口的某个具体实现。JDBC不也是这样吗?

自己做过的产品,如果这块设计了的话,那么就会提取接口,然后用class.forName的方式去构造。

但是随随便便的其他功能,很少有人这么定义接口了。因为在他们眼里,实现只会有一种,不会有两种。有什么变更,只需要在现有的上修改即可。

但是有了IOC之后,接口的设计就变得简单容易起来。
27 楼 云中苍月 2009-04-10  
按楼主的说法,没有或者不使用依赖注入就不需要接口了?
26 楼 LargeBean 2009-04-10  
jdbc,很好的接口。
25 楼 szgaea 2009-04-10  
看来楼主还没有真正理解接口的意义,只片面地看到ssh中接口的应用,相信在经过多个项目以后,会有更深的理解。
24 楼 香克斯 2009-04-10  
<div class="quote_title">akiraray 写道</div>
<div class="quote_div">
<div class="quote_title">october731 写道</div>
<div class="quote_div">
<div class="quote_title">akiraray 写道</div>
<div class="quote_div">
<div class="quote_title">october731 写道</div>
<div class="quote_div">
<div class="quote_title">guooscar 写道</div>
<div class="quote_div"><span style="color: #ff0000;">java的世界</span>其实很大的,并不是只有SSH.....</div>
<br />对&nbsp;&nbsp; 是很大的&nbsp; 但是我们<span style="color: red;">目前不是SSH</span>&nbsp; <span style="color: #ff0000;">中间</span>不是struts <span style="color: #ff0000;">整个</span>是<span style="color: #ff0000;">.NET</span>上的spring.net+NHibernate<br /></div>
<br />是我穿越了&hellip;&hellip;还是你穿越了&hellip;&hellip;</div>
<br />what does it mrean??</div>
<p>&nbsp;</p>
<p>我太笨&hellip;&hellip;完全没理解两位在讨论什么&hellip;&hellip;</p>
<p>一下子从java穿越到了.net的&hellip;&hellip;</p>
</div>
<p>&nbsp;</p>
<p>好好回去看看主题贴你就知道在讨论什么了。</p>
<p>spring和hibernate并不是java独有的,原理和使用都是基本一样的,所以没必要扣着java不放。</p>
<p>同意skydream的说法。</p>
<p>关于接口的作用,等你真正需要它的时候你就知道有什么用了,要不然别太早下结论。</p>
<p>虽然对于独立的小破系统来说是没什么太大用处,但是那只是你还没需要用到它。</p>
<p>&nbsp;</p>
23 楼 1314520ln 2009-04-10  
LZ,对接口的理解太局限了吧.
22 楼 kulinglei 2009-04-10  
抛出异常的爱 写道
由于设计失败我看见过的N多项目dao是以页面逻辑分块开发的.....正常的DAO与页面逻辑关系非常的小.
我想说的只有这句话.


dao是以页面逻辑分块开发的:貌似这样的原因是要表现数据,需求单一,我就要数据库的数据,不这样做怎样做额???
我们现在的项目就是把数据put到数据库,然后get出来表现到页面,我看dao是以页面逻辑分块很好
21 楼 fujohnwang 2009-04-10  
OMG

---
20 楼 kulinglei 2009-04-10  
有了接口,合作变得容易。接口的意义在哪???,感觉好多好多,自己现在能了有限,好像je中有人说要脱离接口,哎,自己学习去了
19 楼 sword.cai 2009-04-10  
虽然事实上,很多接口提取出来,可能与LZ说的情况类似,但,个人觉得接口的意义在功能的申明,感觉有点类似于通讯协议,就像我们购买U盘一样,我样只需要选择支持USB1.0|2.0,而不会去关注具体,

相关推荐

    一个轻量级的PHP依赖注入框架

    依赖注入(Dependency Injection,简称DI)是一种设计模式,它在软件工程中被广泛应用于解耦组件,提高代码的可测试性和可维护性。在PHP世界里,依赖注入框架可以帮助开发者更方便地管理类之间的依赖关系,减少硬...

    PHP依赖注入容器库

    4. **接口注入**:除了基于类的依赖注入,Auryn还支持基于接口的注入,这使得代码更加灵活,易于扩展。 5. **回调注入**:如果一个依赖需要通过特定的逻辑生成,你可以提供一个回调函数,Auryn会在需要时调用它来...

    Spring 核心机制(依赖注入)

    - **降低耦合度**:依赖注入允许组件之间通过接口进行通信,而不是直接引用具体的实现类,从而降低了组件之间的耦合度。 - **提高可测试性**:由于依赖可以通过注入的方式传递给组件,因此可以在测试时轻松替换依赖...

    Spring 学习笔记《依赖注入》源文件

    在Java开发领域,Spring框架是不可或缺的重要组成部分,它以其强大的依赖注入(Dependency Injection,简称DI)特性而闻名。依赖注入是面向对象设计的一种模式,它允许我们解耦组件之间的依赖关系,使代码更加灵活,...

    利用xml解析完成依赖注入 源码

    XML解析在依赖注入中的作用在于,它提供了声明依赖关系的结构化方式。在XML配置文件中,我们可以定义bean及其依赖,Spring框架会读取这些配置并根据指示创建bean实例,建立它们之间的依赖关系。以下是一个简单的XML...

    arcgis server flex 中的依赖注入

    依赖注入的核心在于利用接口的多态性,使类之间可以通过接口来进行交互,而无需知道具体的实现细节。例如,在上述部分内容中提到了一个`Controller`接口: ```as package com.example { public interface ...

    InterfaceInjector接口注入模拟(源码下载)

    接口注入的核心在于接口,它定义了依赖对象的行为。通过定义接口,我们可以确保各个组件之间只依赖于接口,而不是具体的实现。这使得更换或升级组件变得更加简单,只需要改变接口的实现即可,无需修改依赖它的其他...

    控制反转-依赖注入详解

    控制反转(IoC)和依赖注入(DI)是软件设计模式中的重要概念,主要用于降低组件间的耦合度,提高代码的可维护性和可扩展性。IoC的核心思想是将对象的创建和管理交给一个外部容器,而不是由对象自身负责,从而实现...

    Martin Fowler 控制反转与依赖注入

    除了构造函数注入和设值方法注入之外,还有一种不太常见的依赖注入方式称为接口注入。在这种模式下,依赖项通过接口传递,而不是通过构造函数或setter方法。这种方法的优势在于它可以更灵活地处理依赖关系的变化,但...

    深入刨分依赖注入

    依赖注入(Dependency Injection,简称DI)是软件设计模式中的一种,它主要解决的是对象之间的依赖关系,使得代码更易于测试和维护。在这个主题下,我们将深入探讨依赖注入的核心概念、实现方式以及它在实际开发中的...

    模拟Spring的依赖注入

    在Java开发中,Spring框架是应用最广泛的IoC(Inversion of Control,控制反转)和DI(Dependency Injection,依赖注入)容器。它极大地简化了组件之间的依赖管理,提高了代码的可测试性和可维护性。本篇文章将深入...

    Spring依赖注入使用setter设注入demo

    在Java世界中,Spring框架是应用最广泛的轻量级框架之一,它以其强大的依赖注入(Dependency Injection,简称DI)特性而闻名。依赖注入是面向切面编程(AOP)的一个重要概念,它允许我们解耦组件,使得代码更加灵活...

    依赖注入:Dependency injection-英文书签文字版

    在Spring中,依赖注入主要通过构造器注入、setter方法注入和接口注入三种方式实现。 1. 构造器注入:通过在类的构造函数中传递依赖对象的实例,Spring会根据配置在XML或注解中的信息创建依赖对象并注入到目标类中。...

    mvc4 ioc 依赖注入简单示例实现

    2. **定义接口与实现**:为了演示依赖注入,我们先定义一个简单的服务接口`IService`,以及它的实现类`Service`。例如: ```csharp public interface IService { void DoSomething(); } public class ...

    struts hibernate spring 集成时使用依赖注入的方式的秘籍

    Struts、Hibernate和Spring是Java开发中非常流行的三大框架,它们各自在Web应用程序的不同层面上发挥作用:Struts处理MVC模式中的Controller部分,Hibernate负责数据持久化,而Spring则提供了全面的依赖注入...

    用Roboguice实现依赖注入-.rar

    依赖注入有三种主要方式:构造器注入、setter注入和接口注入。 **Roboguice的工作原理** Roboguice通过扫描应用的注解(Annotations)来识别对象的依赖关系。它在应用程序启动时,会自动注入所有需要的依赖。开发者...

    NetCoreDemo(依赖注入).zip

    在.NET Core中,依赖注入(Dependency Injection,简称DI)是一种重要的设计模式,它允许开发者将对象的创建和管理从实际的业务逻辑中分离出来,提高了代码的可测试性、可维护性和灵活性。本示例"NetCoreDemo(依赖...

    轻量级 Swift 依赖注入框架.zip

    5. **代码解耦**:通过依赖注入,组件之间的耦合度降低,每个组件只需要知道它依赖的接口,而不关心具体的实现。 6. **测试友好**:在单元测试中,可以轻松替换具体依赖,使用模拟(Mocks)或存根(Stubs)来隔离...

    PHP依赖注入容器库.zip

    依赖注入是一种设计模式,它允许我们解耦代码,通过外部组件将依赖关系传递给一个对象,而不是由该对象自己创建或查找依赖。这样做的好处在于,对象不再直接与特定的实现绑定,而是可以通过配置来改变其依赖关系,...

Global site tag (gtag.js) - Google Analytics