面向接口编程思想
电脑配件更换引起的思考
最近在玩一款3D游戏,对显卡的要求比较高,我的显卡配置不足以支撑,思来想去,辗转反侧,最终决定要换显卡。更换显卡需要考虑新显卡和我的主板是否兼容,涉及到具体的显卡插槽,具体有AGP,PCI,PCI-E等接口,很清楚我的插槽是PCI-E的,只要买同类插槽的,就不会担心拿回家不能用。这也就意味着可以进行置换,且我的旧显卡拿到别的电脑上也可以用,这就是重用,也就是说PC已经完美的实现了重用。从这里也想到了面向对象,为什么即使使用了面向对象的方法,也很难写出可重用的对象呢?应该是不了解其中的精髓。仔细对比分析,主板-插槽-显卡、主板-插槽-内存,我们已经可以确定,PC的可重用关键的原因是在于“插槽”。同样的思路逆推,如果转换为面向对象,主板做为一个组件,显卡、内存也是一个组件,这三个组件想要置换、重用,也需要用一个“插槽”。在面向对象程序设计中,插槽可以用什么来代替?或者插槽是什么,答案就是“接口”。对于硬件来说,不管是谁提供的“插槽”,一旦插槽得到认可,所有的设计工作都要围绕插槽来进行,主板、CPU、显卡、内存等等。这就是契约精神。在编程中,我们经常用到接口,比如前台和后台提供数据者进行对接,我们会进行讨论,会说先约定接口及传参,之后我们就可以同时开工了,等完成了之后,我们就可以进行对接了。
面向对象的接口
接着上面的内容,我们平时程序对接或进行讨论程序之间的对接,比如前台展示数据,后台提供数据,前后台需要先讨论好,参数有几个,是什么格式的,返回数据是什么。到此,后台开发人员就开工了,先定义一个方法,参数和返回值都按照之前约定的进行。程序OK了,但想要重用,还有一定的问题。问题的原因在于,我们把“接口”绑死在了某个功能或组件上,如果把这个组件去掉,就意味着接口就没有了。如果要另外开发一套提供数据的组件,就意味着要重新进行约定。
到了这里,一切都清晰了,找到了解决方案:我们把接口单独提取出来,接口单独做为一个组件或类,这样前后台程序只要和接口对接,就能保证没有问题:前台-接口、后台-接口。
面向对象编程,也是面向接口编程。
依赖倒置原则
根据上面的分析,组件和组件之间不直接交互,已经基本实现模块或组件的独立性,二者通过接口进行连接,大大减少了耦合性。在这里,我们无意间触发或遵循了面向对象的一个原则:依赖倒置(依赖倒转)原则,是不是很高大上?
依赖倒转原则:抽象不应该依赖细节,细节应该依赖于抽象。
有点绕,说白了就是要面向接口变成,不要面向实现编程。
里氏代换原则
接着分析硬件,众说周知,插槽也是标准的,我们都知道的硬盘接口就是有2.0和3.0之分。只要我们接口之间的版本相同,比如一个3.0接口插槽,绝对支持“3.0硬盘”。无论这个硬盘是三星、还是希捷。这个“3.0硬盘”可以看做是一个类,而“三星3.0硬盘”、“希捷3.0硬盘”,可以分别看做是“3.0硬盘”的子类。用一句话来说,能接“3.0硬盘”的插槽,绝对对能接“三星3.0硬盘”、“希捷3.0硬盘”,到了这里,里氏代换原则的定义也就出来了。
子类型必须能够替换掉它们的父类型。
这个原则简单吧?可能会有些疑惑,不是说接口的文章么?怎么跑父类去了,是不是跑题了?我们来分析下平时我们说的接口是什么:interface、abstract class、class。是的,这些都可以成为接口,只要你愿意。所以,没有跑题。