简述SOLID的面向对象的设计原则

在这篇博文中,将给大家简要介绍一下SOLID的面向对象的设计与实现的基本原则。其实这个需要自己做项目和看代码的体会,个人经验觉得还是比较有用的。

什么是SOLID

SOLID是面向对象设计与实现的时候推荐的一个基本的原则,分别是Single Responsibility Principle(单一职能原则),Open Close Principle(开放封闭原则), Liskov’s Substitution Principle (里氏替换原则),Interface Segregation Principle(接口分离原则)与Dependency Inversion Principle (依赖倒置原则)的英文首字母的大写缩写而来。接下面会简要介绍一些这些原则的基本概念,有一些是自己的理解。

单一职能原则

  • One Responsibility
    单一职能讲的是一个类,接口或者方法仅仅有一个职能,这个职能可以很大,也可以很小,但是你可以用一句话就能说明,不是大而全的。 其实设计模式中单体,或者工厂模式就体现了这一点,单体类的职能就是确保仅仅只有一个类被创建出来。而工厂模式的职能就是封装了类的创建。
  • One Reason to Change
    一个类仅仅只有一个理由去变化,当职能唯一的时候,仅仅是因为职能的变化,你的类的实现才可以发生变化。比如说工厂类,你需要创建的对象需要变化了,你的代码才需要跟着改变。

开放封闭原则

开放封闭将的是任何软件实体如类,模块(一般是动态链接库),方法,接口等应该对扩展开放,而关闭修改。具体的意思就是说,我们应该是以“增加”的方式来应对修改,举个例子:当我们要增加一个新功能的时候,有一个函数提供了类似的功能,这个时候很多人都习惯比这个函数扩展一个参数什么的,增加if-else的程序结构框架去处理这样的情况,这个做法就违背了Open -Close原则,正确的做法应该是增加一个方法来完成,有人问这样可能有很多重复代码啊? 这个应该是自己重新写一个私有方法去封装 共性的代码去解决, 以确保原来的方法保持不变。

里氏替换原则

里氏替换原则说的是任何基类都可以被子类代替而不影响相关程序模块的功能。这要求继承类(子类)不应该修改扩展或者修改基类的功能,注意,这能说的是功能,不是说不能重写某个方法,而应该是做的是相同的事情,对于函数来说,就是函数签名需要完成的事。

接口隔离原则

接口隔离原则说的是用户不应该依赖那些不需要的接口和方法。这个在实际的编程中很容易出现,比如说设计了接口A,被类B和C同时继承了,然后B需要一个新功能,而C不需要,这个时候做法不是在接口A中增加方法,应该是重新设计一个 接口D,让B继承D,而C不应该做任何的修改。

依赖倒置原则

依赖倒置原则我的理解是,高层次的模块(类)不应该依赖低层次的模块,他们都应该依赖于抽象,或者说是接口。 高层次的模块是指在类图中处于上面的模块,一般是抽象类,接口类等。低层次的模块一般是相对于高层次而言的,它继承自高层次的模块。具体可以参考http://en.wikipedia.org/wiki/Dependency_inversion_principle

在书籍阅读和代码阅读,编写后,对于面向对象,自己有下面的一些体会:

  • 要对接口编程,不要对具体的类。
  • 尽量用组合,不要用继承。
  • 如果要依赖的话,最好依赖接口,不要依赖具体的类。
  • 在编写代码时,对依赖的接口或者模块的实现不要做过多的假设,完全依赖的是函数签名。
  • 一个类或者接口的设计时,应该只有一个原因使它变化,如果有多个,考虑做拆分,这个其实和单一职能原则很像。
  • 考察自己程序或者模块可能发生变化的部分,然后用接口的形式封装它们。
  • 松耦合:模块,类或者程序见应该是松耦合的,依赖越少越好,而且需要定义清晰,设计的时候尽量考虑完全,而不要做修改,而是去做扩展。
  • 高内聚:类或者模块的内部可以紧紧联系,说的是,自己实现的部分可以相互联系的很紧,可以封装共同的私有函数,公用同样的类等等。

你可能感兴趣的:(面向对象编程)