`

为什么要针对接口编程

阅读更多
接口从更深层次的理解,应是定义(规范,约束)与实现(名实分离的原则)的分离。


接口反映了系统设计人员对系统的抽象理解的程度。


接口都是在一定的环境中产生的。脱离原先的环境,所有的接口将失去原有的意义。

-----------------------------------------------
接口统一了,实现可以千差万别,我们都可以按相同的方式访问。拿JDBC来说,很多东西都是接口,实际上就像是个架子,各个不同的数据库厂商或者第三方根据这个框架往里面塞具体的驱动实现,对于JDBC的使用者而言,这些都不必关心,按着JDBC的统一方式访问数据库就可以了,很多时候这样做也带来代码重用的方便,对不同的数据库,只需要修改少量参数而不必修改具体访问细节,而这一步也很容易放到具体程序之外,从而使代码尽可能的独立于具体的数据库,这对于程序的维护是很有好处的。

对于用户是不是真的需要知道具体类,我想:
1、就算真的需要知道具体的类,在类的对象产生后还有一个如何操纵对象的问题,假如程序中需要的具体对象所属的类不一样,但接口一致的话,那么我们很容易以利用多态写出更简洁且容易扩展的代码。
2、很多时候对象的最终的使用者和类/对象的构造者并不是同一个人,他们之间还需要一个抽象层作为contract,这个时候接口的作用还是很明显,就像前边提到的JDBC。

------------------------------------------------
有人提问:尽量少用接口行不行? 
请看这个帖子:
http://www.iteye.com/topic/1120032?page=3

cataclyzh 写道
碰到一个项目,许多只有一个实例的类也定义了接口,而且这些类还经常要添加方法.结果偷懒的人就在使用到接口的地方直接一个强制装换.

比如函数中传递了IObjectManager接口的,这个接口里面原来只有一个search(String id)方法,后来实现类经常添加方法,修改的人每次改了实现后还要在添加接口定义.结果有些地方的调用就出现了这样的代码:
((IObjectManagerImpl)IObjectManager).search(obj)

问题是这样的代码还运行的挺好的,历经测试,一直延续到最新的版本.

写这样的调用确实不好.但也算事出有因.因为不当的接口使用增加了编码的工作量.

想了想自己使用接口的地方不算多,主要是:
1. 一个接口有多个实现.最常见的是定义事件监听.
2. 需要交给Spring管理的类(一般是DAO层和service层的类).
其他的地方一般先不考虑定义接口.以后有需要了,再加.



思考的好啊! 这种思考是实践之后做出的思考,比其它人只看书本人云亦云未经实践总结就说出来的一套套理论好多了.

写与不写接口,这种大家每天都在做的平常平常平常平常事儿,是很难以讨论难以达成共识的,因为人人天天都在做这件事儿,人人都有自己的观点与看法,人人都认为自己的做法是正确的才去行动,没有人认为自己做的是不对的.

平凡中见真谛,这种思考不应该被投隐藏贴.应积极讨论,百家争鸣.


前面有人提到了JDBC的接口,JDBC的接口用的好啊, 太好了.没人说不好.  因为没有接口JDBC就不能活.
SUN公司定义JDBC规范时若不使用接口, 真没有别的方法.
比如说SUN公司1990年制定的JDBC规范(不知具体哪年), 2000年时问世了一个新数据库A公司,实现了JDBC规范,之后大家就可以使用A公司的数据库了.  所有程序员惊呼----接口万岁,并发誓以后我也充分运用接口.

比如说Apache 2008年开发了Struts2(不知具体哪年),C人2010年开始使用Struts2,并发现默认配置不能满足业务,所以他针对Struts2的接口做了扩展.  所有程序员惊呼----接口万岁,并发誓以后我也充分运用接口.

请注意以上两个事儿共有的3个特点:
1.一个接口有多个实现类(必需是多个,不然说服力不够)
2.有两个角色,SUN公司--A公司,Struts2--C人
3.有时间差,1990年--2000年,2008年--2010年
以上三点太重要了,请先记住.


转眼间到了2012年 ,cataclyzh(楼主)等人  开始开发自己公司的项目,这是一个以增删改查为主的项目,是最帖近用户的项目,并非JDBC,Struts2一类给程序使用的项目.  并定下目标,要写最好的程序:有良好的扩展性,有高质量的代码,有快速跟进用户需求变化的能力,等等..... 

项目开发中.... 一个月,两个月...八个月...
cataclyzh(楼主)等人遇到的第一难题是:用户需求一变再变
cataclyzh(楼主)等人遇到的第二难题是:交付日期一推再推
经理的脸色越来越难看, 大家开始加班,加班,加班 .修改,修改,修改.

cataclyzh(楼主)等人 开始抱怨:实现类经常添加方法和修改,修改的人每次向实现类加了新方法后,还要在接口加添加同样的方法名,甚至项目组里有人偷懒写了楼主说的强制转换代码. 请大家注意这个顺序,是先改实现类,再把代码COPY到接口当中修改接口.完全不是大家预先设想的先定义接口,后写实现类,现在的情形与书中例子说的接口的好处,与其它人的说的接口的好处截然不同,到目前为止cataclyzh(楼主)等人没有体会接口的半点好处.就陷入了深深的思考/深深的思考/深深的思考.

其实这种"快速跟进用户需求变化"的项目,接口是很难抽象出来的(主要是增删改查的业务部分).

当cataclyzh(楼主)等人困惑时,来ITEYE发贴求问,还被投了隐藏贴.   ,在这里我投你一个精华


还记得前面提到了  "共有的3个特点" 吗? 我们来分析一下,cataclyzh(楼主)所在的项目, 拥有几个?
1.一个接口有多个实现类-- 没有,cataclyzh(楼主)的接口只有一个实现类.
2.有两个角色--没有,永远是cataclyzh(楼主)这一个项目组的三五个人.同一个项目组算一个角色.
3.有时间差--或许有但不明显,基本都是当年或两一二年的项目.

经理的脸色越来越难看,所以眼前的情形是要应付的, 但也要有长远的目光.接口带来的好处是有目共睹的.cataclyzh(楼主)如果想收获接口带来的好处, 还需要先顶过目前的难关,再未来扩展时或许会收获到. 这还是一个"或许",因为但愿你公司的这个最贴近用户的产品还有扩展的机会.jdbc扩展的机会是无限大的不会消失,但你的产品....
这时候"敏捷"更重要.




最后再重复一次前面说过的话:写与不写接口,这种大家每天都在做的平常平常平常平常事儿,是很难以讨论难以达成共识的,因为人人天天都在做这件事儿,人人都有自己的观点与看法,人人都认为自己的做法是正确的才去行动,没有人认为自己做的是不对的.










分享到:
评论

相关推荐

    针对接口编程的使能工具

    针对接口编程的使能工具

    针对接口编程 java示例

    接口编程是面向对象设计的一个关键原则,尤其是在实现设计模式时,如鸭子模式。 鸭子模式(Duck Typing)是一种动态类型检查的概念,它强调“如果它走起路来像鸭子,叫起来也像鸭子,那么它就是鸭子”。在Java中,...

    面向接口编程详解

    面向接口编程是一种重要的软件设计原则,它强调程序的组件应通过接口进行交互,而不是直接依赖于具体的实现。这种编程范式有助于提高代码的灵活性、可维护性和可测试性。下面我们将详细探讨面向接口编程的思想基础、...

    面向接口编程(经典但无实例)

    面向接口编程:理论与实践深度解析 ...然而,如同任何工具或方法一样,面向接口编程也需要谨慎使用,以避免过度设计和不必要的复杂性。最终目标始终是构建出既能满足当前需求又能适应未来变化的高质量软件。

    ARM嵌入式系统设计及接口编程实验教程

    《ARM嵌入式系统设计及接口编程实验教程》是一本深入探讨ARM架构下嵌入式系统设计和接口编程实践的教程。ARM处理器以其低功耗、高性能的特点在嵌入式领域广泛应用,本书针对这一主题提供了丰富的理论知识和实践指导...

    面向接口编程 (C#)

    - **易于测试**:测试代码可以针对接口进行编写,而不是具体的实现,提高了单元测试的覆盖率。 3. **C#中的接口使用**: - **接口实现**:在C#中,一个类可以实现多个接口,通过`:`后跟接口名来实现。接口中的...

    USB接口编程PDF

    ### USB接口编程核心知识点解析 #### 一、USB总线技术概述 **1.1 USB总线技术的诞生背景** - **旧有接口的问题:** - 接口体积庞大,占据主板较大空间,不利于计算机小型化发展。 - 接口规范不统一,如PS/2用于...

    农行网上支付平台-商户接口编程指南-ASP.NET_Edition-V3.1.6.pdf

    这份农行网上支付平台商户接口编程指南主要针对使用***技术的开发人员,旨在详细说明如何通过编程实现与中国农业银行网上支付平台的对接。指南从发布至2019年的V3.1.6版本经历了多次更新,每次更新都对功能进行了...

    农行网上支付平台-商户接口编程指南-PHP_Edition-V3.1.6.zip

    《农行网上支付平台-商户接口编程指南-PHP_Edition-V3.1.6》是针对农业银行(农行)网上支付平台的一项重要参考资料,专为PHP开发者设计,旨在帮助商户快速理解和集成农行的支付接口。这个版本是2019年的更新,即V...

    农行网上支付平台-商户接口编程指南-Java_Edition-V3.1.7

    《农行网上支付平台-商户接口编程指南-Java Edition-V3.1.7》是一份由农业银行开发的针对开发者和商户的编程指南,用于指导如何通过Java语言接入并使用农行的网上支付平台进行交易处理。这份指南覆盖了接口的详细...

    嵌入式LINUX驱动接口编程

    嵌入式LINUX驱动接口编程,专门针对各个S3C2410上各个驱动程序接口介绍和分析。

    SCSI 接口编程.7z

    SCSI接口编程是针对这种接口进行软件开发的过程,主要用于实现设备控制、数据传输等功能。 在深入SCSI接口编程之前,我们首先需要了解SCSI架构的基本组成。SCSI系统通常由以下几部分构成: 1. 主控制器:这是计算机...

    Domino接口编程及Domino程序优化

    本篇主要探讨两种常见的Domino接口编程方式——通过ODBC连接和使用LC接口,并针对这两种方式进行程序优化。 首先,我们来看Domino接口编程中的ODBC连接方式。ODBC(Open Database Connectivity)是一种标准的数据库...

    串行EEPROM的接口编程

    在本文中,我们将深入探讨串行EEPROM的接口编程,特别是在ASM语言环境下。串行EEPROM,即电可擦除可编程只读存储器,是一种非易失性存储器,通常用于存储配置信息、固件代码等数据。在这种类型的存储器中,数据通过...

    农行网上支付平台-商户接口编程指南-ASP.NET_3.1.4

    《农行网上支付平台-商户接口编程指南-ASP.NET_3.1.4》是针对中国农业银行网上支付平台的商户进行接口开发的详细指导文档,主要针对ASP.NET技术栈,版本为3.1.4。这篇指南旨在帮助开发者集成农行的支付系统,实现...

    C++ USB接口编程源代码

    C++ USB接口编程是计算机科学中的一个重要领域,它涉及到如何使用C++语言与USB设备进行交互,以便实现数据传输、设备控制等功能。在本压缩包中,包含的资源主要是关于C++ USB接口编程的源代码,这对于理解USB通信...

    先创145 146有无线接口编程软件

    标题中的“先创145 146有无线接口编程软件”指的是针对先创公司生产的型号为145和146的设备的无线接口编程工具。在现代信息技术领域,无线接口编程允许用户通过无线通信方式对硬件设备进行编程和配置,无需物理连接...

    软考必备 嵌入式系统设计师2006年至2011年

    根据给定的信息,这份材料是关于中国软考(全国计算机技术与软件专业技术资格(水平)考试)中嵌入式系统设计师部分的历年试题分析与解答。...考生应充分利用这份资料,为顺利通过嵌入式系统设计师考试做好充分的准备。

    SCSI 接口编程

    在深入探讨SCSI接口编程时,我们首先要知道的是SCSI(Small Computer System Interface,小型计算机系统接口)是一种标准的并行总线接口技术,广泛应用于各种计算机硬件设备之间,如硬盘驱动器、光驱、磁带机等。...

    面向 AMetal 框架与接口的编程图书代码使用说明1

    总的来说,AMetal框架为开发者提供了一个强大的平台,用于开发和测试嵌入式系统,而《面向 AMetal 框架编程与接口编程》则是这个框架的权威指南,通过详细的程序清单和配套工程,帮助开发者快速上手并深入理解AMetal...

Global site tag (gtag.js) - Google Analytics