TypeScript 中的设计模式
在软件工程中,软件设计模式是指针对特定软件设计场景下常见问题的通用可复用解决方案。它并非可以直接转化为源代码或机器代码的最终设计,而是一种描述或模板,用于指导如何解决问题,并可应用于多种不同的场景。
大家好,我最近在研究面向对象编程design patterns,但感觉很难掌握。
后来我意识到,这可能是因为我主要使用的编程语言是 JavaScript,它是一种函数式编程语言。
虽然 JavaScript 在 ES6 更新中引入了类,但我个人一直没怎么用过。现在我终于转用 TypeScript 了,所以很想学习一下面向对象编程。
简而言之,学习的第一步Design Patterns是理解Object Oriented Programming。以下是一小段摘录,它让我意识到其中Object的含义Object Oriented Programming,我认为这将是我下一个系列文章“TypeScript中的设计模式”的绝佳开端。( GitHub repo link at the bottom of the article )
假设你是一名会议讲师。你班上的学员在你课后还要参加另一节课,但他们不知道下一节课的地点。你的职责之一就是确保每个人都知道如何前往下一节课的教室。
如果采用结构化编程方法,你可能会这样做:
为此需要以下步骤:
我很怀疑你会采取这种做法。
我怀疑你真的会采用这种方法。你很可能会把从这间教室到其他教室的路线图贴出来,然后告诉班里的每个人:“我已经把接下来几节课的教室位置以及其他教室的位置都贴在教室后面了。请根据这些位置图去你们的下一节课教室。” 你希望每个人都知道下一节课是什么,能够从路线图上找到自己要去的教室,然后按照路线图前往教室。
第一种方法——向所有人下达明确指示——需要你格外注意很多细节。除了你之外,没有人需要对任何事情负责。你会疯掉的!
在第二种情况下,你给出一般性指示,然后期望每个人都能自己想办法完成任务。
最大的区别在于责任的转移。第一种情况下,你要对所有事情负责;第二种情况下,学生要对自己的行为负责。两种情况下,都需要落实同样的事情,但组织方式却截然不同。
这将产生什么影响?
为了了解这种职责重组的效果,让我们看看当提出一些新要求时会发生什么。
假设我现在被告知要给协助会议的研究生一些特殊指示。比如,他们可能需要在参加下一节课之前收集课程评价并送到会议办公室。如果是第一种情况,我需要修改控制程序来区分研究生和本科生,然后再给研究生一些特殊指示。我可能需要对这个程序进行相当大的修改。
然而,在第二种情况下——即人们需要对自己负责的情况下,我只需要为研究生编写一套额外的流程。控制程序仍然只会说“去上下一节课”。每个人都只需按照适合自己的指示去做即可。
这对控制程序来说是一个显著的区别。一种情况下,每当出现需要遵守特殊指示的新学生群体时,程序都必须进行修改。而另一种情况下,新学生群体则需要对自己的行为负责。
导致这种情况发生的因素有三个
:
面向对象范式以对象为核心概念。一切都围绕对象展开。我编写的代码是围绕对象而非函数组织的。
使用对象的优势在于,我可以定义能够自我管理的事物。
对象本身就知道自己的类型。对象中的数据使其了解自身的状态,而对象中的代码则使其能够正常运行(即执行其应执行的操作)。
| 此对象 | 负责 |
|---|---|
| 学生 |
|
| 课堂 | 拥有位置 |
| 指路人 | 给定两个教室,请给出从一个教室到另一个教室的路线。 |
在这种情况下,对象是通过分析问题域中的实体来识别的。我通过观察这些实体需要做什么来确定每个对象的职责(或方法)。这与通过查找需求中的名词来查找对象、通过查找动词来查找方法的方法一致,这种方法虽然局限性较大,但却是一个不错的起点。
理解物体本质的最佳方式,是将其视为具有责任的存在。一个好的设计原则是,物体应该对自己负责,并且这些责任应该被清晰地定义。这就是为什么我说学生物品的职责之一就是知道如何从一个教室走到另一个教室。
使用面向对象的方法编写“前往下一个教室”示例程序要简单得多。程序代码如下所示:
学期 |
定义 |
|---|---|
抽象类 |
抽象类定义了一组概念相似的类的方法和共同属性。抽象类永远不会被实例化。 |
属性 |
与对象关联的数据(也称为数据成员)。 |
班级 |
对象的蓝图——定义了该类型对象的方法和数据。 |
构造函数 |
创建对象时调用的特殊方法。 |
封装 |
任何形式的隐藏。对象封装了自身的数据。抽象类封装了其派生的具体类。 |
派生类 |
从超类衍生而来的类。它包含超类的所有属性和方法,但也可能包含其他属性或不同的方法实现。 |
毁灭者 |
对象删除时调用的特殊方法。 |
功能分解 |
一种将问题分解成越来越小的功能的分析方法。 |
遗产 |
类专门化的方式,用于将派生类与其抽象联系起来。 |
实例 |
类中的特定对象。 |
实例化 |
创建类实例的过程。成员可以是类的数据或方法。 |
方法 |
与对象关联的函数。 |
目的 |
具有职责的实体。一个特殊的、独立的容器,既包含数据,也包含操作这些数据的方法。对象的数据受到保护,免受外部对象的访问。 |
多态性 |
相关对象能够实现其类型特有的方法。 |
超级级 |
其他类都继承自该类。它包含所有派生类将使用(并可能重写)的属性和方法的主定义。 |
这是我开始维护的 GitHub 代码库,记录了我学习设计模式的经验。如果能有人帮忙完善问题模板之类的东西就太好了,因为我在这方面没什么经验。
注:本文的唯一目的是提高人们对这本书的认识,并可能指出一些自学程序员不了解的概念。
这是本书的节选,作者Design Patterns Explained是Alan Shalloway……James R. Trott
祝你编程愉快 :D。