本篇介绍软件设计原则之一DIP:依赖倒置原则。很多知识回头来看会有新的理解。看到一句话,一段文字,一个观点有了新的理解,醍醐灌顶的感觉。这种感觉像是一种惊喜。古语说:温故而知新。

DIP:依赖倒置原则

a.高层模块不应该依赖于低层模块。二者都应该依赖于抽象。

b.抽象不应该依赖于细节。细节应该依赖于抽象。

层次化

Booch曾经说过:“所有结构良好的面向对象架构都具有清晰的层次定义,每个层次通过一个定义良好的、受控的接口向外提供了一组内聚的服务”

倒置的接口所有权

这里的倒置不仅仅是依赖关系的倒置,它也是接口所有权的倒置。我们通常会认为工具库应该拥有它们自己的接口。但是当应用了DIP时,我们发现往往是客户拥有抽象接口,而它们的服务者从这些抽象接口派生。

依赖于抽象

该启发式规则建议不应该依赖于具体类——也就是说应该终止于抽象类或接口。

我们在应用程序中所编写的大多数的类是不稳定的。我们不想直接依赖于这些不稳定的具体类。通过把它们隐藏在抽象接口的后面,可以隔离它们的不稳定性。但这不是一个完整的解决方案,常常,如果一个不稳定的接口必须要变化时,这个变化一定会影响到表示该类的接口。这种变化还是破坏了由抽象接口维系的隔离性。如果看得更远一些,认为是由客户模块或层来声明它们需要的服务接口,那么仅当客户需要时才会对接口进行改变。这样,改变实现抽象接口的类就不会影响到客户。

那么我们来聊下我们应用中常用的架构类型,微软为了展示.Net企业系统开发的能力。曾经发布过一个PetShop作为范例,后来很多企业系统的架构都采用了参照了或简化了此架构设计。标准的三层架构。

从上图所知,业务层对数据访问层抽象出来的IDAL模块,除了解除了向下的依赖之外,对于其上的业务逻辑层,相同仅存在弱依赖关系。那么来看这个设计满足了DIP:依赖倒置原则的高层模块不应该依赖于低层模块,二者都应该依赖于抽象。 传统的软件开发,比如结构化分析和设计,总是倾向于创建一些高层模块依赖于低层模块、策略依赖于细节的软件结构。实际上这些方法的目的之一就是要定义子程序层次结构,该层次结构描述了高层模块怎么调用低层模块。一个设计良好的面向对象程序(如上图所示的Petshop ),其依赖程序结构相当于传统的过程式方法设计的通常结构而言就是被“倒置“了。

那么IDAL接口层的所有权属于谁的?以前一直有这个疑问直到看到这一章疑问解决了。通常认为IDAL接口层属于DAl层,那是不对的。这里的IDAL接口层的所有权是属于BLL层了,接口所有权倒置了。通过倒置这些依赖关系,我们创建了一个更灵活、更持久、更易改变的结构。高层模块BLL不在直接依赖DAL层,而依赖抽象IDAL接口层。则层与层之间的关系就是松散耦合的。假设此时必须要改动数据访问层的实现,仅仅重新实现IDAL的接口定义,那么业务逻辑层就不会受到影响。毕竟,无论是SQLServerDAL还是OracalDAL与业务逻辑层实现没有直接的关系。

面象对象的程序设计倒置了依赖关系,使得细节和策略依赖于抽象,并且常常是客户拥有服务接口。依赖关系的倒置正是好的面向对象设计的标志所在。是实现许多面向对象技术所宣称的好处的基本低层机制。它的正确应用对于创建重用的框架来说是必需的。同时它对于构建在变化面前富有弹性也是重要的。由于抽象和细节彼此隔离,所以代码也非常容易维护。

其实最深的体会是对接口所有权倒置的理解。

代码示例地址:https://github.com/tianyaxiang/ApplicationArchitecture

本文首发于个人微信公众号:webguan ;欢迎您的关注

SOLDI原则之DIP:依赖倒置原则的更多相关文章

  1. C#软件设计——小话设计模式原则之:依赖倒置原则DIP

    前言:很久之前就想动笔总结下关于软件设计的一些原则,或者说是设计模式的一些原则,奈何被各种bootstrap组件所吸引,一直抽不开身.群里面有朋友问博主是否改行做前端了,呵呵,其实博主是想做“全战”, ...

  2. 《设计模式》-原则三:依赖倒置原则(DIP)

    这几天晚上回来都去玩了!没有坚持学习.真的好惭愧! 非常自责 后面一定要坚持 一气呵成  争取每天学一点,把这个学完. 今天主要是看了一下  设计模式中的 原则三: 依赖倒置原则(DIP) 官方是这样 ...

  3. 【面向对象设计原则】之依赖倒置原则(DIP)

    依赖倒转原则(Dependency Inversion  Principle, DIP):抽象不应该依赖于细节,细节应当依赖于抽象.换言之,要针对抽象(接口)编程,而不是针对实现细节编程. 开闭原则( ...

  4. 六大设计原则(三)DIP依赖倒置原则

    依赖倒置原则DIP(Dependence Inversion Principle) 依赖倒置原则的含义 高层模块不能依赖低层模块,二者都应该依赖其抽象. 抽象不应该依赖于细节. 细节应该依赖抽象. 什 ...

  5. 【设计模式六大原则3】依赖倒置原则(Dependence Inversion Principle)

      定义:高层模块不应该依赖低层模块,二者都应该依赖其抽象:抽象不应该依赖细节:细节应该依赖抽象. 问题由来:类A直接依赖类B,假如要将类A改为依赖类C,则必须通过修改类A的代码来达成.这种场景下,类 ...

  6. 面象对象设计原则之五:依赖倒置原则(The Dependency Inversion Principle,DIP)

    如果说开闭原则是面向对象设计的目标的话,那么依赖倒转原则就是面向对象设计的主要实现机制之一,它是系统抽象化的具体实现.依赖倒转原则是Robert C. Martin在1996年为“C++Reporte ...

  7. DIP依赖倒置原则

    一.定义 1.高层模块不应该依赖低层模块,二者都应该依赖抽象 2.抽象不应该依赖于细节.细节应该依赖于抽象 二.层次化 1.简单介绍 结构良好的面向对象架构都具有清晰的层次定义,每个层次通过一个定义良 ...

  8. 九 DIP 依赖倒置原则

    首先看定义: 1.高层模块不依赖于低层模块,两者都应该依赖于抽象层 2.抽象不能依赖于细节,细节必须依赖于抽象 首先,模块是个抽象的概念,可以大到一个系统中的子系统作为一个模块,也可以是某个子系统中的 ...

  9. 第2章 面向对象的设计原则(SOLID):3_依赖倒置原则(DIP)

    3. 依赖倒置原则(Dependence Inversion Principle,DIP) 3.1 定义 (1)要依赖抽象,不要依赖具体的实现类.简单的说就是对抽象(或接口)进行编程,不要依赖实现进行 ...

  10. 依赖倒置原则(Dependency Inversion Principle)

    很多软件工程师都多少在处理 "Bad Design"时有一些痛苦的经历.如果发现这些 "Bad Design" 的始作俑者就是我们自己时,那感觉就更糟糕了.那么 ...

随机推荐

  1. 如何使用maven进行avro序列化

    maven导入avro: <dependency> <groupId>org.apache.avro</groupId> <artifactId>avr ...

  2. 普林斯顿微积分读本 大纲与重点 (by zzd)

    普林斯顿微积分读本 大纲重点 由于博客园太菜,所以我用图片上传. 当前更新状态:未完待续,挖坑暂时不填了. UPD(2018-07-08): 稍微更一下,加一个本书的某一版本下载链接:https:// ...

  3. JavaSE | IO流

    java.io.File类(文件和目录路径名的抽象表示形式) 如果希望在程序中操作文件和目录都可以通过File类来完成,File类能新建.删除.重命名文件和目录. File类是文件或目录的路径,而不是 ...

  4. >maven-compiler-plugin的理解

    在maven中项目中这个插件一直都会看见,但是一直没有认真学习一下为啥使用,现在有空就查询学习一下. 1.使用场景 下载了一些工程需要编译的时候. maven是个项目管理工具,如果我们不告诉它我们的代 ...

  5. GUI:GUI的方式创建/训练/仿真/预测神经网络—Jason niu

    (1)导入数据:点击最左底部Import 按钮 (2)创建模型network_Jason_niu:点击底部的New按钮 (3)设置参数并训练:点击底部的Open按钮 (4)仿真预测: 大功告成!

  6. Pedestrian Attributes Recognition Paper List

    Pedestrian Attributes Recognition Paper List  2018-12-22 22:08:55 [Note] you may also check the upda ...

  7. [ 低危 ] mt网CRLF

    漏洞: xxx.meituan.com/%0d%0aevilheadername:%20inject_by_whoamisb 原理猜测: 收到xxx二级域名的时候,会location跳转到该域名(这是 ...

  8. Linux学习笔记9

    管道 pipe 如 : ls |less -MN 含义把ls 结果输出到less ls=|=more ls 命令 ls -a 展示隐藏的文件 隐藏文件一般以.开始 ls -t 以时间戳排序  ls - ...

  9. 错误类型“Microsoft.Office.Interop.Word.ApplicationClass”未定义构造函数

    原文网址:http://zhidao.baidu.com/link?url=WcvaYFI1JeEGvbjD77nDbGp21sjaNCnCTRLGrU5YjwUGbHbhHJxQolKbsMZbZs ...

  10. QtQuick大坑笔记之Http的Get与Post操作(带cookie)

    前言 最近在为单位做一个简单的手机App,基于Qt技术栈的选择了QtQuick来开发.不得不说QtQucik开发的确舒服,很多东西都不用写就可以只用,UI定义起来也比较自由.但是本人想通过cookie ...