保变原则

保变(Protected Variaitions)原则:保变是指受保护的变化。原则内容是找出预计的变化点或不稳定点,分配其职责以便用稳定的接口来包装。

保变原则和单职原则一直,中心都是职责与变化。不过从名称上就能看出,保变原则的着眼点更倾向变化,而单职原则的着眼点更倾向职责,此外前者侧重解决耦合问题,后者侧重解决内聚问题。封装就是实现PV的一种技巧与手段。PV涵盖的范围很广,可以是任何软件实体,包括模块、组件、子系统乃至系统。封装是在类级别的PV,或者说是数据抽象层的PV。同理,子类型多态是接口级别的PV,或者说是多态抽象层的PV。

保变原则与经典的开闭原则非常神似,如果非要找出它们之间的区别不可的话,保变原则提倡变中求稳,更侧重可维护性;开闭原则提倡稳中求变,更侧重可重用性。保变原则还暗含了迪米特法则(Law of Demeter,简称LoD),又称最少知识原则(Least Knowledge Principle,简称LKP)。具体应用到方法调用上,它要求一个对象的方法只能调用以下对象:该对象本身,即this(或self);该方法的参数;该方法内部创建的对象;该对象的直接组成对象,包括其属性及属性中的元素。

GRASP(General Responsibility Assignment Software Patterns/Principle),即通用职责分配原则。合理的系统应保证每个模块各司其职、各尽其责,既不尸位素餐,也不越俎代庖。但具体如何分配职责更合理呢?GRASP给出了一套参考答案。

信息专家原则可简单地归结为:知情者为负责者,既谁拥有完成职责所需的全部信息,谁就该负责。知情者太多是设计可能有缺陷的征兆。如果确实无法免除,就选与职责关联度最大的那位知情者。知情者具备了承担职责的基本能力,于相关信息也有一定的内在联系,让它来负责既是可能的,也是合理的。这样可令系统的整体功能比较均匀地分散于各个类之中。每当变化来临,由于职责分工明确而公平,相关的承担者容易被识破并且范围有限,同时职责分量也不会太大,因而系统较易维护。

信息专家原则有一定的合理性,但它多少还是会增加系统的耦合。当增加的耦合明显阻碍了系统的可维护性或可重用性,就须要求纯虚构原则了。比如,创建者原则建议:创建一个类的实例的职责应分配给那些包含、聚合、记录或密切使用该类的类,或者拥有该类初始化数据的类。这个原则非常自然,算得上是信息专家原则的一个推理,但同时也在两个类之间建立了强耦合。因此,可以专门设计一个工厂类,接管创建对象的职责——这便是著名的工厂模式。该工厂类无疑符合纯虚构原则,因为工厂原本是不存在的。

SOLID,它们是5个OOD原则的首字母缩写,都是熟面孔了,不用再加介绍。

SOLID是类级别的设计原则,而这个是包级别的设计原则。此处是的包指的是一组相关的类组成的颗粒度更大的模块。

总结:

转载于:https://www.cnblogs.com/guihuo/p/5651856.html

【我的《冒号课堂》学习笔记】设计原则(4)保变原则相关推荐

  1. 硬编码学习笔记(二)—— 经典变长指令

    硬编码学习笔记(二)-- 经典变长指令 前言 指令结构 符号说明 寻址符号 操作数符号 上标符号 One-Byte Opcode Map 变长指令 ModR/M 例:0x88 例:0x89 例:0x8 ...

  2. GIT学习笔记(5):变基

    GIT学习笔记(5):变基rebase 变基 引入变基 在Git中整合来自不同分支的修改主要有两种方法:merge以及rebase. 整合分支最容易的方法是merge,他会把两个分支的最新快照以及两者 ...

  3. 设计模式 学习笔记(2)单一职责原则、开放封闭原则、依赖倒转原则

    (3)单一职责原则 单一职责原则(SRP),就一个类而言,应该仅有一个引起它变化的原因.例如,我们在写一个窗体应用程序,一般都会生成一个Form这样的类,于是我们就把各种各样的代码,像算法.数据库访问 ...

  4. 计算机网络微课堂 学习笔记

    因有道云笔记转入csdn,图片无法加载,大家可进入笔记学习,链接如下: 有道云笔记地址:计算机网络微课堂 第一章 一.概述 1.1 计算机网络在信息时代的作用  计算机网络已由一种通信基础设施发展成 ...

  5. 【公司金融课堂学习笔记】1、企业融资—风险投资

    作为一个IT人,有必要学习一点公司金融课,从本节开始,分享个人学习田教授课程课程笔记. [协作网络]风险投资:简称VC(Venture Capital),风险投资是一个金融中心,是打开社会网络的抓手. ...

  6. 狂神说Mysql课堂学习笔记,jdbc(含代码,下载链接)

    连接数据库 命令行连接! mysql -uroot -p123456 命令行连接 mysql -uroot -p123456 --连接数据库show databases; -- 查看所有的数据库mys ...

  7. Python基础学习笔记——设计一个名为MyRectangle的矩形类来表示矩形

    学习目标: '设计一个名为MyRectangle的矩形类来表示矩形,这个类包含: (1)左上角坐标:x,y (2)宽度和高度 (3)构造方法:传入x,y,width,height.如果(x,y)不传默 ...

  8. JQuery课堂学习笔记

    版权声明:本文为博主原创文章,未经博主允许不得转载.更多学习资料请访问我爱科技论坛:www.52tech.tech https://blog.csdn.net/m0_37981569/article/ ...

  9. 燕十八PHP公益课堂学习笔记

    <?php /**** 燕十八 公益PHP讲堂论 坛: http://www.zixue.it 微 博: http://weibo.com/Yshiba YY频道: 88354001 ****/ ...

最新文章

  1. 15.基于Hadoop的数据仓库Hive第3部分(Hive编程实践)
  2. 全球及中国家用非金属材质水槽行业产销模式及投资规模预测报告2022-2027年
  3. Python中a和a[:]有什么区别?
  4. DirectX学习笔记_关于Sprite.Draw2D的说明
  5. C++复数运算 重载
  6. 03-27 耗电量测试
  7. web前端开发是干嘛的?
  8. 在SQL Server中插入IN-T-SQL语句
  9. 【转载】MyBatis+MySQL 返回插入的主键ID
  10. teechart的addarray_【TeeChart Pro ActiveX教程】(六):使用系列(下)
  11. Linux iproute2 命令家族(ip / ss)
  12. NOJ-1148-石子合并
  13. webstorm加载webpack
  14. 快速学习-Saturn作业编排
  15. cad刷新快捷键_CAD快捷键大全清单,送给每一位CAD初学者,非常实用的干货
  16. 如何通过Chrome查看网站登录 Cookie 信息
  17. spark-streaming统计各岗位招聘信息行数
  18. Android框架之路——OkGo的使用
  19. PhotoZoom Pro中文免费版电脑版下载V.2020.6 无损放大图片
  20. thinkphp模型层Model、Logic、Service讲解

热门文章

  1. 一步一步学习ASP.NET MVC 1.0创建NerdDinner 范例程序 - 强烈推荐!!!
  2. 原生html js css绘制折现图,HTML5教程 Chart.js自定义提示折线图
  3. 利用Python绘制萌萌哒的皮卡丘
  4. 学校计算机培训管理制度,小学教师信息技术培训管理制度
  5. html实现点赞评论功能_html的canvas实现画布功能
  6. Linux shell脚本判断服务器网络是否可以上网
  7. android二级列表展开,ExpandableListView控件实现二级列表
  8. 背包模型dp2之二维费用背包
  9. 编译是检查C语言什么的错误,c语言编译过程
  10. datediff什么作用php,php中easter_date函数的功能起什么作用呢?