用函数式编程对JavaScript进行断舍离

news/2024/5/18 20:40:47

译者按: 当从业20的JavaScript老司机学会函数式编程时,他扔掉了90%的特性,也不用面向对象了,最后发现了真爱啊!!!

  • 原文: How I rediscovered my love for JavaScript after throwing 90% of it in the trash.
  • 译者: Fundebug

为了保证可读性,本文采用意译而非直译,并且对源代码进行了大量修改。另外,本文版权归原作者所有,翻译仅用于学习。

我和JavaScript

从1997年网景的Navigator 3浏览器开始就开始使用JavaScript。当时,JavaScript还只能做一些很简单的事情。我记得最酷的就是用JavaScript实现mouseover特性,在那个时候已经算得上是高科技了!当鼠标移过去之后,文本内容就神奇的改变了。因为当时都是pre-DHTML,你根本不需要隐藏或则显示DOM元素。

关于DHTML(以前的 DHTML 如今是不是也算前端?):

DHTML是Dynamic HTML的简称,就是动态的html(标准通用标记语言下的一个应用),是相对传统的静态的html而言的一种制作网页的概念。所谓动态HTML(Dynamic HTML,简称DHTML),其实并不是一门新的语言,它只是HTML、CSS和客户端脚本的一种集成,即一个页面中包括html+css+javascript(或其它客户端脚本),其中css和客户端脚本是直接在页面上写而不是链接上相关文件。

在那个时候,JavaScript的演化很慢,主要应用在表单验证。因此,不像今天这么火爆,并没有引起太多的关注。可以说只是一个锦上添花的附加物,你需要确保在浏览器禁用JavaScript之后,你的应用依然可以正常使用。再往后,框架一个接着一个出现:jQuery,Knockout, Angular, React, Vue, 等等。

同样,JavaScript也在加速演化。我们才使用ES6不久,现在人们几乎已经跳过ES7,开始讨论ES8了。

并且,我们有很多替代品,比如TypeScript,CoffeScript,ClojureScript, ELM,等等。

我们已经被太多的框架和语言所淹没,很难去跟踪和掌握所有的语言和框架。

错误路线

当JavaScript逐渐成熟,面向对象编程(OOP)的概念也渗入进来,而且我曾经很喜欢。

我开始尝试所有不同的方法来创建类,我最终也可以正确的使用继承。我对自己说:JavaScript开始真的像一个语言了!

但是,直到多年以后我发现OOP是JavaScript引入的最糟糕的一个设计!

我尝试将我对C#的理解带入到JavaScript中去。一开始充满期待,但是后来发现真的太复杂,太烧脑了。

这主要是因为JavaScript的原型继承和C#不一样,我已经习惯于每天编写类似于console.log(this)这样飘逸的代码。但是现在呢?如果我一不小心没按照规则来,那将会给我带来噩梦。私有方法和私有值必须要在名字前面加上下划线,甚至必须用闭包来保证私有性。

因此,不仅OOP导致了很多问题,同时也由于添加OOP带来了很多新的问题。

函数式编程

一开始我并不理解。我可以阅读并理解这些用函数式编写的代码,但是不知道为什么!最终,我强迫我自己去学习它。我在在线教育网站EDX免费学习了函数式语言的入门课程,然后尝试把这些技术运用到JavaScript中去。

函数式语言给了我一个全新的视角,让我从一个完全不同的方式去看待编程。

一开始会感到不自然,需要时间去适应。所有的定义都是基于函数,值不可更改,无状态。我用函数式的思维去解决问题。因为不熟悉,我花了更长的时间去学习。渐渐地,我熟练掌握了使用函数式的方法去编程。并且,我也知道所有代码这样编写的内在含义。

我的代码更加简洁了,而且容易复用。渐渐的,我以前使用的那些语言特性从代码中消失了,我的代码看上去完像是用另一个语言编写。我还在用JavaScript吗?

1. 不再使用var

我用const替代了var。通过函数式的设计,我的函数都是纯(pure)的。不会再去对一个变量进行值的变更操作,同样也是为了确保不会对其操作。

我会检查代码确保每一个var,甚至let,所有声明都使用const。

2. 没有for循环

在学习程序语言的时候,我们一开始就会学到for循环。但是自从学习了函数式编程,我将for循环都改成了使用filter, map和reduce来实现。对于那些需要一些额外计算的需求,我会使用递归或则第三方库比如lazy.js。

在此,推荐我的另外一篇专门介绍for循环博客:Rethinking JavaScript: Death of the For Loop

如今我的代码里面完全没有for循环了,如果你看到了,告诉我我会把它消除。

3. if也可以被简化

我开始停止在if里面编写大块大块的代码。我将里面的逻辑抽取出来单独放在一个函数中。这样,我们就可以将if用三元算子(a?b:c)来简化。

在此,推荐我的另外一篇专门介绍if博客:Rethinking JavaScript: The if statement

如今我的代码里面几乎没有if语句。为了方便其他开发者理解我的代码,我很少使用它。

4. 和switch说拜拜

同样,我也不喜欢用switch,而是寻找一个函数式的写法。

推荐我的博客: Rethinking JavaScript: Eliminate the switch statement for better code

我也很喜欢用Ramda的cond算子来替代swtich。

5. 不在担心this

对的,你没有听错!我们也可以完全消除this。

函数式的JavaScript可以让你完全抛弃使用烦人的this

现在只有数据和函数,甚至数据不过是函数的一种特殊表达形式,你再也不需要this了。我开始将对象理解为函数式语言中状态(state)和函数。我甚至不需要把状态或则函数和对象绑定到一起,就像OOP中那样。

我写了一篇博客专门介绍如何解耦: Functional JavaScript: Decoupling methods from their objects

面向对象的设计不是必须的

现在往回看,我发现面型对象编程带来的复杂度真的是不必要的。我可以使用函数式语言实现同样的功能,完成相同的任务。而且,代码更加轻简,因为不在需要将这些复杂的对象传来传去。只有数据和函数,而且因为函数没有和对象绑定,更加容易复用。我不在需要担心传统的原型继承带来的所有的问题,JavaScript设计的并不好。

JavaScript缺乏私有、公有、内部或则被保护这类访问控制器也不再是一个问题。访问控制器是用来解决由于引入面向对象编程而设计的。在函数式的JavaScript中,这些问题不复存在。

总结

我的代码现在看上去完全不同。它包含了很多纯函数,我将它们做成不同的ES6模块。这些函数可以被使用来构建更加复杂的函数。很大一部分函数都是很简单的一行lambda表达式。

现在我看待软件的思维也变了:输入是一个数据流,然后程序作用到该数据流上对数据进行各种操作,然后返回新的数据。

函数式设计对程序语言的影响以及无处不在,C#中的LINQ就是一个最佳的例子。同样Java 8也引入了函数式语言的特性。

版权声明:
转载时请注明作者Fundebug以及本文地址:
https://blog.fundebug.com/201...


https://dhexx.cn/news/show-255124.html

相关文章

10张图带你深入理解Docker容器和镜像

为什么80%的码农都做不了架构师?>>> 这篇文章希望能够帮助读者深入理解Docker的命令,还有容器(container)和镜像(image)之间的区别,并深入探讨容器和运行中的容器之间的区别。 当我…

xps 9360 8250U 过热死机,CPU散热解决方案,日常温度直降30度 ,从 75 度 到  45度。

戴尔2006年正式发售的第一款 XPS 笔记本,名为 XPS M1710 系列,它拥有 17 英寸全高清显示屏、Intel Core Duo(Yonah) T2400(1.83G)处理器最高主频 1830MHz二级缓存 2048KB,售价三万五,当年顶级配置的机皇,现在看着简直弱…

在博客页首添加搜索功能

把博客园的搜索设置移植到了页面顶端&#xff0c;这样让博客的搜索功能更加醒目。同时整合了“Adsense for Search” 以及“Add related keyword links”(添加相关关键字链接&#xff0c;起到搜索提示的功能&#xff09;。下面是我使用的代码&#xff1a;<script language&q…

c语言数据类型(二)

char 类型 1.char 变量 常量 char c; 定义一个char变量 c ‘a’ a字符常量 char 的本质就是一个整数&#xff0c;只有一个字节大小的整数 2.printf 输出char %c意思是输出一个字符&#xff0c;而不是一个整数 3.不看打印char转移符 \a 警报 int main() {char c \a;printf…

记一次OutputStream转InputStream

2019独角兽企业重金招聘Python工程师标准>>> 写这篇博客的原因是做的项目需要下载文件&#xff0c;后台从数据库读取数据&#xff0c;然后数据已经写入到OutputStream&#xff0c;现在需要使用ServletOutputStream进行处理&#xff0c;所以需要将OutputStream转成In…

transform的属性列表

转载于:https://www.cnblogs.com/neilHoIOS/p/4628468.html

Python Day2

2019独角兽企业重金招聘Python工程师标准>>> 学习内容 列表、元组字符串字典集合文件字符编码与转码 列表、元组 列表是常用的数据类型之一&#xff0c;通过列表可以对数据进行一系列的操作。 列表的创建&#xff1a; names [Tom, Jerry, Keith] 然后通过下标读取内…

计算机图形学08:中点BH算法绘制抛物线(100x = y^2)

作者&#xff1a;非妃是公主 专栏&#xff1a;《计算机图形学》 博客地址&#xff1a;https://blog.csdn.net/myf_666 个性签&#xff1a;顺境不惰&#xff0c;逆境不馁&#xff0c;以心制境&#xff0c;万事可成。——曾国藩 文章目录专栏推荐专栏系列文章序一、算法原理二、…

PHP7.2、PHP7.1 性能对比

原文地址&#xff1a;https://mengkang.net/1019.htmlPHP7.2 更新内容https://github.com/php/php-src/blob/php-7.2.0RC3/UPGRADING从官方给的文档中&#xff0c;我似乎没有看到关于整体性能方面的修改。 鸟哥点评 PHP7.2 相对于 PHP7.1 主要优化也是在 opcache 。服务器配置 …

【大话设计模式】——简单工厂模式

一个、概念 简单工厂模式&#xff08;Simple Factory Pattern&#xff09;它属于创建模式&#xff0c;又称静态工厂方法模式(Static FactoryMethod Pattern)。可是不属于23GOF设计模式之中的一个。简单工厂模式是由一个工厂对象决定创建出哪一种产品类的实例。 二、UML图 简单工…