【我的《冒号课堂》学习笔记】设计原则(4)保变原则
保变原则
保变(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)保变原则相关推荐
- 硬编码学习笔记(二)—— 经典变长指令
硬编码学习笔记(二)-- 经典变长指令 前言 指令结构 符号说明 寻址符号 操作数符号 上标符号 One-Byte Opcode Map 变长指令 ModR/M 例:0x88 例:0x89 例:0x8 ...
- GIT学习笔记(5):变基
GIT学习笔记(5):变基rebase 变基 引入变基 在Git中整合来自不同分支的修改主要有两种方法:merge以及rebase. 整合分支最容易的方法是merge,他会把两个分支的最新快照以及两者 ...
- 设计模式 学习笔记(2)单一职责原则、开放封闭原则、依赖倒转原则
(3)单一职责原则 单一职责原则(SRP),就一个类而言,应该仅有一个引起它变化的原因.例如,我们在写一个窗体应用程序,一般都会生成一个Form这样的类,于是我们就把各种各样的代码,像算法.数据库访问 ...
- 计算机网络微课堂 学习笔记
因有道云笔记转入csdn,图片无法加载,大家可进入笔记学习,链接如下: 有道云笔记地址:计算机网络微课堂 第一章 一.概述 1.1 计算机网络在信息时代的作用 计算机网络已由一种通信基础设施发展成 ...
- 【公司金融课堂学习笔记】1、企业融资—风险投资
作为一个IT人,有必要学习一点公司金融课,从本节开始,分享个人学习田教授课程课程笔记. [协作网络]风险投资:简称VC(Venture Capital),风险投资是一个金融中心,是打开社会网络的抓手. ...
- 狂神说Mysql课堂学习笔记,jdbc(含代码,下载链接)
连接数据库 命令行连接! mysql -uroot -p123456 命令行连接 mysql -uroot -p123456 --连接数据库show databases; -- 查看所有的数据库mys ...
- Python基础学习笔记——设计一个名为MyRectangle的矩形类来表示矩形
学习目标: '设计一个名为MyRectangle的矩形类来表示矩形,这个类包含: (1)左上角坐标:x,y (2)宽度和高度 (3)构造方法:传入x,y,width,height.如果(x,y)不传默 ...
- JQuery课堂学习笔记
版权声明:本文为博主原创文章,未经博主允许不得转载.更多学习资料请访问我爱科技论坛:www.52tech.tech https://blog.csdn.net/m0_37981569/article/ ...
- 燕十八PHP公益课堂学习笔记
<?php /**** 燕十八 公益PHP讲堂论 坛: http://www.zixue.it 微 博: http://weibo.com/Yshiba YY频道: 88354001 ****/ ...
最新文章
- 15.基于Hadoop的数据仓库Hive第3部分(Hive编程实践)
- 全球及中国家用非金属材质水槽行业产销模式及投资规模预测报告2022-2027年
- Python中a和a[:]有什么区别?
- DirectX学习笔记_关于Sprite.Draw2D的说明
- C++复数运算 重载
- 03-27 耗电量测试
- web前端开发是干嘛的?
- 在SQL Server中插入IN-T-SQL语句
- 【转载】MyBatis+MySQL 返回插入的主键ID
- teechart的addarray_【TeeChart Pro ActiveX教程】(六):使用系列(下)
- Linux iproute2 命令家族(ip / ss)
- NOJ-1148-石子合并
- webstorm加载webpack
- 快速学习-Saturn作业编排
- cad刷新快捷键_CAD快捷键大全清单,送给每一位CAD初学者,非常实用的干货
- 如何通过Chrome查看网站登录 Cookie 信息
- spark-streaming统计各岗位招聘信息行数
- Android框架之路——OkGo的使用
- PhotoZoom Pro中文免费版电脑版下载V.2020.6 无损放大图片
- thinkphp模型层Model、Logic、Service讲解
热门文章
- 一步一步学习ASP.NET MVC 1.0创建NerdDinner 范例程序 - 强烈推荐!!!
- 原生html js css绘制折现图,HTML5教程 Chart.js自定义提示折线图
- 利用Python绘制萌萌哒的皮卡丘
- 学校计算机培训管理制度,小学教师信息技术培训管理制度
- html实现点赞评论功能_html的canvas实现画布功能
- Linux shell脚本判断服务器网络是否可以上网
- android二级列表展开,ExpandableListView控件实现二级列表
- 背包模型dp2之二维费用背包
- 编译是检查C语言什么的错误,c语言编译过程
- datediff什么作用php,php中easter_date函数的功能起什么作用呢?