编程模式新解
我们爱有经验,尤其是丰富经验,包括生活经验,和工作经验。因为经验能扫除阴暗、未知和危险,能给人安全和幸福。然,什么是经验?丰富经验如何获得?最近的学习发现,原来 我们开发者社区常讨论的 「模式」 就是工作经验的一种表现。掌握某种作业模式,就是获得了某种经验。「经验」的元知识,转向了「模式」的元知识。
那什么是模式呢?我们可以从一些常见的「模式观」来看看当下的通识。
在开发者社区最流行的「模式讨论」莫过于 设计模式 了。但是其实 设计模式 只是编程模式(编程经验)的一种,不代表所有。而且我发现设计模式的常识理解不够准确。这里,我们先从设计模式的一般定义开始,再经 代码模式,语用模式 等特例,尝试总结一下,什么是模式,从而了解获得编程经验的可能捷径。
对象设计模式
我们先看看 设计模式的流行定义。
《设计模式》
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设计有一些不良的特性,应该避免使用。其实,这里边作者没有说全,其实作者有可能偏面的把 坏程序 归结为 工具的坏特性,但是也有可能是坏程序程员训练不足,误用工具特性造成的。例如被诟病的全局变量,这个特性对是写演示性质的程序是很有用的。所以作者好坏评判是有一个假设前提的。
使用好特性,避免坏特性,本身就是一个模式,可复用参考的经验。
模式元知识
【模式元知识】比起【模式】更具理论性,甚至实践价值,例如就对象设计模式,我们还很少需要学全三类23种模式,但是需要精通==少量几种模式==,这需要元知识,另外其他开发任务也要有模式指导,使用模式,和发现新模式,都也需要元知识。
模式是什么
模式是什么的问题,是一个**「模式理论」研究的问题**,这是不容易的。我们首先从批判 常规设计模式观 开始,看看 “设计模式作为 模式的一种”,已经不容易被理解。可见,通用的模式本身的抽象度已经超过了一般常人能理解的水平。
从特例(设计模式)看模式涵义
先看这个头脑风暴:
1 设计模式全称 对象设计模式,只是针对「对象形式和对象关系设计」这种任务(问题)的模式经验
2 对象设计模式 的经验知识不容易理解,是因为它针对个任务本身不初级
L 工具是OOP,任务是对象形式和关系的设计,设计目标是可复用,好维护性
L 也就是说,对象设计模式是一种应用技术,是以OOP技术,和计算功能构建和分解任务知识,为基础的应用技术
3 对象设计模式技术的通俗理解:怎么用对象,多个对象关系高效高质理的组建计算功能(程序结构)
L 以 OOP的基本工具特性:分解计算功能单元,功能单元的复合(得到更复杂的想要的功能)
4 三大类对象设计模式,三大类的对象设计任务
L 创建型:程序有动态创建新功能对象的任务
E 结构型:功能的形式复合,静态结构任务
E 行为型:多个对象的协作,完成一个较大的功能,动态行为
再看这个:
O 丰富经验就是编程模式的掌握程度
L 「模式」不是「工具」,是工具的使用,模式是使用工具完成「任务」的最优规则
L 设计模式,JS模式,React 模式
L 模式是工具作业经验,HTML模式,CSS模式?
L 模式,工具,任务都是「知识」
L 工具的知识
L 工具特色和作业模式的界限 2020-11-13
E 任可具有「计算语义」的构造,都是工具,包括,变量,运算符,只是种类,粒度不同
L JS语言工具种类 2020-11-13
L 工具有计算语义,使用语法,设计哲学
E 工具的抽象层级
L 函数式编程,纯函数,函数作值,高阶函数,闭包,回调高阶模式
E OOP,计算对象,对象作值,类(带原型的对象),构造函数,单例模式,观察者模式
E 工具多种用途
L 对象是「键值对」容器 工具:包装计算功能、包装数据、组织程序结构
E 任务的知识
L 编程工具的特征是,它可用来完成编程任务
L 工具辨识,转向了编程任务的分解与辨识
E 任务的知识一般与业务相关
E 模式的知识
L 编码的两种任务,两类模式
E 凡是能正面帮助制作程序功能的(直接,例如闭包高阶,或间接,例如语法糖)都可归于模式
简结之:
- 第一,「模式」不是「工具」,是工具的使用,模式是使用工具完成「任务」的最优规则;
- 第二,模式是工具的使用,完成一项任务,所以,模式是以工具和任务的知识为基础的应用知识;
- 第三,有用的程序是由一集层次化的工具和任务组成,例如从变量到闭包,从概念设计到构建发布,所有工具任务和模式具有抽象度的;凡是指向程序目标的,无论是直接还是间接,都是任务,都有工具,都有模式;
小结
模式的理论已经初步总结出来,它是从实践中来的,如果客观,一定适用反回来解释实践,例如对 某种对象设计模式 的原理的解释。当然,我们最希望的是,它能帮助我们掌握丰富的编程经验。