OOD 软件设计原则总结

OOD 是什么

​ OOP指的是面向对象编程的基本原则和核心思路。在这里,OOP可以比作英语基础语法,这些语法教你如何用单词构造有意义且正确的句子,OOP教你在代码中构造类,并在类里封装属性和方法,同时构造他们之间的层次关系。

​ 如果你想就某个主题写一本书,如学习OOD,你知道如何把一个主题分为几个子主题。你需要为这些题目写几章内容,也需要在这些章节中写前言,简介,例子和其他段落。 你需要为它写个整体框架,并学习一些很好的写作技巧以便读者能更容易明白你要说的内容。这就是整体规划。在软件开发中,OOD是整体思路。

OOD目标:

  • 面向对象
  • 复用
  • 能以最小的代价满足变化
  • 不用改变现有代码满足扩展

S = 单一职责原则 Single Responsibility Principle

“并不是因为你能,你就应该做”。为什么?因为长远来看它会带来很多管理问题。

从面向对象角度解释为:”引起类变化的因素永远不要多于一个。”或者说”一个类有且只有一个职责”。

这个原则是说,如果你的类有多于一个原因会导致它变化(或者多于一个职责),你需依据将它们的职责把这个类拆分为多个类。

应用到方法级别,让每个方法只做某一项工作。那样允许你复用方法,并且一旦出现变化,你能购以修改最少的代码满足变化。

O = 开放闭合原则 Opened Closed Principle

“软件实体(类,模块,函数等等)应当对扩展开放,对修改闭合。”

通俗来讲,它意味着你应当能在不修改类的前提下扩展一个类的行为。就好像我不需要改变我的身体而可以穿上衣服。

抽象是关键,你抽象的东西是你系统的核心内容,如果你抽象的好,很可能在扩展功能时它不需要任何修改(就像服务是一个抽象概念)。如果在实现里定义了抽象的东西(比如IIS服务器实现的服务),代码要尽可能以抽象(服务)为依据。这会允许你扩展抽象事物,定义一个新的实现(如Apache服务器)而不需要修改任何客户端代码。

L = Liscov替换原则 Liscov Substitution Principle

这个原则意思是:”子类型必须能够替换它们基类型。”

或者换个说法:”使用基类引用的函数必须能使用继承类的对象而不必知道它。”

如果没有LSP,类继承就会混乱;如果子类作为一个参数传递给方法,将会出现未知行为;

如果没有LSP,适用与基类的单元测试将不能成功用于测试子类;

I = 接口隔离原则 Interface Segregation Principle

“客户端不应该被迫依赖于它们不用的接口。”

以便外部能够知道这些类有哪些可用的功能,客户端代码也能根据接口来设计.现在,如果接口太大,包含很多暴露的方法,在外界看来会很混乱.接口包含太多的方法也使其可用性降低,像这种包含了无用方法的”胖接口”会增加类之间的耦合.如果一个类想实现该接口,那么它需要实现所有的方法,尽管有些对它来说可能完全没用.所以说这么做会在系统中引入不必要的复杂度,降低可维护性或鲁棒性.

D = 依赖倒置原则 Dependency Inversion Principle

它的意思是:高层模块不应该依赖底层模块,两者都应该依赖其抽象

相比直接依赖于引擎或车轮,汽车应依赖于某些抽象的有规格的引擎或车轮,以便于如果任何引擎或车轮符合抽象,那么它们都能组合到汽车中,汽车也能跑动。

违反DIP:

使用低级类会破环高级代码;

当低级类变化时需要很多时间和代价来修改高级代码;

产生低复用的代码;

总结

设计模式只是对一些经常出现的场景的一些通用设计建议。这些灵感主要来自于面向对象原则。你可以把设计模式看作”框架”,把OOD原则看作”规范”.