Pattern Matching 的意义

一个语言特性往往具备多种 API 表现形式,理解特性比硬记 API 更有助于我们掌握一门新语言。Swift 作为现代编程语言的集大成者,具备很多优秀的特性来帮助开发者快速高效的编写代码,Pattern Matching 就是其中之一。

程序员 vs 编程语言

我们所写的代码,或者说一个 App 所具备的功能,最终都是程序员和编程语言共同作用的成果。我们使用某种编程语言写代码的时候,会受语言设计者所制定的各种规则制约,这些制约背后都隐含着数十年行业经验的积累,和设计者高明的设计技巧。理解这些规则所带来的好处和设计值的良苦用心,能在大大小小的方面,让我们的代码更加可靠和稳定。

前段时间,「Clean Code」的作者,Bob 大叔,在博客里吐槽了 Swift 这类新型编程语言可能会将开发者带入「Dark Path」。文章举了不少例子,大意是说以 Swift 为代表的新语言正在尝试替开发者做更多的事情, 编程语言做的越多,开发者自然就做的越少,看上去是件好事,毕竟开发者更容易犯错,但 Bob 大叔认为规则是死的,人是活的,程序员应该在代码的编写中承担更大的责任,而且有些生硬的规则会反过来会给代码的表达产生负面效果。这个观点显得有些偏激,也引起了不小的争论,对错姑且不论,对于我们开发者来说,至少要搞明白 Swift 这类新语言所包含的规则背后的意义,才能既合理的使用规则又不被规则所制,写出漂亮的代码。

Bob 大叔博客地址:http://blog.cleancoder.com

Pattern Matching

Pattern Matching 早在 Scala, Haskell 这些语言中就存在,作为编程语言的特性,旨在替程序员分担一部分的工作。顾名思义,Pattern Matching 可以替我们解决类型匹配的的问题,这简单的一句话,在一些不同的场景下,有着不同的表现形式,表现形式一多,又会让简单的概念理解起来变得复杂。对于复杂概念的理解,我们最好能用一句话做高度精炼简洁的概括,以不变应万变。

Pattern Matching 简单来说,就是编程语言替我们程序员节省了一件事,这件事可以用两个单词来描述:Check 和 Extract。

Check 是指检查条件是否满足,类型是否匹配。这么说有些抽象,我们可以把 Check 想象成一个函数,这个函数接收两个参数,参数一是源数据,参数二是目标数据,返回值是一个 Bool 值,Bool 值表示两个参数之间的某种关系是否成立,至于这个关系具体指什么,就因场景而异了。我们可以用如下一个函数来表达:

func check(targetData: [Type1], sourceData: [Type2]) -> Bool  {
    //check relation, return true or false.
}

源数据和目标数据可以是不同的类型,只要他们之间满足某种关系,关系的定义取决于 check 函数内部的实现。系统默认替我们实现了一些关系,也允许我们通过操作符重载的方式自定义关系。看几个简单的例子:

var result: String? = getResult()
switch result {
case .none:
    print("no result")
case let r:
    print("result is \(r)")
}

上面是 Pattern Matching 在 switch 当中的应用。源数据是 result,type 为 optional。目标数据是 .none 和 r,type 为具体的 String。二者之间的关系是个等式关系,这个关系默认由系统提供。这个关系说白了,无非是一个 if,else 语句,来判断 result 到底是 .none 还是具体的值。

当然我们也可以直接写 if,else 来替代 Pattern Matching,在 Objective C 中,没有 Pattern Matching,我们确实是用 if,else 来做 check 的。但明显使用 Pattern Matching 我们可以写更少的代码,同时让代码更容易阅读,表达更清晰,这也是 Swift 中引入 Pattern Matching 的原意所在。

Pattern Matching 除了做 check 之外,很多时候也被用来做 extract。Extract 是提取数据的意思,Pattern Matching 配合其他关键字就可以完成数据的 extract。比如上面的代码中,switch 配合 case let r: 就将 result 中所包含的值提取到了 r 中。严格来说第一步还是 check,check 关系满足之后,再做 extract。

Pattern Matching 虽然表现形式繁多,但最后都会落实到 check 和 extract 这两个单词之上,大家可以尝试去发掘下其他 Swift 语境下 Pattern Matching 是如何做 check 和 extract 的。

深入了解过 Pattern Matching 的同学应该知道,其实 Pattern Matching 本质上就是一个特殊的操作符:~=。我们可以把这个操作符等同于我们上面提到的 check 函数。当我们针对自己定义的数据类型做 ~= 的操作符重载之后,就可以实现自定义规则的 Pattern Matching 了。

再换句话来描述 Pattern Matching:检查两个数据之间是否满足某种关系。

Pattern Matching 并不是 Swift 所独有,但在 Swift 语境下,主要是通过 case 这个关键字来体现。在 Objective C 的语境下,case 是和 switch 搭配使用,和 if 的含义接近,而在 Swift 中 case 关键字具备了 Pattern Matching 的含义之后,case 关键字可以在更多的场景下来使用,可以和更多其他的关键字配合,以延伸 Pattern Matching 的使用场景。除了 switch case 之外,我们还可以用 for case,while case,if case,guard case,无论关键字如何搭配,其本意都是在做 Pattern Matching。这也是为什么初次接触 Swift 会感觉语法太过灵活且不易掌握的原因。

总结

希望这篇文章能帮助一些朋友简单点理解 Pattern Matching 的意义所在。另一个目的是介绍一个学习小技巧:对于新知识点的学习,记 API 或者编程语言的各种表现形式,不如去理解其背后的设计思想。不过总结和提炼思想,往往需要花费更多的时间和精力,回报是对知识的掌握更深刻和牢固。

欢迎关注公众号:MrPeakTech

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,547评论 6 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,399评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,428评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,599评论 1 274
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,612评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,577评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,941评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,603评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,852评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,605评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,693评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,375评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,955评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,936评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,172评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,970评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,414评论 2 342

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,585评论 18 139
  • title: "Swift 中枚举高级用法及实践"date: 2015-11-20tags: [APPVENTUR...
    guoshengboy阅读 2,553评论 0 2
  • 2014年的苹果全球开发者大会(WWDC),当Craig Federighi向全世界宣布“We have new ...
    yeshenlong520阅读 2,253评论 0 9
  • (欣欣向荣) 20161125 学习力践行 Day2 今天给小朋友提及妈妈的彭彭老师,布置了要妈妈背诗的作业,问他...
    欣欣向荣1212阅读 103评论 0 0
  • 毕业两年多了,工作也两年有余,期间有过喜悦有过悲伤;有过升职有过处罚;有过加薪有过失望;有过诱惑也有过背叛。唯...
    紫雨寒烟阅读 332评论 0 1