美国航空航天局NASA的JavaScript编码标准规范指南

  喷气推进实验室 是 美国国家航空航天局的科研机构。 该实验室JPL开发大部分的软件是用在无人深度太空和其他行星探测的领域。 他们拥有著名的 好奇号火星探测器 和 旅行者号探测器 。已经离开太阳系25年,仍然在飞行并提供科学信息。 高水平的自动化和长期的任务导致了对软件质量的苛刻要求。 该实验室最近发布了一套神奇的开发经验: 代码的指导方针 。 因为基于Web驱动的软件要求不断增加,越来越多的关键任务委托给了JavaScript,让我们看看NASA这套适用于 JavaScript / HTML 的编码指南,能够提供更高的性能、可靠性和更美好的世界。

nasa

1. 一个函数代码的长度不超过60行,也就是对于一张标准格式的纸张,如果每行打印一条语句,一个函数的代码应该能全部可以印在一张纸上。

  这对于Javascript可以更好地分解代码,验证和维护,以及更易于理解。

 

2. 限制所有代码使用简单的控制流程结构,不使用GOTO setjmp或longjmp构造,直接或间接递归

  来自于C世界的规则会制造奇迹,我们绝对不会在JS中使用 goto或setjmp(设置寄存器方式),但是递归有什么问题吗?为什么NASA规定要避免我们早前在学校学习的简单技术呢?原因是:NASA使用静态代码分析器降低出错机会,递归降低了分析器对代码的预测,Javascript并没有这样的规则,那么为什么我们却要搞出这样的规则呢?

  • 使用合理的复杂性构造,如果你想编写可靠的代码,那么就不要编写狡猾不可靠的代码以及预测性的代码,定义编码规范并遵守它;
  • 使用代码分析器降低缺陷的机会: JSHint/JSLint/Google Closure Tools;
  • 通过监控指标维护代码库: Plato;
  • 使用 Flow/Google Closure Tools分析类型.

 

3. 初始化后不使用动态内存分配

  乍一看JavaScript自己管理内存和垃圾收集清理内存本身常常为我们解决剩下的问题,但这不是绝对正确的,通常会发生内存泄漏,被宠坏的JS程序员并没有管理内存的文化习惯,造成垃圾收集器运行时的性能下降,很难驯服,实际上,我们建议三个规则如下,前面两个适合任何项目,最后一个对于软件性能和可靠性至关重要。

  • 使用尊重的方式管理你的变量。 调整变量声明到作用域的顶部以增加其可见性;
  • 注意内存泄漏,干净的监听者和不再需要的变量。 经典的文章 ;
  • 使用 对象池 切换JavaScript到静态内存模式和可预测的垃圾收集行为(意味着没有事故性性能回归和没有锯齿模式性能问题)。

 

4. 所有的循环都必须有一个固定的上限

  正如JPL解释说,这对于静态代码分析更加有效,有助于避免无限循环,如果超过限制将返回错误,将导致系统的故障状态,当然这对于维持20年正常运行时间是有价值的,通过断言来检查是否达到限制,如果你接受使用断言来检验循环限制,你会喜欢它。

 

5. 断言代码密度应该是平均至少每个函数两个断言

  这里几句话解释一下什么是断言,它们是运行时执行的最简单的并行单元测试:

if (!c_assert(altitude > MAX_POSSIBLE_ALTITUDE) == true) {

    return ERROR;

}

  "工业统计编码的数据表明:单元测试经常在每10到100行代码中发现至少存在一个缺陷。 缺陷拦截的可能性与断言密度增加有关。"

  那是不是意味着我们将此规则更改为“编写单元测试”?不完全是,断言的特点是它们在运行时执行更接近JS这个土壤的实战特点,将单元测试和运行时根据程序状态产生的错误和错误处理结合起来。

  • 测试密度越高缺陷越少。 每个函数最少的两个测试;
  • 注意运行时系统状态的异常。 失败时生成和处理的错误。

 

6. 数据对象必须在尽可能小的作用域内申明

  这个规则背后有一个简单意图:保持数据在私有作用域范围,避免未经授权的访问,听起来一般,其实是聪明和易于理解的举动。

 

7. 非void函数返回值必须检查每个调用函数,参数有效性必须在每个函数内检查。

  指南认为这点最容易违反,因为它如此严格,意味着即使内置函数都应该验证。

 

8. 使用预处理器必须限于包含头文件和简单的宏定义。 C预处理器是一个功能强大的模糊处理工具,可以破坏代码清晰,迷惑许多基于文本的检查。

  在任何语言中使用预处理器应该是有限制的。 如果我们已经实现标准化 清洁和可靠的语法,他们就不需要了。更应该考虑:JavaScript是不断发展演进的。 可靠和快速JavaScript应该用JavaScript编写。

 

9. 指针使用应该受到限制,不超过一个层次的非关联化dereferencing 是允许的,函数指针不允许。

  这保证Javascript程序员不能得到任何引用。

 

10. 从第一天开发起,启用带警告的allcompiler编译所有代码,采取编译器最保守的设置。,所有代码必须在这种编译设置下没有任何警告。

  不囤积警告,不要推迟修复,保持代码干净和完美主义者。

 

Node.js最佳实践
Node.js编程之道
十个Node.js开发最容易犯的错误

代码评审清单