[转]DRY原则和Shy原则
在一个系统的整个生命周期里,理解和改动这类维护工作的比例一般非常之高。为了维护的方便,要尽量将系统划分为可以独立理解与改动的模块。这就要在设计的时候注重DRY原则与Shy原则。不过,这两条原则有一定的冲突,并不总能兼得,于是在追求的时候要重视分寸。
维护者的两大困扰
有两种情况会给维护者增添很大的麻烦:一种是为了调整一个效果,要改动无数个地方;一种是只改动了一个地方,却影响了很多效果。
在前一种情况下,非常容易出现漏改的问题——因为需要改动的地方太多,有些应该改动的地方没有改动;在后一种情况下,非常容易出现误改的情况——因为被影响的效果太多,有些不该改动的地方跟着变了。
无论出现那种情形,都会使得理解和改动设计变得困难。不过,只要在设计的时候秉持一些原则,这两种事情都可以得到有效的遏制。
DRY原则
DRY是“Don't Repeat Yourself”的缩写。意思是说,在一个设计里,对于任何东西,都应该有且只有一个表示,其它的地方都应该引用这一处。这样需要改动的时候,只需调整这一处,所有的地方就都变更过来了。
运用DRY原则的时候,有一个很微妙的事情是要认真判别两样东西是否是一回事。有时候也有“两样东西现在碰巧看起来是一样的,但是并不能保证将来始终都一样”的情况。这种时候,很可能就有制造一点表面上的重复的必要了。
Shy原则
Shy不是任何东西的缩写。这里是取其字面意思,说系统的每个部分都应该害羞一点,不要把只和自己有关的信息暴露给其它部分,同时也不要毫不客气的依赖太多的其它部分。这样一来,日后便可以放心的修改这些没变暴露的东西,也不用太过担心自己依赖的东西发生了变化。
运用Shy原则的时候的主要挑战在于厘清哪些东西适合被做成系统里的独立单元。特别是确定独立单元的大小。
两条原则的平衡
DRY原则和Shy原则的目标是相同的,都是为了增强系统的可维护性。一个很好的遵循了DRY原则和Shy原则的系统,被称为具有“正交性”的系统。
DRY原则和Shy原则在某种程度上是不能兼得的:想要一个系统够DRY,就得尽量把各部分里相同的东西分离出去放在一起,这难免就会导致很多部分都和分离出来的这些东西存在一些关系,从而不够Shy;想要一个系统够Shy,就得努力让各部分都做得和其它部分没有什么暧昧,这难免就会致使每个部分里面都有一些本来可以共同使用的内容,从而不够DRY。
但是,实际需要的是能兼顾两条原则的设计。这就需要追求每条原则的时候都注意保持一定的分寸。
[转]DRY原则和Shy原则的更多相关文章
- DRY原则和Shy原则
保障可维护性的主要诀窍是遵循DRY原则和Shy原则. 在一个系统的整个生命周期里,理解和改动这类维护工作的比例一般非常之高.为了维护的方便,要尽量将系统划分为可以独立理解与改动的模块.这就要在设计的时 ...
- Atitit 深入理解软件的本质 attilax总结 软件三原则"三次原则"是DRY原则和YAGNI原则的折
Atitit 深入理解软件的本质 attilax总结 软件三原则"三次原则"是DRY原则和YAGNI原则的折 1.1.1. 软件的本质:抽象 1 1.2. 软件开发的过程就是不断 ...
- 设计模式之六大原则——接口隔离原则(ISP)
设计模式之六大原则——接口隔离原则(ISP) 转载于:http://www.cnblogs.com/muzongyan/archive/2010/08/04/1792528.html 接口隔离原则 ...
- js的七大设计原则--迪米特原则
一.什么是迪米特原则 迪米特原则也叫最少知道原则,一个类应该对其他对象保持最少的了解.通俗来讲,就是一个类对自己依赖的类知道的越少越好.因为类与类之间的关系越密切,耦合度越大,当一个类发生改变时,对另 ...
- 面向对象设计原则 依赖倒置原则(Dependency Inversion Principle)
依赖倒置原则(Dependence Inversion Principle)是程序要依赖于抽象接口,不要依赖于具体实现. 简单的说就是要求对抽象进行编程,不要对实现进行编程,这样就降低了客户与实现模块 ...
- iOS----------设计模式的六大设计原则------>开放-关闭原则(OCP,Open-Close Principle)
定义 一个软件实体(如类.模块.函数)应当对扩展开放,对修改关闭. 定义解读 在项目开发的时候,都不能指望需求是确定不变化的,大部分情况下,需求是变化的.那么如何应对需求变化的情况?这就是开放-关闭原 ...
- css的核心原理分为优先级原则与继承原则两大部分
css原理:1.优先原则=>后解析的内容会覆盖之前解析的内容(所谓解析就是读取的css样式)2.继承原则=>嵌套里面的标签拥有外部标签的某些样式,子元素可以继承父元素的属性 1>优先 ...
- 设计模式之六大原则——开闭原则(OCP)
转载于: http://www.cnblogs.com/muzongyan/archive/2010/08/05/1793454.html 开闭原则(Open Closed Principle)是Ja ...
- [转]设计模式之六大原则——开闭原则(OCP)
原文地址:http://www.cnblogs.com/muzongyan/archive/2010/08/05/1793454.html 开闭原则(Open Closed Principle)是Ja ...
随机推荐
- saltstack实战4--综合练习2
Saltstack配置管理-功能模块-安装haproxy 配置管理,我们分了3层 最底层是系统初始化部分 倒数二层是功能模块,就是具体的产品的安装了 假如你的环境需要nginx,php,memcach ...
- Leetcode 338. Counting Bits
Given a non negative integer number num. For every numbers i in the range 0 ≤ i ≤ num calculate the ...
- wap测试学习
注意要点 UI元素 修改源码 物理键操作(回车.确认) 焦点 习惯性操作(前进.后退.屏幕翻转和停止) 刷新 重启服务器 重启浏览器 异常关闭 书签 cookies/session 缓存 接口 URL ...
- 解决Jquery和prototype的兼容问题
1. 引入jquery 时,将jquery库在 prototype之前引入: 2.使用时: jQuery.noConflict(); // 这个要在 之前加上 3.初始化加载 (这里我试过,可以有两 ...
- 软件包 java.util 的分层结构
概述 软件包 类 使用 树 已过时 索引 帮助 JavaTM Platform Standard Ed. 6 上一个 下一个 框架 无框架 所有类 ...
- ifndef/define/endif作用和用法
问题:ifndef/define/endif”主要目的是防止头文件的重复包含和编译,偶只知道这个概念不懂的是怎么个用法,和为什么要用它~~高手请指点一下~~谢谢~~~!!! ------------- ...
- Win7 IIS (HTTP Error 500.21 - Internal Server Error)解决
今天在测试网站的时候,在浏览器中输入http://localhost/时,发生如下错误: HTTP Error 500.21 - Internal Server Error Handler " ...
- ASP.NET下运用Memcached
对于大型网站的高并发,在ASP.NET网站下的session性能并不高,所以造成人们一种印象,大型WEB项目使用JAVA的错觉,致使很多人吐槽微 软不给力,其实这好比拉不出怪地球引力,本文介绍Memc ...
- ios开发----视图的生命周期
熟悉web开发的朋友可能对页面page的生命周期有一定的了解和认识,正如web开发中的页面生命周期一样,移动客户端开发也有它自己的生命周期.下文将说明ios开发中视图的生命周期既运行顺序. 在ios视 ...
- Sql Server 维护计划 备份覆盖
之前在设置服务器Sql Server 维护计划 备份的sql server 数据库,都是累加的,后来也没有仔细看过,后台回过头来考虑到服务器的存储空间,只好做sql server 数据 ...