Day 03: 面对 Design Pattern 该有的知识

Design Patterns(设计模式)的起点

一切都源自於 Erich Gamma、Richard Helm、Ralph Johnson、John Vlissides("Gang of Four", GOF, 四人帮)於 1994 年出版的书:「Design Patterns: Elements of Reusable Object-Oriented Software」,书中讨论:

描述对特定问题精简优雅的解决方案,关於追求更高的软件再利用性与弹性,以简明易用的形式表达。

短短几行到尽 Design Patterns 的功能。

在书中,作者提及受到建筑家 Christopher Alexander 的 A Pattern Language 启发,想要捕抓既有系统运用的模式,将其抽丝剥茧後,将每个情境下需要的模式记录下来。透过学习这些模式,人们可以更容易地在设计复杂的程序时,避免让系统走向不容易维护、扩充的局面,毕竟,在软件的世界里「变动」才是常态,不易扩充将耗费更多的时间好同时满足新、旧需求。

我个人的理解,学习模式後理解在不同情境下,如何设计出具有着优点的程序,同时,能够缩小缺点的影响,换句话说,试着从大局观思考程序在完成时的「样貌」,什麽才是好的结果?试着将这套想法运用在建筑学,那冷气发明前,各地区的房子因为气候的不同在设计上有不同的巧思,就是因应不同情境下完成的样貌。

Design Patterns 出版的时空背景

书中的范例主要使用 C++,部分段落使用 Smalltalk。这时我产生了一个疑惑,为什麽要使用 Smalltalk?以现在的眼光来看,使用 Java 或是 C# 来学习物件导向会是更舒服的选择。

所以有必要了解书本出版时,目前主流语言的情况。

  • C++
    • 诞生於1985年。
    • 1994年到2021年之间,推出六个稳定版,分别在 1998(C++98)、2003(C++03)、2011(C++11)、2014(C++14)、2017(C++17) 以及 2020(C++20)。
  • Java
    • 抱歉,还没出生,Java 诞生於1995年5月23日。
  • C#
    • 抱歉,还没出生,C# 诞生於2000年。
  • JavaScript
    • 抱歉,还没出生,Java 诞生於1995年12月4日。
  • Python
    • 诞生於1991年。
  • Ruby
    • 抱歉,还没出生,Ruby 诞生於1995年12月。

从上面的清单,可以明白当时最稳定、具有生产力的物件导向语言,非 C++ 莫属。

相较於现代,该书可能有的不适?

随着时代演进,部分模式的概念、实作将会出现在语言的新标准内,当人们需要使用相关模式时,不用自己制作轮子,直接使用内建的函式或类别即可。最经典的便是 Iterator 模式,Java 已经有相似概念的内建类别(CollectionIterator)。

另一点是语言会发布新的标准,修补当下语言的缺陷。 C++ 已经经历六次的改版,与 1994 年的 C++ 差很多,有些作法肯定与当时 C++ 的缺陷有关。最新版本的语言是否要完全运用呢?个人持保留态度。

所以,语言有缺陷罗?

启发自一篇优文:设计模式其实是程序语言的缺陷?

不要僵化地使用 Design Patterns 固有的解法,而是理解需求,在使用设计模式时,一并考虑程序语言的特性因事制宜。

对於这段深感认同,1994 年出版的书籍,肯定有一些语言限制导致开发上必须要使用特定的解来避开。假如使用不同的语言,一定要好好理解语言的特性,了解差异後,再试着将 Design Patterns 的精神表现出来。

拿网路游戏的经验,不同的武器有专属的熟练度,该武器熟练度不够的话,攻击、使用招式时可能出现失误。唯有提高熟练度才能百分之百地使用该招式。

後续的影响

对於特定的系统,开发出应对各种情况的处理手段。例如 Concurrency pattern 便是用来处理多执行绪的各种情况。

书中的组成

三大类、共 23 种模式:

  • Creational patterns - 攸关物件的生成程序
    • Abstract factory
    • Builder
    • Factory method
    • Prototype
    • Singleton
  • Structural patterns - 处理类别或物件的合成问题
    • Adapter
    • Bridge
    • Composite
    • Decorator
    • Facade
    • Flyweight
    • Proxy
  • Behavioural patterns - 处理类别或物件之间的互动方式及责任分配
    • Chain of responsibility
    • Command
    • Interpreter
    • Iterator
    • Mediator
    • Memento
    • Observer
    • State
    • Strategy
    • Template method
    • Visitor

之後将依序介绍各种模式。


<<:  从 IT 技术面细说 Search Console 的 27 组数字 KPI (18) :结构化资料(其他)

>>:  Day11-"一维阵列练习"

[Day 23] placeholder

写在前面 placeholder for test placeholder for test pla...

[Day01] - 旅途开始前的茶室闲聊

去年宝哥在 Modern WEB 中介绍过 Angular 有时会发生版本不相容的 issue , ...

[Java Day17] 4.5. 多载

教材网址 https://coding104.blogspot.com/2021/06/java-o...

用 Python 畅玩 Line bot - 07:Audio message

这次想要介绍的部分是 Audio message,它跟 Image message 一样可以透过li...

[Day 9] Reactive Programming - Backpressure

前言 大部分介绍Reactive Programming都一定会提到Backpressure,可能放...