面向对象设计中有几个设计原则, 可以避免实现中的坏味道.
其中之一是 DIP(Dependency Inversion Principle) 依赖倒置原则.
类(或模块) 都简称为类(class).
依赖倒置 - 高层实现不应依赖于底层实现, 两者都应该依赖于抽象. 抽象不应依赖于细节, 细节应依赖于抽象.
依赖倒置原则, 应用在框架或库的设计中.
违反依赖倒置原则的程序, 一般是结构化设计的程序. 高层模块需要调用底层模块实现的功能, 而底层模块可能又依赖更底层的模块提供的功能.
面向对象程序设计时, 可以使用接口来避免违反依赖导致原则.
e.g. 高层模块使用的是功能基类的指针对应的接口, 在运行时传进来的是具体实例化的子类指针. 这样高层代码就不依赖于具体的子类实现, 在运行时是活的.
程序中所有的依赖关系都应该中止于抽象类或接口.
任何变量都不应该持有指向具体类的指针或引用.
任何类都不应该继承自具体类.
任何方法都不应该覆盖在基类中已经实现的方法, 即子类中实现的必须是接口(纯虚函数). 这条是理想状态.
如果软件分为多个库(.a 或者 .dll), 如果产生循环依赖, 在新版时, 即使改动只有一个库, 就不得不发布很多库.
如果不存在循环依赖问题, 假设我们只需要修改一个库, 那修改完这个库, 就发布这1个库作为补丁或升级包就可以.