问题

SOLID是常用的用来规划类以及类和类之间联系的规划准则,它的首要效果便是告知咱们如何将数据和函数安排为类,以及如何将这些类链接为程序,然后使得软件简单扩展、简单了解以及简单复用。其间D代表的便是依靠回转准则(Dependence Inversion Principle),常见的解说便是高层模块和低层模块都应该依靠抽象,而不应该依靠详细完成,这样就能更好的完成模块间的解耦。可是回转又体现在了哪里呢?

面向对象编程

为了处理这种问题,先看一下面向对象编程,面向对象编程是常见的编程范式之一,同时还有结构化编程与函数式编程,这三种编程范式对程序员的编写模式做了限定,与详细的编程言语联系较小。有时候咱们会说Java是面向对象的言语,而C是面向结构的言语,我了解这些是在言语规划之初,规划者就关于言语的语法做了相关范式的挑选,可是用C能不能进行面向对象的编程呢?我想也是能够的,只要恪守相应的规范。比如说,面向对象编程的三个特点:封装、承继、多态经过C其实也能够完成。

安全安稳的多态

这里首要比照一下C言语的多态和Java的多态方法,C言语经过函数指针完成多态,Java经过接口或许父类的完成类来复写方法来完成多态。这里以完成屏幕的展示功能为例。

//C
//screen.h
struct Screen{
void (*show)();
}
//huaweiscreen.h
#include "screen.h"
void show(){ //详细完成}
struct Screen huaiWeiScreen={show};
//main.c
include "huaweiscreen.h"
int main(){
 struct Screen* screen=&huaiWeiScreen;
 screen->show();
 return 0;
}
//Java
interface Screen{
void show();
}
class HuaWeiScreen implements Screen{
  @Override
  public void show(){
   //详细完成
  }
}
public static void main(String[] args){
    Screen screen=new HuaiWeiScreen();
    screen.show();
}

Java经过接口完成的多态在语义上同C言语经过函数指针完成多态的比照来看,要清晰的多,同时比照函数指针,也更为安全,究竟如果函数指针如果指错了完成,那么整个程序就会造成难以跟踪和消除的bug。由此能够看出类似Java这种面向对象的言语为咱们供给了一种愈加简单了解、愈加安全的的多态完成方法。

依靠回转

在安全和易于了解的多态支持出现之前,软件的架构是什么样子呢?

依赖反转原则到底反转了什么

事务逻辑模块依靠数据库模块和UI模块,数据流动的方向和源码依靠的方向是共同的,可是这其实带来一个问题,事务逻辑本身其实并不关怀数据库和UI的详细完成,运用MySQL仍是SQLite以及是用文字展示UI仍是动画展示UI事务逻辑不应该感知,可是由于缺乏一个简单了解、安全的多态方法,导致数据流动的方向和源码依靠方向必需保持共同,也让事务逻辑本身和数据库的详细完成以及UI的详细完成进行了绑定,这是不利于后续功能的扩展和修正的。 看一下运用多态后,架构规划的调整。

依赖反转原则到底反转了什么

事务逻辑模块声明数据库接口类和UI接口类,数据库模块和UI模块经过依靠事务逻辑模块,完成对应的接口,并且在更高层模块注入事务逻辑,这样数据库模块和UI模块成为了事务逻辑的插件,这种插件式的架构方便了插件的替换,事务逻辑模块不再依靠数据库模块以及UI模块,能够进行独立的部署,数据库模块的修正和UI模块的修正也不会对事务逻辑造成影响。能够注意到数据流动的方向和源码依靠的方向不再保持共同了,这便是多态的好处,无论怎样的源代码等级的依靠联系,都能够将其回转。

定论

所谓依靠回转的回转,是指支持多态的言语相关于不支持多态的言语,数据流方向和源码依靠方向不必再保持共同,能够相反,源码依靠的方向完全由开发者操控

以上是个人观点,欢迎讨论

关注我的公众号:‘滑板上的老砒霜’