美文网首页
软件设计原则

软件设计原则

作者: liangxifeng833 | 来源:发表于2018-01-22 20:28 被阅读237次

    一. Don’t Repeat Yourself (DRY)

    当我们在两个或多个地方的时候发现一些相似的代码的时候,我们需要把他们的共性抽象出来形一个唯一的新方法,并且改变现有的地方的代码让他们以一些合适的参数调用这个新的方法

    二. Keep It Simple, Stupid (KISS)

    复杂事情简单话

    把一个事情搞复杂是一件简单的事,但要把一个复杂的事变简单,这是一件复杂的事。

    三 . Program to an interface, not an implementation

    注重接口,而不是实现,依赖接口,而不是实现。接口是抽象是稳定的,实现则是多种多样的

    四. Command-Query Separation (CQS) – 命令-查询分离原则

    • 查询:当一个方法返回一个值来回应一个问题的时候,它就具有查询的性质;
    • 命令:当一个方法要改变对象的状态的时候,它就具有命令的性质;
    • 查询方法和命令方法分开, 个干个的,类似单一职责

    五. You Ain’t Gonna Need It (YAGNI)

    这个原则简而言之为——只考虑和设计必须的功能,避免过度设计。只实现目前需要的功能,在以后您需要更多功能时,可以再进行添加。

    六. Law of Demeter – 迪米特法则(最少知识原则/不要和陌生人说话)

    如果你想让你的狗跑的话,你会对狗狗说还是对四条狗腿说?
    如果你去店里买东西,你会把钱交给店员,还是会把钱包交给店员让他自己拿?

    七. 面向对象的S.O.L.I.D 原则

    1. Single Responsibility Principle (SRP) – 职责单一原则

    • 核心的思想是:一个类,只做一件事,并把这件事做好,其只有一个引起它变化的原因
    • 单一职责,通常意味着单一的功能
    • 低耦合、高内聚在面向对象原则上的引申,将职责定义为引起变化的原因,以提高内聚性来减少引起变化的原因
    • 不要为一个模块实现过多的功能点

    2. Open/Closed Principle (OCP) – 开闭原则

    • 核心的思想是:模块是可扩展的,而不可修改的。也就是说,对扩展是开放的,而对修改是封闭的
    • 比如: 浏览器的各种插件属于这个原则的实践

    3. Liskov substitution principle (LSP) – 里氏代换原则

    • 子类必须能够替换成它们的基类
    • 开闭原则 的一个重要保证
    • 正方形不是长方形
    • 鸵鸟不是鸟
    • LSP则给了我们一个判断和设计类之间关系的基准:需不需要继承,以及怎样设计继承关系

    4. Interface Segregation Principle (ISP) – 接口隔离原则

    • 接口隔离原则意思是把功能实现在接口中,而不是类中,使用多个专门的接口比使用单一的总接口要好。

    举个例子,我们对电脑有不同的使用方式,比如:写作,通讯,看电影,打游戏,上网,编程,计算,数据等,如果我们把这些功能都声明在电脑的抽类里面,那么,我们的上网本,PC机,服务器,笔记本的实现类都要实现所有的这些接口,这就显得太复杂了。所以,我们可以把其这些功能接口隔离开来,比如:工作学习接口,编程开发接口,上网娱乐接口,计算和数据服务接口,这样,我们的不同功能的电脑就可以有所选择地继承这些接口。

    5. Dependency Inversion Principle (DIP) – 依赖倒置原则

    • 高层模块不应该依赖于低层模块的实现,而是依赖于高层抽象。

    举个例子,墙面的开关不应该依赖于电灯的开关实现,而是应该依赖于一个抽象的开关的标准接口,这样,当我们扩展程序的时候,我们的开关同样可以控制其它不同的灯,甚至不同的电器。也就是说,电灯和其它电器继承并实现我们的标准开关接口,而我们的开关产商就可不需要关于其要控制什么样的设备,只需要关心那个标准的开关标准。这就是依赖倒置原则。

    • 这就好像浏览器并不依赖于后面的web服务器,其只依赖于HTTP协议。这个原则实在是太重要了,社会的分工化,标准化都是这个设计原则的体现。

    • 举例

    相关文章

      网友评论

          本文标题:软件设计原则

          本文链接:https://www.haomeiwen.com/subject/ijxzvxtx.html