依赖反转(依赖倒置)原则之“反转(倒置)”

依赖反转(倒置)原则(Dependency inversion principle,DIP)是面向对象编程6大原则之一。这个原则应该是计算机开发人员必知必会的一个基本原则,但是看了网上很多Blog上贴的解释(讲解、理解等等),发现很多人对该原则的理解还是存在一定偏差的。
首先是该原则的含义,下列引用内容来自于维基百科的依赖反转原则词条:

该原则指一种特定的解耦(传统的依赖关系建立在高层次上,而具体的策略设置则应用在低层次的模块上)形式,使得高层次的模块不依赖于低层次的模块的实现细节,依赖关系被颠倒(反转),从而使得低层次模块依赖于高层次模块的需求抽象。该原则规定:

  1. 高层次的模块不应该依赖于低层次的模块,两者都应该依赖于抽象接口;
  2. 抽象接口不应该依赖于具体实现。而具体实现则应该依赖于抽象接口。

网上不少的Blog都有说DIP原则,例子也是举了若干,并且从举例看貌似也很贴切。不过,这些Blog中基本都是在解释依赖接口编程如何如何的好,当然在他们举的例子中均能体现出依赖接口编程的好处,这点本人没有任何的异议,甚至Blog的行文和案例方面都没有可挑剔的,比本人强太多了。但是,DIP中的倒置(习惯使用倒置,不习惯反转,以后均使用倒置)如何体现?难道依赖接口,不依赖具体实现就是所谓的“倒置”?显然这里面还有“事儿”没有说出来。看了网上很多的解释都让人很失望,特别是在搜索引擎的第一页给出的各个“文章”中,只有维基百科里面的解释本人觉得算比较明确的。下面就说说所谓的“倒置”问题谈谈我自己的认识。

个人感觉针对依赖倒置原则,应该是在涉及到软件系统的结构设计及实现时才能更好的去理解。按现在软件开发的“行规”,一个复杂的系统必然存在高层与低层,并且,高层对象使用低层对象为其提供的“服务”来实现自己的业务逻辑,即所谓的高层依赖低层。但如果高层对象直接使用这些低层对象(的具体实现),当业务变化,而低层的已有实现无法满足高层的服务需求时,那就需要“伤筋动骨”。为了避免这样的问题,人们提出了面向(依赖)接口编程,这样只要接口不发生变化,低层的实现不会影响上层的使用。目前网上大多数的Blog基本都说到这里就“完结撒花”了。他们大概、或许、应该是认为依赖了接口就是“倒置”了。可是细想一下,如果仅仅是依赖了接口就“撒花”,那为啥这个原则不叫“依赖接口原则”?这其中的“倒置”究竟是说啥?

按照常理,软件划分层也好,模块也厚,通常都是将相同语义的元素放在一起,因此接口与其实现(类)应该处于一层或模块之中。如下图所示(StarUML绘制,请忽略图片中背景水印,免费的还要啥自行车?):
DIP1.png

这看似好像没有问题,但是软件的高层应用可能会发生变化,即来自客户的需求会发生变化(这是常事儿啊)。当高层的应用发生了改变,那它依赖的低层对象所提供的服务也很可能要发生变化,因为高层要完成新的业务,低层要负责提供对应的服务。那么问题来了,谁来约定这个接口提供什么样的服务?按照前面的逻辑,接口和实现放在低层中,那应该由低层提供,可是低层开发人员并不负责高层的应用逻辑。低层应该应该只关心自己那点事儿,即负责响应高层的需求,去按照需求提供实现服务。但现在接口放在低层维护,就应该由低层的开发人员负责体现需求的接口的“变更”(提供新的服务)。这样会发现这样的情况,即负责高层实现的开发人员,他们拥有需求,但无法定义描述需求的接口;负责低层的开发人员,他们不管需求,只应提供具体实现,却要维护和应用需求有关的接口。这不就出现了很大的矛盾吗?


DIP2.png

因此,为了解决这样的矛盾,人们提出将本应放在低层的接口放在高层,低层的实现依赖高层提供的接口,去实现相应的服务(请参见上图所示)。本人认为这才是DIP中“倒置”的真正含义所在。

本文分两天抽空写的,前一天还能不翻墙直接访问中文的维基百科,今天不翻墙就不行了,白高兴了半天。
ps:想吐槽,已无力,就这么着吧~

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,185评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,445评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,684评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,564评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,681评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,874评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,025评论 3 408
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,761评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,217评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,545评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,694评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,351评论 4 332
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,988评论 3 315
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,778评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,007评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,427评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,580评论 2 349

推荐阅读更多精彩内容