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

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

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

我的立场是站在spring的依赖注入的角度上来思考这个问题的。个人认为,接口存在的意义只在于接口依赖注入的时候得到淋漓尽致的体现。至于其他时候,作用则并不是那么大了。

请楼主注意,接口的出现要比spring的出现早很多,因此从逻辑上来说,接口肯定不是为了spring(同样也不是依赖注入)才出现的高级语言程序特性。
但是不可否认的是,spring的配置简化了接口的使用。
57 楼 neora 2009-04-12  
october731 写道
neora 写道
标题本身就是个错误的结论

愿闻其详


从基础重新学起,再去看看OO编程的基本思想。


Interface Sharp {
    public void draw();
}

class Rectangle implements Sharp {
    public void draw() {
        .......
    }
}


class Triangle implements Sharp {
    public void draw() {
        .......
    }
}



不要认为我在愚弄你,这就是接口的意义。
56 楼 阳光晒晒 2009-04-12  
sgysgy 写道
kulinglei 写道
抛出异常的爱 写道
由于设计失败我看见过的N多项目dao是以页面逻辑分块开发的.....正常的DAO与页面逻辑关系非常的小.
我想说的只有这句话.


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

做了几个项目后有个小感觉,打个比方,页面要一碗牛肉面,dao最好不要直接返回牛肉面,dao两个,a返回牛肉,b返回面,
综合成牛肉面应该放在逻辑层,下次需要牛肉粉的时候,逻辑层取牛肉+粉,dao只做单一的无逻辑的事,比较整洁,方便维护

可能会变更的东西。。。。
页面可能会叫牛肉面。拉面。泡面,刀削面
但需求说明里只写了一种

你作了手擀面

客户说我不要手擀面。。。我要方便面

你从新实现了方便面。

客户又说我要手擀面的卤。方便面的面条。。。。。光要方便面的话我去买方便面不就行了?

这就是对需求变更的一种防御方案

我作面的。作卤的,烧面的分开了
以后如果有变更,
不用去所有的代码中去改来改去了
至少看代码的时间会少很多
作面过程大体相拟
就跟对大厨说面不用擀了,
去买点方便面的面饼来


如果过程变化了比如要用面条卤作盖饭
还是要重定义这个过程(重定义接口)
不叫面馆了,
改四川小吃了。



前面有人说不要接口。
想要问一句。。。
没有接口是不是也不要注释呢?
那么几百行里面去找你需要注释
也是很浪费眼力的活吧
55 楼 sgysgy 2009-04-12  
kulinglei 写道
抛出异常的爱 写道
由于设计失败我看见过的N多项目dao是以页面逻辑分块开发的.....正常的DAO与页面逻辑关系非常的小.
我想说的只有这句话.


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

做了几个项目后有个小感觉,打个比方,页面要一碗牛肉面,dao最好不要直接返回牛肉面,dao两个,a返回牛肉,b返回面,
综合成牛肉面应该放在逻辑层,下次需要牛肉粉的时候,逻辑层取牛肉+粉,dao只做单一的无逻辑的事,比较整洁,方便维护
54 楼 lkjust08 2009-04-12  
guooscar 写道
java的世界其实很大的,并不是只有SSH.....


同意,ssh只不过是为新手提高开发效率的。
53 楼 october731 2009-04-11  
neora 写道
标题本身就是个错误的结论

愿闻其详
52 楼 flyfan 2009-04-11  
我目前也对接口也存在疑问,可能因为自己的知识太狭窄了,多希望有高手把接口的意义用例子表现在出来,让我们这些小菜学习一下
51 楼 neora 2009-04-11  
标题本身就是个错误的结论
50 楼 yinjihao 2009-04-11  



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

49 楼 icantforget 2009-04-11  
个人认为  接口最大的优点  也是存在必要性的优点是 多态!!!  接口注入  其实也是多态的一种表现  如果没有多态   那就没有注入的必要了 
48 楼 hsbljyy 2009-04-11  
LZ可能跟我一样也没经历过很多的项目,或者都是中小型的项目吧。

你不要用什么框架或者语言去看待接口,其实你可以将接口理解为标准。如同LS说的JDBC,其实JDBC只能算是JAVA接口的一种应用,你有兴趣的话,可以去了解一下什么是JAVA EE,那时候你会惊讶地发现,JAVA EE几乎就是一堆接口!

当然,我想这些你应该都明白,可能你只是认为,如果项目不大就没必要用这些接口。这么说吧,我觉得现在使用接口的人大部分都跟你一样吧,可能就是为了spring的DI而使用接口,或者说白了,就是为了接口而接口,很少人会站在设计的角度去看待这些问题,于是引发了很多一个借口就只有一种现实,可能这也是你困扰的根源吧。

请原谅我的揣测,也许LZ的想法跟我想象中的不一样。我只是说明我的观点。
47 楼 mr_ginger 2009-04-11  
被框架框住  就麻烦了 接口还是很好的设计 可以让你站在未来思考
46 楼 kongkongkong 2009-04-10  
在OO里,接口最重要的一个作用应该就是多态了。看看各种设计模式,许多都是基于接口与多态的。
45 楼 october731 2009-04-10  
1314520ln 写道
LZ,对接口的理解太局限了吧.

师兄 能指点一二吗
44 楼 october731 2009-04-10  
kulinglei 写道
有了接口,合作变得容易。接口的意义在哪???,感觉好多好多,自己现在能了有限,好像je中有人说要脱离接口,哎,自己学习去了

我没有说要脱离接口。。。
43 楼 october731 2009-04-10  
ramus 写道
skydream 写道
这个结论下的有点过了。

接口存在的意义和注入没有直接关系的,注入只是一种手段,远不是目的。


这一点,我非常同意。。楼主有点的结论有点过。。而且我敢打赌,楼主是看过那篇文章后,并切加上实际工作的经验,突然感觉就是这么回事,所以就把这个结论下了。。。


不知楼主是不是我这样想的`


http://www.iteye.com/post/958826

最近是在做一个spring的接口注入的项目,想了很多,看了那片文章之后觉得更多的疑虑和观点就发表了这个帖子  
接口的出现确实早于接口注入  并且要早很多      我没有否定接口在设计建模等时候所体现出来的作用   我是说接口在接口注入的时候  其意义得到了最大的体现
这个师兄也可以去做一些社会工程领域的东东 
42 楼 october731 2009-04-10  
sword.cai 写道
虽然事实上,很多接口提取出来,可能与LZ说的情况类似,但,个人觉得接口的意义在功能的申明,感觉有点类似于通讯协议,就像我们购买U盘一样,我样只需要选择支持USB1.0|2.0,而不会去关注具体,

个人的感觉是   如果一个接口就只有一个实现的话(实际上从大家的回帖看来,多数都不会有几个实现了)    代码中的接口真的没有必要
41 楼 october731 2009-04-10  
skydream 写道
这个结论下的有点过了。

接口存在的意义和注入没有直接关系的,注入只是一种手段,远不是目的。

看到这么多的回帖  心中大致也知道自己当初考虑的不周全
我能想到的就是设计模式中用到的建模抽象用到的接口的作用  不知道接口除此之外还有什么地方的用途?
40 楼 october731 2009-04-10  
kj2ff 写道
楼主还没明白接口的意思所在,并不是只有java中有接口,而接口也并不是只为ssh中表现的那样,接口的威力只能在项目中的具体业务建模时候才能看得见,弄几个service调几个dao你就以为这是设计和接口的全部了?

设计模式的精髓是不要依赖具体实现而是依赖抽象,这里的依赖不是你所理解的spring DI。

首先 承认自己经历的项目很有限   发表的观点可能考虑的并不全面 
我们在用到spring的di的时候 确实很倚重interface  你说的是在建模的时候体现  我承认 但是不用到接口注入的话  建模的时候实现接口  能否把接口实现在UML中 而不要实现在项目中来?我们除了要去管理一大堆实现类之外, 还要来管理同样多的interface的包
设计模式的精髓是不要依赖具体实现而是依赖抽象,这里的依赖不是你所理解的spring DI. 这句话赞同
39 楼 october731 2009-04-10  
dada 写道
和spring有啥关系,随便举个例子,你所在的系统是一个总公司集中项目,某个功能中你将要面对分公司以及不同业务线两个纬度叠加造成的业务差异,UML中定义的东西不是接口的话你咋玩?

我的观点当中的意义就已经说了这一层了   我说的是如果需要接口的话  那么用的就是UML里面的接口了 而不是还要在实际的项目中去写一个专门的接口package来耽误开发人员的精力的

相关推荐

    一个轻量级的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