`
ieye
  • 浏览: 31695 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

面向接口编程的思考

阅读更多

      随着IOC各种实现(比如Spring /guice )出现,特别是Spring的影响力的扩大化,面向接口编程范式被提出来,于是企业编程中便大量地使用IOC技术,典型的展现形式是一个接口对应一个(几乎全部是仅有一个 )实现,接口和具体的实现类的绑定通过IOC容器实现。相信这种现象很多人都看到过,并且现在依然在这么做,甚至没有停下来思考过合理性。我记得刚刚进入公司的时候,看到应用中有大量的spring配置文件,各种DAO和各种Manager都配置在其中,而且几乎每个接口基本都是只有一个实现类。我尝试怀疑过这样做的合理性,但是被“资深人士”解说,“这是面向接口编程范式,只依赖接口,可以隐藏实现细节,隔离实现类使用的依赖,适应新的变化。 ”类似的话,然后我崇拜地点了点头,表示恍然大悟,其实我并没理解

     现在回过头来看看,这些话是不是真的名副其实呢?“只依赖接口,可以隐藏实现细节”这句话,我表示赞同,但是这不是使用接口的有力证据。事实上,类(class)本身也是对功能的抽象,也隐藏了实现细节。“隔离实现类使用的依赖”这句,我表示不完全苟同。举例说明,假如A是接口,AImpl是A接口的实现类,B是A的客户端,如果B直接依赖AImpl的话,会把AImpl依赖间接依赖进来,但是是编译时依赖。如果B依赖A接口,那么最终在运行时AImpl最终会被注入到B中,顺带着AImpl的依赖会带进来,不过这个是运行时依赖。通过这个,不难看出,只是把依赖搞成了编译时和运行时,当然运行时的依赖有时候会好点,比如通过OSGi 可以暴露出很少的类,从而减少依赖冲突。再来看“适应新的变化”这句,前边也说到,几乎每个接口都只有一个实现类,那么貌似适应新的变化并不具备说服力。当然,我并不是完全否定面向接口技术,也不是对IOC嗤之以鼻。我只是想表达一下“一个接口一个实现”的问题。

      接下来,什么时候情况下才考虑使用面向接口技术呢?要搞清楚这个,首先谈下接口的意义。个人理解如下:接口是对功能的抽象,更是对功能变化 的抽象;接口是模块间 的一种契约。接口这两点特性决定了接口的使用方式, 对于独立的模块(甚至是独立的系统)之间的交互,使用接口是推荐的方式,甚至是必须的 ,这样隔离了模块实现细节,对模块之间的独立开发重构以及测试都起到了关键作用。 对于模块内部那些经常变化(至少目前业务可见范围内)的功能单元,可以抽象成接口 ,这样方便以后提供新的实现类来增加新的功能,这个不是必须的,但是是推荐的。 对于模块内部几乎不会发生变化的功能,就没有必要提供抽象成接口了 ,因为很少变化,而且是在模块内部使用,所以以Class的形式抽象就完全可以了。



 
 如上图,蓝色区域代表一个模块甚至是一个系统,黑色条带表示接口,黄色表示具体的功能类,绿色区域表示实现了接口的功能类,箭头表示依赖或者实现接口。这幅图基本描述了,接口的使用方式,模块之间使用接口依赖,模块内部多变功能使用接口抽象,模块内部很少变化的功能不使用接口

      好吧,就这么多吧。第一次写技术博客,个人的理解和高度有限,难免会有误差,欢迎拍砖。

                                                                                                                                         

  • 大小: 22.9 KB
分享到:
评论

相关推荐

    实验项目C、面向抽象和面向接口编程

    实验项目C、面向抽象和面向接口编程 一、实验目的 ★专题:继承基础和面向抽象编程★ 1、掌握继承的使用。 2、掌握Object类的基本用法。 3、理解和掌握抽象类的用法。 4、理解final关键字。 5、掌握和理解多态的运用...

    写给大家看的面向对象编程书(第3版).[美]Matt Weisfeld(带详细书签).pdf

    书中结合代码示例生动透彻地讲述了面向对象思想的精髓,让读者真正学会以对象方式进行思考。此外,本书还讨论了各种与面向对象概念密切相关的应用主题,包括XML、UML建模语言、持久存储、分布式计算和客户/服务器...

    写给大家看的面向对象编程书(第三版)

    第2章 如何以对象方式思考 2.1 了解接口与实现之间的区别 2.2 设计接口时使用抽象思维 2.3 尽可能为用户提供最小接口 2.4 小结 2.5 参考书目 第3章 高级面向对象概念 3.1 构造函数 3.2 错误处理 3.3 作用...

    DSP接口电路设计与编程

    详细论述了DSP与多种外围接口电路的设计方法,包括各种存储器、模数和数模转换电路、异步串行接口、地址/数据复用总线、扩展I/O、CPCI总线,以及相关的软件编程和调试方法,还介绍了高速数字电路、数模混合电路的...

    设计模式:可复用面向对象软件的基础--详细书签版

    本书假设你至少已经比较熟悉一种面向对象编程语言,并且有一定的面向对象设计经验。当我们提及“类型”和“多态”,或“接口”继承与“实现”继承的关系时,你应该对这些概念了然于胸,而不必迫不及待地翻阅手头的...

    设计模式可复用面向对象软件的基础

    本书假设你至少已经比较熟悉一种面向对象编程语言,并且有一定的面向对象设计经验。当我们提及“类型”和“多态”,或“接口”继承与“实现”继承的关系时,你应该对这些概念了然于胸,而不必迫不及待地翻阅手头的...

    设计模式可复用面向对象软件的基础(中文版)

    本书假设你至少已经比较熟悉一种面向对象编程语言,并且有一定的面向对象设计经验。当我们提及“类型”和“多态”,或“接口”继承与“实现”继承的关系时,你应该对这些概念了然于胸,而不必迫不及待地翻阅手头的...

    动物招领所源码

    面向对象推荐面向接口进行编程,面向接口的核心思想是抽象(只依赖于接口不依赖于具体的实现)这样来构造灵活的系统。 四.系统概述: 流浪动物招领所是收养流浪动物的地方,动物招领所有一定的粮食用来喂养动物。 ...

    深入 .NET平台和C#编程

    用对象来思考:接口 序列化与反射 8. Video 教学 Video: 演示 新闻阅读器 功能 9. 附录 类库中主要命名空间 数据结构 10. 指导学习 DLC 1 DLC 2 DLC 3 11. 在线培训 无 12. 项目案例 ...

    像计算机科学家一样思考Python(第2版).pdf

    贯穿全书的主体是如何思考、设计、开发的方法,而具体的编程语言,只是提供了一个具体场景方便介绍的媒介。 全书共21章,详细介绍Python语言编程的方方面面。本书从基本的编程概念开始讲起,包括语言的语法和语义,...

    Java简明教程

    主要内容包括:Java编程基础、面向对象编程原理、接口、包、泛型的基本概念、链表、栈、散列、字符串处理、异常处理、输入输出、多线程、小程序、Swing图形界面设计、事件处理、数据库常用操作方法以及基于Access...

    《Java程序设计案例教程》教学课件05深入Java面向对象.pptx

    能够在MyEclipse IDE中定义接口及定义类实现接口。 《Java程序设计案例教程》教学课件05深入Java面向对象全文共47页,当前为第3页。 5.1 回顾与思考 在模块4我们以Circle类为例,从类的定义入手,详细分析了类的构成...

    实验一、套接字网络编程

    熟悉套接字编程接口,初步掌握面向无连接的网络应用程序的开发方法。 二、实验内容 (1)用WinSock设计一个UDP服务器,每当收到UDP数据报时,显示客户IP地址、端口和数据报数据部分,再将数据部分发回客户端。 (2...

    Linux Shell编程从初学到精通(第2版)[2015.1].zip

    本书结合大量的示例,系统、全面地介绍了bash Shell脚本编程的语法、命令、技巧、调试等内容,在书中还有很多练习可以引导读者思考,力求使读者掌握Linux bash Shell编程的所有特性。 本书结构清晰、易教易学、实例...

    面向对象技术与UML课件及源代码-by 南邮-陈杨

    本书为中南大学精品教材立项项目,分为上下两篇共21章,涵盖了面向对象技术中Java开发环境配置、程序设计基础、面向对象原理以及UML的知识。本书使用的开发环境是JDK 1.6+Eclipse 3.3+Rational Rose 2003,逐步引领...

    LinuxC编程一站式学习

    C语言是一种面向底层的编程语言,要写好C程序,必须对操作系统的工作原理非常清楚,因为操作系统也是用C写的,我们用C写应用程序直接使用操作系统提供的接口。既然你选择了看这本书,你一定了解:Linux是一种开源的...

    电子档案属性组件 v3.0.0.1.zip

    3、名称为“VC Code”的文件夹,是采用VC60开发的例程代码,采用面向对象编程语言的用户可以进行编译参考。 4、名称为“VB Code”的文件夹,是采用VB60开发的例程代码,采用面向控件编程语言的用户可以进行编译参考...

    前端之Android入门:MVC模式(下)

    在上一篇文章中,我们将View类单独出来并完成了设计和编写。这次我们将完成Model类,并通过Controller将两者连接起来,完成这个计算器程序。...这就是面向接口编程的概念。思考一下Model类,它主要实现三个功能,

Global site tag (gtag.js) - Google Analytics