来自coolshell

不过这些原则看上去都不难,但是要用好却并不那么容易。要能把这些原则用得好用得精,而不教条,我的经验如下:(我以为这是一个理论到应用的过程)

  1. 你可以先粗浅或是表面地知道这些原则。
  2. 但不要急着马上就使用。
  3. 在工作学习中观察和总结别人或自己的设计。
  4. 再回过头来了回顾一下这些原则,相信你会有一些自己的心得。
  5. 有适度地去实践一下。
  6. 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应该只能够访问以下对象中的方法:

  1. 对象O;
  2. 与O直接相关的Component Object;
  3. 由方法M创建或者实例化的对象;
  4. 作为方法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

[摘抄]一些软件设计的原则相关推荐

  1. 【学习笔记】慕课网—Java设计模式精讲 第3章 软件设计七大原则-3-6 迪米特原则(最少知道原则)...

    /** * 软件设计七大原则-迪米特原则 学习笔记 * @author cnRicky * @date 2018.11.10 */ 迪米特原则(最少知道原则) 一个对象应该对其他对象保持最少的了解.又 ...

  2. 设计模式-软件设计七大原则

    目录 综述 1.开闭原则 1.1开闭原则的定义 1.2开闭原则的作用 1.3开闭原则的实现方法 2.里氏替换原则 2.1里氏替换原则的定义 2.2里氏替换原则的作用 2.3里氏替换原则的实现方法 3. ...

  3. 什么是软件设计(OCP)原则

    文章转自什么是软件设计(OCP)原则_shanglizhangrui的专栏-CSDN博客 设计一个模块时,应当使该模块在不被修改的前提下被扩展. (1)对扩展是开放的 即当要扩展功能时,不必更改内部代 ...

  4. 【设计模式】软件设计七大原则

    做好自己 软件设计七大原则 开闭原则OCP(Open-Closed Principle) 依赖倒转原则DIP(Dependence Inversion Principle) 单一职责原则SRP(Sin ...

  5. 一些软件设计的原则【转】——本来想自己总结,结果发现个更全的,

    本文为大家介绍软件设计中的一些原则,都是经过长期经验总结出来的知识,每一个程序员都应该了解,相信对大家在进行软件设计的过程中会有很大帮助. Don't Repeat Yourself (DRY)  D ...

  6. [转]一些软件设计的原则

    设计原则是一直都在关注的领域,每次看到相关的文章都有新的体会. 下面的文章讲得比较清晰明了. 导读:酷壳网的陈皓给大家介绍了软件设计的一些原则,作者认为一个好的程序员通常由其操作技能.知识水平,经验层 ...

  7. 软件设计---KISS原则

    软件设计中有很多原则,其中KISS就是一个很典型的例子,其核心思想就是"解耦,解耦,再解耦",职责单一化,功能单一化为以后的维护和重构都会带来极大的便利. 1.KISS原则是什么? ...

  8. 【设计模式】软件设计七大原则 ( 接口隔离原则 | 代码示例 )

    文章目录 一.接口隔离原则简介 二.接口隔离原则代码示例 ( 反面示例 ) 1.接口定义 ( 接口臃肿 ) 2.实现类 1 3.实现类 2 三.接口隔离原则代码示例 ( 推荐用法 ) 1.接口 1 2 ...

  9. 【设计模式】软件设计七大原则 ( 开闭原则 )

    文章目录 一.开闭原则简介 二.开闭原则代码示例 1.商品接口 2.普通商品类 3.折扣商品类 4.测试类 一.开闭原则简介 开闭原则 : 定义 : 一个 软件实体 , 类 / 模块 / 函数 , 对 ...

最新文章

  1. harbor安装_Harbor镜像仓库搭建
  2. DataFrame关于某一列做归一化处理
  3. oracle系统user$,Oracle 系统变量函数介绍
  4. 高仿真的类-ApplicationContext
  5. java的国际化怎么用_Java有关国际化使用实例
  6. python将数据集分成训练样本和类标签
  7. 10815 - Andy's First Dictionary
  8. vivo X Fold屏幕规格揭晓:搭载2K/120Hz E5折叠屏幕
  9. 机器学习初探(手写数字识别)HOG图片
  10. URI和URL、URN的区别
  11. hibernate教程笔记2
  12. Laravel单元测试
  13. vue中图片加载不出来的问题
  14. 学计算机ps是什么,学PS电脑绘画要掌握什么呢?
  15. 神经网络算法处理器设计,神经网络是机器算法吗
  16. MPLS LDP简介-ielab
  17. java计算机毕业设计实验室耗材管理系统源程序+mysql+系统+lw文档+远程调试
  18. Rejecting mapping update to [XXx] as the final mapping would have more than 1 type: 报错
  19. PHP论坛开发技术总结
  20. 嵌入式设备的知识产权保护

热门文章

  1. 安装 | Matlab2022a下载及新功能一览
  2. SVN为什么比git更好
  3. 计算机教室内网连接不了,校园网登陆不了内网怎么办?校园网登陆不了内网的解决方法...
  4. timerpickerview使用_详解iOS App中UIPickerView滚动选择栏的添加方法
  5. 雨林木风系统md5值_微软停止Windows系列新系统开发,珍惜你的Win10吧。。。
  6. 出席全球数字经济大会 第四范式助力打造中国数字经济“北京样板”
  7. 【深度学习】百度:YOLOX和NanoDet都没我优秀!轻量型实时目标检测模型PP-PicoDet开源...
  8. 【论文解读】多视图多示例多标签的协同矩阵分解
  9. 【NLP】jieba分词-Python中文分词领域的佼佼者
  10. 深入了解数据人才 | 中国数据人才白皮书