如何编写高扩展且可维护的 JavaScript系列一:”狂野西部“症

4 年前

具备可扩展性和可维护性的 JavaScript 代码介绍

这是本系列文章中的第一节,包含了如何编写高扩展性和可维护性 JavaScript 代码的内容。优美的 JavaScript 应用设计、构建、组织,以及松散耦合对下列几个方面都至关重要:

  • 性能
  • 功能
  • 扩展性
  • 可用性
  • 可复用性
  • 可维护性
  • 可持续性
  • 可延续性
  • 效率

软件应用程序通常被地分解成许多层,或者说是许多级,当有许多物理机器涉及其中时。一个传统的四层模型可能由表现层、服务层、业务逻辑层、数据层构成。

在客户端,JavaScript 应用程序趋向于遵从一些 MV* 模式的框架。也就是说,以上被提及的层在客户端仍然非常适用,并且当使用 Node.js 作为服务端语言,编写全栈式 JavaScript 应用时,十分相关。

横切关注点和耦合性

当设计大规模 JavaScript 应用程序时考虑横切关注点和耦合性是非常重要的。横切关注点并非针对于特定的层,通常被许多层所需要。面向方面程序设计(AOP)就是一个被用于强调横切关注点(也被称为“方面”)的范例。一个很棒的介绍面向方面程序设计应用于 JavaScript 的文章可以查看这里

一些横切关注点的例子包括差错处理、校验、证明、授权、缓冲以及日志。关于处理横切关注点的方法,一种是使用上面提到的 AOP 方式,或者一个更简单的策略,专注于创建可重用、关注特定功能、可以跨层使用的代码模块。这一方式的缺点在于依赖模块清楚“知道”横切的接口,并因此在某种程度上横切变得耦合了。

模块与组件的耦合性应该被尽可能的降低,来最大程度的提升可重用性、可扩展性、可续性、可维护性。事件驱动的使用,例如 Pub/Sub 就是一个减少关注点与模块之间耦合的可靠方法。

业内专家例如 Addy Osmani 和 Nicholas Zakas 争论道:每个模块都应该独立存在并且出故障和(或)在不影响应用的情况下被移除。每个模块应该都是可以与实现相同接口或者事件驱动行为的其他模块可交换的,同时也不会破坏应用程序。

“狂野西部”症

以我的经验,经典的服务端应用通常被给予了非常审慎且恰当的待遇,相对于合适的应用设计和架构。另一方面,在这一点上重度 JavaScript 应用通常被深深的遗忘了。

JavaScript是一种松散类型的动态语言,这就使得有多数方法可以完成既定的目标。因此,JavaScript 代码建立在使用有点“狂野西部”的方法来组织和编写的基础之上。相反地,总的来说,强类型和静态编译的经典框架例,如C#/.NET,都是典型的使用越来越多的常规方法来组织层、模块、组件、类和代码。

在这两种情况下,开发者通常会编写出迥然不同的代码来解决已确定方向的问题领域(或者实现一种新的功能),但比较于客户端开发中对应的强类型语言,似乎 JavaScript 结构和实现可以更加的丰富。

总结

这篇文章是接下来的系列中的第一篇。由于已经有很多文章,可以详细地回顾各类代码的实现和语法,所以这个系列将主要关注优美的架构的概念和应用于创建高扩展性和维护性的 JavaScript 应用程序的策略。在这个系列的讨论中也会说明存在于应用程序模块中的横切关注点和松散耦合性。

利用模块和恰当的命名空间来设计、组织、实现可维护性和可扩展性的 JavaScript 应用程序是一个很好的起点。可以说,有一种更好的来实现一个模块框架的方法是基于一种规范,例如 AMD(异步模块定义),CommonJS,或者即将到来的 ECMAScript 6 Harmony 中本地模块的提议。这个系列的第二部分将详细阐述这些方法和它们潜在的优点。目标在于“拯救狂野西部症状”,并且确保大范围的 JavaScript 应用程序更加接地气,规范,良好的运作。

头晕目眩了吧!请继续关注更多! 注:Addy Osmani 和 Nicholas Zakas 的博客是两个绝佳的资源,对于 JavaScript 应用的架构,模式以及最佳实践。我强烈建议去看他们的博客。

Addy Osmani: addyosmani.com/blog

Nicholas Zakas: nczonline.net

章节

原文:How to Write Highly Scalable and Maintainable JavaScript

0
推荐阅读