[摘抄]一些软件设计的原则
来自coolshell
不过这些原则看上去都不难,但是要用好却并不那么容易。要能把这些原则用得好用得精,而不教条,我的经验如下:(我以为这是一个理论到应用的过程)
- 你可以先粗浅或是表面地知道这些原则。
- 但不要急着马上就使用。
- 在工作学习中观察和总结别人或自己的设计。
- 再回过头来了回顾一下这些原则,相信你会有一些自己的心得。
- 有适度地去实践一下。
- Goto第 3步。
You Ain’t Gonna Need It (YAGNI)
这个原则简而言之为——只考虑和设计必须的功能,避免过度设计。只实现目前需要的功能,在以后您需要更多功能时,可以再进行添加。
- 如无必要,勿增复杂性。
- 软件开发先是一场沟通博弈。
以前本站有一篇关于过度重构的文章,这个示例就是这个原则的反例。而,WebSphere的设计者就表示过他过度设计了这个产品。我们的程序员或是架构师在设计系统的时候,会考虑很多扩展性的东西,导致在架构与设计方面使用了大量折衷,最后导致项目失败。这是个令人感到讽刺的教训,因为本来希望尽可能延长项目的生命周期,结果反而缩短了生命周期。
参考:http://en.wikipedia.org/wiki/You_Ain%27t_Gonna_Need_It
Law of Demeter – 迪米特法则
迪米特法则(Law of Demeter),又称“最少知识原则”(Principle of Least Knowledge),其来源于1987年荷兰大学的一个叫做Demeter的项目。Craig Larman把Law of Demeter又称作“不要和陌生人说话”。在《程序员修炼之道》中讲LoD的那一章叫作“解耦合与迪米特法则”。关于迪米特法则有一些很形象的比喻:
- 如果你想让你的狗跑的话,你会对狗狗说还是对四条狗腿说?
- 如果你去店里买东西,你会把钱交给店员,还是会把钱包交给店员让他自己拿?
和狗的四肢说话?让店员自己从钱包里拿钱?这听起来有点荒唐,不过在我们的代码里这几乎是见怪不怪的事情了。
对于LoD,正式的表述如下:
对于对象 ‘O’ 中一个方法’M',M应该只能够访问以下对象中的方法:
- 对象O;
- 与O直接相关的Component Object;
- 由方法M创建或者实例化的对象;
- 作为方法M的参数的对象。
在《Clean Code》一书中,有一段Apache framework中的一段违反了LoD的代码:
final String outputDir = ctxt.getOptions().getScratchDir().getAbsolutePath();
这么长的一串对其它对象的细节,以及细节的细节,细节的细节的细节……的调用,增加了耦合,使得代码结构复杂、僵化,难以扩展和维护。
在《重构》一书中的代码的环味道中有一种叫做“Feature Envy”(依恋情结),形象的描述了一种违反了LoC的情况。Feature Envy就是说一个对象对其它对象的内容更有兴趣,也就是说老是羡慕别的对象的成员、结构或者功能,大老远的调用人家的东西。这样的结构显然是不合理的。 我们的程序应该写得比较“害羞”。不能像前面例子中的那个不把自己当外人的店员一样,拿过客人的钱包自己把钱拿出来。“害羞”的程序只和自己最近的朋友交 谈。这种情况下应该调整程序的结构,让那个对象自己拥有它羡慕的feature,或者使用合理的设计模式(例如Facade和Mediator)。
参考:http://en.wikipedia.org/wiki/Principle_of_Least_Knowledge
转载于:https://www.cnblogs.com/taoxu0903/archive/2011/04/27/2030767.html
[摘抄]一些软件设计的原则相关推荐
- 【学习笔记】慕课网—Java设计模式精讲 第3章 软件设计七大原则-3-6 迪米特原则(最少知道原则)...
/** * 软件设计七大原则-迪米特原则 学习笔记 * @author cnRicky * @date 2018.11.10 */ 迪米特原则(最少知道原则) 一个对象应该对其他对象保持最少的了解.又 ...
- 设计模式-软件设计七大原则
目录 综述 1.开闭原则 1.1开闭原则的定义 1.2开闭原则的作用 1.3开闭原则的实现方法 2.里氏替换原则 2.1里氏替换原则的定义 2.2里氏替换原则的作用 2.3里氏替换原则的实现方法 3. ...
- 什么是软件设计(OCP)原则
文章转自什么是软件设计(OCP)原则_shanglizhangrui的专栏-CSDN博客 设计一个模块时,应当使该模块在不被修改的前提下被扩展. (1)对扩展是开放的 即当要扩展功能时,不必更改内部代 ...
- 【设计模式】软件设计七大原则
做好自己 软件设计七大原则 开闭原则OCP(Open-Closed Principle) 依赖倒转原则DIP(Dependence Inversion Principle) 单一职责原则SRP(Sin ...
- 一些软件设计的原则【转】——本来想自己总结,结果发现个更全的,
本文为大家介绍软件设计中的一些原则,都是经过长期经验总结出来的知识,每一个程序员都应该了解,相信对大家在进行软件设计的过程中会有很大帮助. Don't Repeat Yourself (DRY) D ...
- [转]一些软件设计的原则
设计原则是一直都在关注的领域,每次看到相关的文章都有新的体会. 下面的文章讲得比较清晰明了. 导读:酷壳网的陈皓给大家介绍了软件设计的一些原则,作者认为一个好的程序员通常由其操作技能.知识水平,经验层 ...
- 软件设计---KISS原则
软件设计中有很多原则,其中KISS就是一个很典型的例子,其核心思想就是"解耦,解耦,再解耦",职责单一化,功能单一化为以后的维护和重构都会带来极大的便利. 1.KISS原则是什么? ...
- 【设计模式】软件设计七大原则 ( 接口隔离原则 | 代码示例 )
文章目录 一.接口隔离原则简介 二.接口隔离原则代码示例 ( 反面示例 ) 1.接口定义 ( 接口臃肿 ) 2.实现类 1 3.实现类 2 三.接口隔离原则代码示例 ( 推荐用法 ) 1.接口 1 2 ...
- 【设计模式】软件设计七大原则 ( 开闭原则 )
文章目录 一.开闭原则简介 二.开闭原则代码示例 1.商品接口 2.普通商品类 3.折扣商品类 4.测试类 一.开闭原则简介 开闭原则 : 定义 : 一个 软件实体 , 类 / 模块 / 函数 , 对 ...
最新文章
- harbor安装_Harbor镜像仓库搭建
- DataFrame关于某一列做归一化处理
- oracle系统user$,Oracle 系统变量函数介绍
- 高仿真的类-ApplicationContext
- java的国际化怎么用_Java有关国际化使用实例
- python将数据集分成训练样本和类标签
- 10815 - Andy's First Dictionary
- vivo X Fold屏幕规格揭晓:搭载2K/120Hz E5折叠屏幕
- 机器学习初探(手写数字识别)HOG图片
- URI和URL、URN的区别
- hibernate教程笔记2
- Laravel单元测试
- vue中图片加载不出来的问题
- 学计算机ps是什么,学PS电脑绘画要掌握什么呢?
- 神经网络算法处理器设计,神经网络是机器算法吗
- MPLS LDP简介-ielab
- java计算机毕业设计实验室耗材管理系统源程序+mysql+系统+lw文档+远程调试
- Rejecting mapping update to [XXx] as the final mapping would have more than 1 type: 报错
- PHP论坛开发技术总结
- 嵌入式设备的知识产权保护
热门文章
- 安装 | Matlab2022a下载及新功能一览
- SVN为什么比git更好
- 计算机教室内网连接不了,校园网登陆不了内网怎么办?校园网登陆不了内网的解决方法...
- timerpickerview使用_详解iOS App中UIPickerView滚动选择栏的添加方法
- 雨林木风系统md5值_微软停止Windows系列新系统开发,珍惜你的Win10吧。。。
- 出席全球数字经济大会 第四范式助力打造中国数字经济“北京样板”
- 【深度学习】百度:YOLOX和NanoDet都没我优秀!轻量型实时目标检测模型PP-PicoDet开源...
- 【论文解读】多视图多示例多标签的协同矩阵分解
- 【NLP】jieba分词-Python中文分词领域的佼佼者
- 深入了解数据人才 | 中国数据人才白皮书