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原则
转自:http://blog.csdn.net/hukeab/article/details/2944675 保障可维护性的主要诀窍是遵循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 ...
随机推荐
- Oracle EBS的BIP报表中显示特殊字体
http://oracleseeker.com/2009/08/25/font_mapping_setup_for_special_character_print_in_oracle_ebs_bip/ ...
- 设计模式之美:Decorator(装饰)
索引 别名 意图 结构 参与者 适用性 缺点 效果 相关模式 实现 实现方式(一):Decorator 对象的接口必须与它所装饰的 Component 的接口保持一致. 实现方式(二):省略抽象的 D ...
- 配置Hadoop开发环境(Eclipse)
参考博文: http://blog.csdn.net/zythy/article/details/17397153 http://www.tuicool.com/articles/AjUZrq 注意事 ...
- [ACM_水题] ZOJ 3714 [Java Beans 环中连续m个数最大值]
There are N little kids sitting in a circle, each of them are carrying some java beans in their hand ...
- 从配置sublimeClang插件中学到的
1.不害怕失败的关键在于要事先为失败准备补救措施.2.人们害怕内部结构复杂的东西出错,并以自己缺乏对内部结构的认识为理由而放弃查错.其实某些情况下根本无需对内部结构有多么深入的认识,只需从外部观察就够 ...
- JProfiler使用详细教程学习笔记
JProfiler学习笔记 推荐文章:JProfiler 入门教程 一.安装JProfiler 从http://www.ej-technologies.com/下载5.1.2并申请 ...
- Atitit.基于dsl的methodinvoker
Atitit.基于dsl的methodinvoker V2 new dyn invoke V3 plan Meth chain Prj cms methd_invok.bat rem a sta ...
- paip.语义分析--单字词形容词表180个
paip.语义分析--单字词形容词表180个 INSERT INTO t (word) SELECT DISTINCT word FROM `word_main` where tsisin is ...
- 好消息!Html5游戏和动画的福音
今年基本都淡出了cocos2d-js的开发,更多集中在普通H5应用上,还有自己的Fanvas组件(http://code.tencent.com/),做canvas动画. 不过,最近回头一看WebGL ...
- Revit API 楼板开洞
start [Transaction(TransactionMode.Manual)] [Regeneration(RegenerationOption.Manual)] , , ) * / , - ...