我们爱有经验,尤其是丰富经验,包括生活经验,和工作经验。因为经验能扫除阴暗、未知和危险,能给人安全和幸福。然,什么是经验?丰富经验如何获得?最近的学习发现,原来 我们开发者社区常讨论的 「模式」 就是工作经验的一种表现。掌握某种作业模式,就是获得了某种经验。「经验」的元知识,转向了「模式」的元知识。
那什么是模式呢?我们可以从一些常见的「模式观」来看看当下的通识。
在开发者社区最流行的「模式讨论」莫过于 设计模式了。但是其实 设计模式 只是编程模式(编程经验)的一种,不代表所有。而且我发现设计模式的常识理解不够准确。这里,我们先从设计模式的一般定义开始,再经 代码模式,语用模式 等特例,尝试总结一下,什么是模式,从而了解获得编程经验的可能捷径。
Table of Contents
对象设计模式
我们先看看 设计模式的流行定义。
《设计模式》
Christopher Alexander says, “Each pattern describes a problem which occurs
over and over again in our environment, and then describes the core of the
solution to that problem《GOF》
模式 描述了 一个在我们周围发生的「问题」,以及该问题的「解决方案的关键技术」。
The design patterns in this book are descriptions of communicating objects and classes
that are customized to solve a general design problem in a particular context.《GOF》
设计模式 是 「用来指导完成某个特定设计任务」的「抽象描述」,设计任务涉及了 对象或类关系 。「设计模式」不是「设计任务」本身,而是任务设计的技术。
《JS设计模式与开发实践》
设计模式的定义是:在「面向对象软件设计」过程中针对特定问题的简洁而优雅的解决方案。
《Learning JS Design Patterns》
A pattern is a reusable solution that can be applied to commonly occurring problems in software design .
Patterns are not an exact solution. It’s important that we remember the role of a pattern is merely to provide us with a solution scheme.
设计模式 是 指能用来 指导 软件设计任务的抽象一般的解决方案,因为是抽象的,是一类,所以设计模式的理论知识,可以复用,是模板,不是具体解决方案
社区流行的设计模式观,是一个重用观(re-use),没说出了模式元知识的核心内容。
重复观( repeatable solution)和重用观(re-use)都是错误的。因为重复竟味着就是规律,规律就是知识,那所有的知识都模式!显然这个模式观没有针对性,没有针对对象设计。
代码模式
我第一次察觉出”模式” 概念是读到这本《JavaScript Patterns》,没有design字眼,然而此书台湾译版依然带有设计字眼,可见社区对模式的认识的混沌。
Patterns are solutions to common problems. 《JavaScript Patterns》
模式是 某一类问题的 解决技术。
The coding patterns are much more interesting; they are JavaScript-specific patterns and good practices related to the unique features of the language, such as the various uses of functions.
代码模式,或 「JS 模式」是指,JS的特性(例如函数作值的特性)的最佳实践,例如 functions的一些最佳使用方式。
语用模式
模式一个直观理解就是最佳实践,这一本用了一个 语用(Progmatics),表达了工具和任务之间的实践关系。很深刻。
Learning a programming language requires getting acquainted with its syntax, the set of forms and structures that make up legal programs, and semantics, the meaning or behavior of those forms. But beyond that, mastering a language requires understanding its pragmatics, the ways in which the language’s features are used to build effective programs. This latter category can be especially subtle, particularly in a language as flexible and expressive as JavaScript.《Effectvie Javascript》
学习一种编程语言需要掌握它的语法,语义,和语用。
- 语法:语法是指使用 语言构件 表达算法的合法形式;例如 语句由表达式组成;
- 语义:语言构件及其组合的 算法涵义;例如变量和运算符组合成的表达式的计算涵义;
- 语用:前二者是编程作业的基础,但有可能编出坏程序,要编出优质程序,还得有语用知识;
最后一种语用知识是非常重要的,作为一名专业的开发者丰富经验的表现,尤其对于 JavaScript这种语言特性非常强大灵活的语言来说。
这里,作者并没有定义出 语用 是什么(WHAT),只是说出 语用 的意义(WHY)——利用好语言特性写出优质程序;其实就是前面提到的 模式(代码模式)。
Good Part 模式
社区还有一种 Good Part观,例如 《JavaScript: The Good Part 》一书。在书中,作者认为早期的 JS设计有一些不良的特性,应该避免使用。其实,这里边作者没有说全,其实作者有可能偏面的把 坏程序 归结为 工具的坏特性,但是也有可能是坏程序程员训练不足,误用工具特性造成的。例如被诟病的全局变量,这个特性对是写演示性质的程序是很有用的。所以作者好坏评判是一个假设前提的。
使用好特性,避免坏特性,本身就是一个模式,可复用参考的经验。