软件设计的质、门、道

模式

提起设计模式,免不了要提一提那位离经叛道的剑桥建筑系学生—— Christopher Alexander。他的著作《建筑的永恒之道》以建筑学为名,探讨了这个宇宙最本质的哲学问题(GoF 也打得一手好广告)。

这个世界的事物有其固有的结构,而其形态却是千变万化,我们无法全盘掌握。但万变不离其宗,我们可以通过理解这些变化背后更加深层稳定的实质来应对各种变化。

Alexander 提出了一个理解事物结构的新视角——模式。何谓模式,可以通过 Alexander 的原话来理解——

每个模式描述了一个在我们周围不断重复发生的问题及该问题解决方案的核心。这样,你就能一次又一次的使用该方案而不必做重复工作。

每个模式都是一个由三部分组成的规则,它表达的是某一环境、一个问题以及解决问题的方案之间的关系。

作为世界中的元素,每一个模式都是这三者之间的关系:某一环境、此环境中反复出现的某个因素系统以及使用这些因素能够自我协调的某种空间配置。

模式可以帮助我们辨认或设计事物。以软件领域的数据库为例,我们之所以认为某一个中间件是“数据库”,并不是因为它的名称、规模、生产商,而是因为其最本质的特征:数据的读、写、存储。无论其表现形式为何,如缓存、关系型数据库、文档型数据库、文件系统等,只要其满足数据库的本质特征(符合数据库的模式),我们都可以认为它是数据库。而一个数据库的稳定结构就是读接口、写接口、存储媒介以及它们之间的关系,其它的任何扩展优化都是围绕着这个结构和关系进行的。而这些结构中的每一部分又由更小的结构和关系组成。当我们实现了一个符合这种模式的中间件,也可以宣称我们实现了一个数据库。

《建筑的永恒之道》提出质、门、道三个基本概念:无名之质、有形之门、永恒之道。在其之上建立的设计原则,可以适用于任何工程学科的设计,包括软件工程。

无名之质:软件的特性

Alexander 说,“存在着一个极为重要的特质,它是人、城市、建筑或荒野的生命与精神的根本准则。这种特质客观明确,但却无法命名”。嗯,这一特质是绝对客观的、精确的,以至于无法用人类的词汇来命名。所以 Alexander 只能用 7 个词语来描绘这一特质:、、、、、、,这 7 个词语单独任何一个都无法描述这一特质,但它们结合起来可以无限接近。这一特质给人以满足感,并最终改善人类的生活,Alexander 认为设计师须不断努力,以创造出符合这一特质的建筑结构。

可以结合老子(注意发音)的话来理解一下,“无名天地之始,有名万物之母”。无名,世界的一切尚未被领会、尚未被命名,世界处于一种原初的混沌状态,即天地之始;有名,事物一旦被领会、被命名,就标志着万物归位,世界开启,即万物之母。

从“无名”到“有名”实际上是『人脑』界定一个客观实体的过程。注意,这里的『人脑』并非特指人类的大脑,可能是任何形式的“观察者”。老子认为,实体无法与其环境分割。要界定一个实体,需要给它定一个界限,实体只有被界定后,才会在『人脑』中产生概念,这就是“名”。而实体一旦被界定,也就不再是原始的那个实体了。且依“界限”或“观察者”不同,其“名”可能也会不同。

这里颇有一种微观粒子的量子行为“波粒二象性”的意味。Alexander 的“无名之质”,就是老子的“无名”。当我们试图以『人脑』来理解无名之质时,就会将其局限在不同的场景中,此时这个无名的“质”就变成了可以定义的“质”,如:整体性、完备性、和谐性、舒适性、可变性、持久性、开放性、可塑性、可居住性等。

在软件工程中,我们可以将、、、、、、、、、、等特性理解为软件的“质”,和 Alexander 的建筑学观点一样,软件的设计制作也须不断努力,以达成和完善这些特性为目标。另外,软件的特性不仅仅存在于软件本身,也存在于软件和周边环境——包括其它软硬件、计算机外部世界、用户等——的相互作用中。这种相互作用类似于中国传统的“风水学”,软件只有与其环境达成一个和谐的整体,其特性才会得到更好的保障。

有形之门:软件的模式

“为达到无名特质,我们接着必须建立一种有活力的模式语言作为大门。”如果无名之质是以哲学角度定义了“什么是建筑”,那有形之门则涉及了“如何建筑”的理论体系。

建筑物各个部分根据一定的关系连接,构成了一定的关系网,这个关系网限定了这种建筑的风格、功能等特性。如天安门以木结构为框架,榫卯结合,承重与围护结构分离,屋顶一条正脊和四条垂脊形成一个垂直的三角形墙面,这种建筑结构就形成了中国古代“歇山式”的建筑风格。

不独是建筑领域,人们生活中的一系列事物及活动都有其特定的模式,如诗词的平仄规则形成其特有的韵律;音乐的主副歌、节奏快慢的安排形成悦耳的旋律;文章图文内容的排版形成特定的文体;日常的衣食住行、娱乐、工作等遵循一定的逻辑或日程安排。“每一个模式就是一个规则,它描述了产生它所限定的整体,你所必须要做的事情。”也即是说,模式描述的并非实体,而是实体之间的关系。

具体到软件工程中,我们可以将有形之门中的“门”理解为实现软件特性的法门、途径、工具,而“形”则是这些法门、途径、工具的组织形式。《庄子疏》:“气聚而有其形,气散而归于无形也。”这里的“气”也就是“门”,而将“气”聚成的“形”就是模式。根据不同的尺度,可以将“气”或“门”理解为代码语句;类和对象;组件或中间件。相应的,代码语句组成的“形”就是代码模式,类和对象组成的“形”就是设计模式,组件或中间件组成的“形”就是架构模式。

永恒之道:软件的设计

Alexander 主张:“在自然界中,一个实体总是作为一个整体出生、发展的。”这像极了老子“道生一,一生二,二生三,三生万物”的道家思想。一个软件的设计通常也遵循这一原则:从整体架构出发,通过对功能、性能的划分,形成各个模块,再将模块细化为类、方法等。好的软件通常蕴含着好的模式,要设计好的软件需要发现、收集、创造好的模式,而这一过程也即是软件设计的永恒之道。

《建筑的永恒之道》讲述的其实就是“自然规律”。利用一系列自然界固有的规则,使人造建筑对内达到平衡,对外散发生命力。而这些“自然界固有的规则”放到软件工程领域就是那一条条我们耳熟能详的设计原则。当我们遵循利用这些原则,组合拼装,形成某种特定的前所未见的关系,而这种关系能用来解决某类特定问题,也就意味着一个新的设计模式的诞生。

开-闭原则(Open-Closed Principle, OCP)

里氏代换原则(Liskov Substitution Principle, LSP)

依赖倒置原则(Dependency Inversion Principle, DIP)

接口隔离原则(Interface Segregation Principle, ISP)

单一职责原则(Single Responsibility Principle, SRP)

合成/聚合复用原则(Composite/Aggregate Reuse Principle, CARP)

迪米特法则(Law of Demeter, LoD)

上述是面向对象设计的常见原则,事实上用于指导软件设计的原则还有很多,如 KISS、DRY、CQS、YAGNI 等。这些原则都是软件行业长期经验总结出来的知识,每个软件开发人员都应该了解,但也不能教条主义,使用时要考虑实际情况。

总结

简而言之,在软件工程领域,模式就是用于解决某类具有特定抽象特点的问题的套路。同时,借助模式的定义,软件开发人员之间也可以更方便的沟通,比如我说“建立一种对象与对象之间的关系,当一个对象状态发生变化时自动通知其它对象,其它对象做出相应的反应”。你可能会一头雾水或者想抽我,但当我说“观察者模式”时,你立即就能知道我说的是什么。

设计模式被引入软件工程领域已经有几十年,GoF 的设计模式最早成书于 1994 年,如今已知的设计模式早已不止那 23 种,编程语言又经过了这么多年的发展,一些模式已被融入到编程语言本身,甚至有更好的替代方式。我们应该将设计模式当做一种指导思想,而不是解决问题的具体方案。学习、使用过程中举一反三,灵活变通,避免教条。在利用设计模式弥补设计不足的同时,也要避免过度设计或模式痴迷,在软件的迭代开发阶段以功能实现为主,当软件迭代到一定程度时,再使用合适的方法对代码进行重构,此时便可以从一个相对宏观的视角观察总结代码,从而演化出合适的模式。

本文章系列名为《设计模式注疏》,试图解释并以示例的形式实现已知的设计模式,包括 GoF 最早阐述的 23 种模式,以及其它的一些具有代表性的模式。既是“注疏”,便是在前人的基础上总结、思考、梳理,所谓登得高望得远,感谢前人的工作。

本文链接:http://kweny.io/design-patterns-research-overview/

版权声明:除非特别说明,本站内容均为原创,转载请注明出处:K栈-《[设计模式注疏] 软件设计的质、门、道》。

  • 发表于:
  • 原文链接http://kuaibao.qq.com/s/20180430G02XTL00?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 yunjia_community@tencent.com 删除。

扫码关注云+社区

领取腾讯云代金券