接口依赖 - fanglinliu/fanglinliu.github.io GitHub Wiki
依赖接口的意思就是成员变量是接口,抽象类。成员函数的参数和返回值都是接口。具体类继承于接口。依赖实现就是成员变量,基类,成员函数参数、返回值是实现类。当然不会所有的依赖都是接口。稳定不变的类应该用实现。比如iOS系统提供基础类如NSString。只有一个统一的原则:依赖于稳定的东西。接口和系统提供的实现类都是相对稳定的东西,所以可以依赖。稳定包含两方面的含义:一方是是不易变化,另一个方式是bug少,是可靠的。
C++ template 不依赖于接口,更不依赖于实现。只依赖于具体用到的函数。
OOP的原则是每个具体类都继承于接口,具体类的成员变量都是接口,成员函数的参数、返回值也是接口
依赖接口而不是实现是为了降低耦合,依赖最少的信息。
依赖的信息越少,越容易复用
C template 使用的是duck typing。依赖的信息很少。不会依赖一个具体实现类,也不会依赖一个接口。用到什么函数,就依赖于某个函数。依赖的函数确实就是要使用到的函数。不会多依赖一个多余的函数。依赖于一个接口虽然好于依赖实现,但是还是有可能依赖多余的函数。 Python等脚本语言就得益于duck typing,复用性很高。Python开发效率更高,不需要写接口以达到复用的目的。也不需要写C Template以达到复用目的。按照直觉直接写代码就可以达到C++ template和OOP刻意写依赖接口的方式才能达到的代码复用的目的。这就是Python等脚本语言开发效率比Java等开发效率高的原因。Python不需要经过特别设计模式的训练就可以写出高度可复用的代码。
C++ template 比依赖接口更容易复用,也就更容易做单元测试。
swift extension protocol可以完成类似C template 的功能。这是由于Swift protocol实现机制的特殊性导致的。C 接口继承做不到。swift extension protoco,每个类的每个protocol都有一个独立的vtable。而C++的class不管实现了多少个接口,都只有一个vtable。