如何正确的学习设计模式


一、编程初期遇到的问题

初学编程时,写的代码基本上都编程作业,ACM之类的,代码量一般都不多,几百行,少有上千行。所以,初读设计模式相关书籍时,只是觉得很厉害,并没有切实的体会到使用设计模式带来的好处。随着写的程序代码量逐渐增多,发现代码的逻辑越来越混乱,实现的功能BUG也越来越多。

在编程的过程中,也接触到了很多优秀的代码库,比如:OGRE(Open-source Graphics Rendering Engines),一个优秀同时也是开源的3D图形图像渲染引擎。在学习使用的过程中,发现其代码逻辑清晰,便于阅读。对比自己写的代码和OGRE的代码,发现OGRE的代码中使用了很多的设计模式。所有就简单的认为:

使用设计模式就能让代码组织更加简单,让代码的逻辑也更加清晰明了,同时大大的提高了代码的可读性,降低了程序出BUG的几率。

二、对设计模式错误的认识

有了上面的结论,认为只要学会了所有的设计模式,就能够提高编程的能力。但是在背完所有的设计模式后发现:

  • 不知道什么时候该用设计模式。 设计模式确实很好,但是还是也不知道什么时候该用设计模式,因为平时的编程中不用设计模式,功能也能实现出来。
  • 套用了设计模式后代码质量也没提升。 即使在编程的过程中,刻意的使用了一些设计模式,也没体会到设计模式带来的好处,更没有体会到想象中代码质量会立竿见影的提高。

伴随着对设计模式使用的疑问,阅读了更多的书籍。当读到《重构:改善既有代码的设计》这本书时,按照书中的指导,重构了已有的代码,发现修改后的代码,阅读起来更加的容易,代码逻辑也比修改之前更加清晰。再对比修改前后的代码,发现:

  • 如果有多个地方都需要完成相同的功能,应该把代码封装成一个单独的函数,而不是复制粘贴。 因为复制粘贴后,代码多了,改起来容易漏,也就容易出问题了,同时代码也变得难读。
  • 如果一个函数或者一个类的代码有很多,通常更容易出BUG。 如果一个函数或者一个类里面的代码有很多的话,读起来逻辑复杂,做的事情也多,就老是容易出问题。

其他的细节还有很多。比如,如果注释都说不清楚一段代码在干什么,那么这段代码常常更容易出问题。

再次读OGRE的源代码时就发现,整个源代码在这些细节上都做的很好。比如:一个函数只做一件事,而且从函数的名字里就能知道具体做的什么。而源代码中使用的设计模式更是巧妙的让一个复杂的功能变得简单好理解。

三、认识软件工程

阅读书籍过程中也多次接触到了软件工程这个术语,但是一直不是很明白软件工程具体是做什么的,直到读到了《敏捷软件开发》这本书。软件工程是一门研究用工程化方法构建和维护有效的、实用的和高质量的软件的学科。而《敏捷软件开发》这本书正是讲述如何实践软件工程的经典巨著。理解一下,软件工程就是一门学习研究写出高质量软件(代码)的学科。而《敏捷软件开发》则是介绍具体用某种方法来实现写出高质量软件目的的书。

《敏捷软件开发》这本书中提出了敏捷设计这一方法,并将其定义为:

敏捷设计是一个持续的应用原则、模式以及实现来改进软件的结构和可读性的过程。它是一个过程,不是一个事件。

它认为,只要在编写代码实现软件时,遵守一些软件开发原则和模式,那么就能够提高代码的质量。

四、了解敏捷开发的原则

《敏捷软件开发》着重介绍并解释了5种软件开发原则。分别是:

  1. 单一职责原则(SRP):就一个类而言,应该仅有一个引起它变化的原因。
  2. 开放-封闭原则(OCP):软件实体(类、模块、函数等等)应该是可以扩展的,但是不可修改的。
  3. 里氏替换原则(LSP):子类型(subtype)必须能够替换掉它们的基类型(base type)。
  4. 依赖倒置原则(DIP):高层模块不应该依赖于低层模块。二者都应该依赖于抽象。抽象不应该依赖于细节。细节应该依赖于抽象。
  5. 接口隔离原则(ISP):不应该强迫客户依赖于它们不用的方法。

与其说是原则,不如说是标准。因为它们告诉了我们一个标准:应该把代码设计成一个什么样子,满足什么条件,有什么特征,但是并没有说应该如何编写代码。

此时,再回过头阅读OGRE等优秀的代码库时才明白,这些代码库优秀的原因之一是它们遵循了良好的软件开发原则,而使用设计模式则是让代码遵循这些软件开发原则的方法。这也是初学设计模式时,生搬硬套设计模式并没有改善代码质量的根本原因。因为根本就不知道应该把代码改成什么样,需要满足什么要求。结果就是把劣质的代码换一种方式写出来而已。

所以,我们能够得出一个结论,那就是:

优秀的软件由高质量的代码编写而成,而遵从软件开发原则是代码成为高质量代码的条件之一,设计模式只是让代码遵从开发原则的方法。

五、正确的学习设计模式

最后,如何正确的学习设计模式呢?

  1. 发现自己写的代码越来越复杂,BUG越来越多。
  2. 寻求提高代码质量的方法。
  3. 学习软件工程。认识到别人代码质量高的原因之一是因为别人遵循了良好软件开发原则。
  4. 开始真正的学习并运用设计模式。
  5. 最后,明白了什么时候应该怎么用设计模式,更清楚了软件工程的重要性。

文章作者: Kiba Amor
版权声明: 本博客所有文章除特別声明外,均采用 CC BY-NC-ND 4.0 许可协议。转载请注明来源 Kiba Amor !
  目录