Source: http://book.csdn.net/bookfiles/383/10038314337.shtml
“依赖”是和“变化”紧密联系在一起的概念。由于依赖关系的存在,变化在某处发生时,影响会波及开去,造成很多修改工作,这就是依赖的危害。可以说,变化是始作俑者,依赖是助纣为虐。

我们可以不去拥抱变化吗?不可以。未来将越来越不可预测,这是新经济最具挑战性的方面之一。商务和技术上的瞬息万变会产生变化,这既可以看作要防范的威胁,也可以看作应该欢迎的机遇。

既然变化不可避免,我们所能做的就是处理好依赖关系,将变化造成的影响的波及范围尽量减小。

下面总结一下“面向对象设计5大原则”和良性依赖原则在应付变化方面的作用。

单一职责原则(Single-Responsibility Principle)。“对一个类而言,应该仅有一个引起它变化的原因”。本原则是我们非常熟悉地“高内聚性原则”的引申,但是通过将“职责”极具创意地定义为“变化的原因”,使得本原则极具可操作性,尽显大师风范。同时,本原则还揭示了内聚性和耦合性是“一物两面”的关系,为了降低耦合性,基本途径就是提高内聚性;如果一个类承担的职责过多,那么这些职责就会相互依赖,一个职责的变化可能会影响另一个职责的履行。其实OOD的实质,就是合理地进行类的职责分配。

开放封闭原则(Open-Closed Principle)。“软件实体应该是可以扩展的,但是不可修改”。本原则紧紧围绕变化展开,变化来临时,如果不必改动软件实体的源代码,就能扩充它的行为,那么这个软件实体的设计就是满足开放封闭原则的。如果我们预测到某种变化,或者某种变化发生了,我们应当创建抽象来隔离以后发生的同类变化。在Java中,这种抽象指抽象基类或接口;在C++中,这种抽象是指抽象基类或纯抽象基类。当然,没有对所有情况都贴切的模型,我们必须对软件实体应该面对的变化做出选择。

Liskov替换原则(Liskov-Substitution Principle)。“子类型必须能够替换掉它们的基类型”。本原则和开放封闭原则关系密切,正是子类型的可替换性,才使得使用基类型的模块无需修改就可扩充。Liskov替换原则从基于契约的设计演化而来,契约通过为每个方法声明“先验条件”和“后验条件”;定义子类时,必须遵守这些“先验条件”和“后验条件”。当前,基于契约的设计发展势头正劲,对实现“软件工厂”的“组装生产”梦想是一个有力的支持。

依赖倒置原则(Dependency-Inversion Principle)。“抽象不应依赖于细节,细节应该依赖于抽象”。本原则几乎就是软件设计的正本清源之道。因为人解决问题的思考过程是先抽象后具体,从笼统到细节的,所以我们先生产出的势必是抽象程度比较高的实体,而后才是更加细节化的实体。于是,“细节依赖于抽象”就意味着后来的依赖于先前的,这是自然而然的重用之道。而且,抽象的实体代表着笼而统之的认识,人们总是比较容易正确认识它们,而且它们本身也是不易变的,依赖于它们是安全的。依赖倒置原则适应了人类认识过程的规律,是面向对象设计的标志所在。

接口隔离原则(Interface-Segregation Principle)。“多个专用接口优于一个单一的通用接口”。本原则是单一职责原则用于接口设计的自然结果。一个接口应该保证,实现该接口的实例对象可以只呈现为单一的角色;这样,当某个客户程序的要求发生变化,而迫使接口发生改变时,影响到其他客户程序的可能性最小。

良性依赖原则。“不会在实际中造成危害的依赖关系,都是良性依赖”。通过分析不难发现,本原则的核心思想是“务实”,很好地揭示了极限编程(Extreme Programming)中“简单设计”和“重构”的理论基础。本原则可以帮助我们抵御“面向对象设计5大原则”以及设计模式的诱惑,以免陷入过度设计(Over-engineering)的尴尬境地,带来不必要的复杂性。

本文转自BlogJava 新浪blog的博客,原文链接:如何处理好依赖关系[Reprint],如需转载请自行联系原博主。

如何处理好依赖关系[Reprint]相关推荐

  1. python与linux关系_如何处理Linux / Python依赖关系?

    由于缺乏对我想使用的一些库的支持,我将一些 Python开发从Windows转移到Linux开发.我已经花了大部分时间搞乱了依赖关系. 问题 每当我拿起Linux,我通常会遇到一些依赖问题,通常是开发 ...

  2. npm是如何处理依赖关系的

    首先我们在仓库 test 中 npm init 一个 package.json,然后 npm install react@16.13.1,此时 node_modules 的目录结构如下: testno ...

  3. linux与python什么关系,如何处理Linux / Python依赖关系?

    由于缺乏对我想使用的一些库的支持,我将一些 Python开发从Windows转移到Linux开发.我已经花了大部分时间搞乱了依赖关系. 问题 每当我拿起Linux,我通常会遇到一些依赖问题,通常是开发 ...

  4. java maven 项目依赖关系,java – 关于依赖关系共享的Maven多模块项目组合

    有几个类似的问题,但没有这样的.你如何处理这种情况(典型情况): 一个由8-11个子项目组成的项目,具有父工件/项目和一个主要项目,主要使用/声明其他项目作为模块. 问题是所有项目"严格&q ...

  5. Makefile 7——自动生成依赖关系 三颗星

    后面会介绍gcc获得源文件依赖的方法,gcc这个功能就是为make而存在的.我们采用gcc的-MM选项结合sed命令.使用sed进行替换的目的是为了在目标名前加上"objs/"前缀 ...

  6. 被问麻了,Spring 如何处理循环依赖?

    点击关注公众号,利用碎片时间学习 前言 Spring如何处理循环依赖?这是最近较为频繁被问到的一个面试题,在前面Bean实例化流程中,对属性注入一文多多少少对循环依赖有过介绍,这篇文章详细讲一下Spr ...

  7. Spring 如何处理循环依赖?

    Spring 如何处理循环依赖? 文章目录 Spring 如何处理循环依赖? 项目环境 1.什么是循环依赖? 2.Spring 如何来处理循环依赖? 2.1 allowCircularReferenc ...

  8. Spring源码剖析-Spring如何处理循环依赖

    前言 你是不是被这个骚气的标题吸引进来的,_ 喜欢我的文章的话就给个好评吧,你的肯定是我坚持写作最大的动力,来吧兄弟们,给我一点动力 Spring如何处理循环依赖?这是最近较为频繁被问到的一个面试题, ...

  9. ROS Melodic 的依赖关系记录

    我想看到各个报错和包的依赖关系,比如在 catkin_make 的时候,可能会说缺某些包,要安装依赖, 在说依赖之前,再提一点,因为我用的是树莓派3b+,内存只有1G,在编译的时候很可能会由于内存不足 ...

最新文章

  1. OEMAddressTable介绍
  2. ITK:提取二进制图像中斑点的内部和外部边界
  3. TCP的拥塞控制--慢启动,拥塞避免,快重传,快速恢复
  4. mysql存入mtr数据_mysql mtr写入数据
  5. Oracle 以某字段分组,以某字段排序,取前几条
  6. 中毒后重装系统该注意的几点
  7. 说不尽的 π —— π 的近似计算
  8. 批处理一键创建局域网共享文件夹或文件共享轻松访问Win系统其他电脑的共享文件命令行(纯bat代码)实用便携~
  9. 有赞实时数仓建设实践与经验
  10. wav 文件头 删除_Yate for mac(音频文件标记和管理工具)
  11. Java代码计算2019新个税
  12. 2016年GitHub上史上最全的Android开源项目分类汇总
  13. C++希尔密码的实现以及运用
  14. y40.第三章 Kubernetes从入门到精通 -- k8s 资源对象(十三)
  15. 功能测试——抓包工具(fiddler)
  16. 获取网站后台权限理解
  17. 从苏宁电器到卡巴斯基第35篇:我与卡巴斯基的邂逅(中)
  18. DDD(领域驱动设计)系列主题:领域和子域
  19. Linux内核中断系统
  20. springboot大学生兼职网站毕业设计源码311734

热门文章

  1. RE2、glibc regex 和 C++ regex 正则库的使用和对比
  2. 如何做到,Excel保护工作表、保护工作簿、限定表内某些区域禁止编辑?
  3. python3 tensorflow 人脸识别_tensorflow人脸识别(自己的数据集)
  4. 完全理解Android TouchEvent事件分发机制(一)
  5. PrivacyPolicy 隐私政策(鑫炳优品)
  6. jQuery取得列表控件选中的option对象
  7. 10个定时器精选电路方案带你学习时钟脉冲的工作方式
  8. MPEG音频文件格式(包括MP3文件格式)(1)
  9. ❤️ Android IPC 之 Messenger使用 ❤️
  10. 淘宝直播自动匹配关键词回复指定内容