聊聊Node.js 的哲学思想

管理员账号

2018-06-15

**

每个平台都有它自己的哲学:大众普遍接受的一套原理和准则,影响平台演化的一种做事思想,以及应用程序该如何开发与设计。这些原则中的有些原则源于技术本身,有些是被它的生态系统激活了,有些是社区中的种种趋势,以及一些其他的不同的意识形态的演变。在Node.js 中,一些基本原则直接来自于它的创造者——Ryan Dahl 和其他为核心库做出过贡献的人,有些来自于社区中的魅力人物,还有些则是从JavaScript 中继承而来或受到UNIX 哲学的影响。

这些原则都不是强加的,它们总是遵循常识的。不管怎样,当我们在设计程序的过程中需要灵感来源的时候,它们被证明是非常有用的。

小核心

Node.js 自身核心库建立在几个原则的基础上。其中之一是具有功能的最小集合,其余的留给所谓的用户平台(或用户空间),模块的生态系统存在于核心库之外。这一原则对Node.js文化有巨大的影响,因为它给社区提供了自由,我们在用户模块范围内,使用广泛的解决方案来试验和快速迭代,而不是受制于建立在严格控制和稳定核心库基础上缓慢发展的解决方案。保持核心功能的最小集合,不仅利于可维护性,而且对于整个生态系统的进化也有积极的文化影响。

小模块

Node.js 使用模块的概念作为构建程序代码结构的基本方式。它是一个构建块,用于创建应用程序和复用库,复用库又叫包(一个包也经常被称为一个模块,通常情况下,它有一个单一的模块作为入口点)。在Node.js 中,一个最重要的原则是设计小模块,这不仅指代码的大小,更是指范围的大小。

这一原则源于UNIX 哲学,特别是它的两个准则,如下:

“小即是美”

“让一个程序做好一件事”

Node.js 把这些概念提升到了一个新的高度。在NPM(官方的软件包管理器)的帮助下,Node.js 可以帮助解决依赖地狱问题,其通过确保每一个安装包有自己单独的一套依赖集合,从而使程序依赖很多包而不产生冲突。事实上,这种Node 方式需要极高水平的可复用性,即应用程序由大量小而好的集中的依赖关系组成。虽然这在其他平台被认为是不切实际的,甚至是完全不可行的,但在Node.js 中这种做法是被鼓励的。结果就是,经常可见到NPM 包只有不到100 行代码或仅暴露出一个单独的方法。

除了在可复用性方面的明显优势,小模块也可以被认为:

容易理解和使用

测试和维护简单

完美与浏览器共享

把更小和更集中的模块,甚至最小的代码块,授权给所有人来分享或复用,这是把Don’tRepeat Yourself (DRY) 原则发挥到了一个新的水平。

小接触面

除了体积和范围小,Node.js 模块通常也具有只暴露出最小的一组功能的特性。这样做的主要优点是增加了API 的可用性,意味着API 的使用变得更清晰,较少暴露出错误的使用。大多数时候,一个组件的用户感兴趣的其实只是一组非常有限和集中的功能,而不需要扩展功能或挖掘到更深的层次。

在Node.js 中,定义模块一种非常普遍的模式是只输出一个功能,比如一个方法或者一个构造函数,而让拓展部分或次要特性成为输出方法或构造函数的属性。这有助于用户识别什么是重要的,什么是次要的。在Node.js 中,不难找到只输出一个功能的模块,毫无疑问,它提供了一个单一的、无比清晰的切入点。

许多Node.js 模块都有这样一个特点,即创建它们是为了直接使用而不是扩展。通过禁止任何扩展的可能性来锁定一个模块的内部结构,这可能听起来很不灵活,但却具有减少用例、简化实现、维护简单及提高可用性的优势。

简单和实用

你是否听说过Keep It Simple, Stupid (KISS) 原则或者以下名言:

Simplicity is the ultimate sophistication(简单是复杂的最高境界)。

——达芬奇

著名计算机科学家Richard P.Gabriel,创造了术语“更糟的也是更好的”来描述模块。由此,更少和更简单的功能是一个很好的软件设计选择。在他的文章The Rise of “Worse is Better” 中讲到:

设计必须是简单的,无论是实现还是接口。更重要的是实现要比接口更简单。

简单是设计中最重要的考虑因素。

设计简单而非完美的、功能齐全的软件,是一个很好的实践。有几个原因:实现更简单;允许用较少的资源进行更快的传输;更容易适应、维护和理解。由于这些因素而培育出了一些社区成果,同时这也促进软件本身的发展和改进。

在Node.js 中,强大的JavaScript 也支持该原则。事实上该原则并不罕见,我们可以看到简单的函数、闭包和对象正在取代复杂的类层次结构。纯面向对象的设计往往试图使用计算机系统的数学术语复制现实世界,不考虑缺陷和现实世界本身的复杂性。然而事实是,软件总是和现实相似,我们先努力去做一些带有合理复杂性但能很快起作用的工作,这样可能会获得更多的成功;而不是想着创造近乎完美的软件,付出巨大的努力和使用大量的代码去维护。

在《node.js设计模式(第2版)》一书中,我们将多次看到这个原则。我们将看到一个简单、实用的方法(大部分时间)为什么胜过一个纯粹的、完美的设计。

读者评论

相关专题

相关博文