【.NET版月经问题】之一【接口有什么用】

来源:互联网 发布:建材网络推广方案 编辑:程序博客网 时间:2024/03/29 02:39

限于能力一般只在.NET大版转悠...每个月总有那么几帖不定时不定量地就出现了,谓之月经帖...这种问题通常都是初学者或刚转到.NET平台的面向过程开发者的疑问...有问题本身没问题,老是有人问就有问题了,是不知道去看书或搜索呢还是诸多答案鱼龙混杂无法分辨呢?至少CSDN的搜索功能是诟病很久了...

 

闲着没事陆续小总结一下,希望能帮到有疑问而恰巧看到的朋友...

 

接口是面向对象方法最重要的特性之一...接口也不是什么新鲜玩意儿,我在10年前用C++、VB5/VB6时就使用接口编程...没错,即使是不完全面向对象的VB5/VB6也有接口特性...所以接口是语言无关的,是一种思维方式...

 

关于接口的定义和特性最好去看官方教材或官方文档,我就不copy了...

 

接口到底有什么用?每次这问题都会引来大堆答案,基本上全是在讲接口的表象...其实接口的作用非常简单,一是契约,二是去耦合(即解耦)...在.NET和Java这样的单根继承体系中还有一个作用就是实现多继承,安全的多继承方式,至于单根继承和多继承的关系是另一个问题也不讲了...

 

当然契约和解耦合这两个词是如此抽象,对于面向对象初学者来说几乎不知道它们是什么意思...那就来看个几乎人人都知道的现实例子...

 

现在应该几乎没有人不知道银行卡、ATM和POS吧...

 

假如我需要点现金,打开钱包看看有几张银行卡,记得里面是有钱的,OK...去街上找ATM,附近有好几个银行,我比较懒去最近的一家...到地方一看,偏偏这家银行我没办卡...怎么办?去更远的有卡的银行吗?不需要,我随便拿一张里面有钱的卡塞到ATM里就能取到现金...

 

然后我顺路去超市买了些东西,付款时我不想用现金,因为用掉我还得去取太麻烦...我随便拿一张里面有钱的卡或随便拿一张管它有钱没钱的信用卡在收银台的POS上刷一下就得...

 

看看这个过程,和10年前的区别在哪里?

 

10年前我要取现金是比较麻烦的...那时我有建行和招商的卡,我得满大街找建行或招商的ATM,因为他们不能互通...想在建行的ATM上用招商的卡就俩字儿:没门儿!

 

至于不拿现金买东西就更别提了,整个中国都没多少能刷卡的地方,那些地方我也消费不起...

 

而现在为什么这么方便?变化来自各种银行卡上的一个小图标——“银联”标志...每个人都知道有这个标志就意味着你可以随便拿一张有这个标志的银行卡去随便一个有这个标志的ATM去取现金或在有这个标志的商店的POS上刷一把,全中国都可以...有些卡还有Visa、MasterCard两个小图标之一或都有,这些卡更方便,我可以在香港或欧洲在任何一家有这两个标志的ATM上取现金或在商店的POS上刷刷...

 

这种方便的根本,来源于两个词:契约和去耦合...

 

契约意味着:

 

1.契约主体之间要达到某种目的,这些目的是契约主体签订契约的直接动因;

 

2.契约意味着契约主体在某种程度上的一致同意。不管对于customer还是对于provider,契约都是“合意”的结果;

 

3.契约还意味着某种形式的许诺。

 

所以契约在某个范围及某种程度是具有强制性和公信力的...对于customer和provider双方来说,契约都必须得到遵守和执行...

 

而去耦合意味着:

 

1.减少对单一系统的依赖性;

2.增加整个体系的稳定性和扩展性;

3.减少单一系统的运维成本,降低整个体系的RIO和TCO。

 

所以去耦合可以使customer减少甚至摆脱对provider的依赖,同时大大提高体系的稳定性并大大降低RIO和TCO...

 

因此银联、Visa、MasterCard不是三个图标也不是三个公司,而是三个接口...它们意味着各银行、商家和消费者共同达成契约,同时消除或减弱了从前消费者和商家、银行之间的紧密耦合关系...目的是使我这样的普通消费者和超市那样的大量商家不再依赖于现金或某几家银行,也使得各家银行可以共享客户和资源,大大提高了整个体系运转的效率同时又节省了大笔运维成本...

 

这就是接口的作用...在软件工程中,合理地运用接口将有效减少各模块、子系统甚至异构系统之间的依赖,增加整个系统的稳定性、扩展性和延续性,以及减少整个系统的开发维护成本、降低整个系统的RIO和TCO...接口的作用不能从技术角度去浅显地理解,而要从软件工程和哲学的观念去思考...