“太空语言”JavaScript编码标准规范指南

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

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编译所有代码,采取编译器最保守的设置。,所有代码必须在这种编译设置下没有任何警告。

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

Reference: 

http://pixelscommander.com/wp-content/uploads/2014/12/P10.pdf

https://www.jdon.com/idea/js/nasa-coding-standarts-for-javascript.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/354659.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

如何在JUnit 5中替换规则

最近发布的JUnit 5(又名JUnit Lambda) Alpha版本引起了我的兴趣,在浏览文档时,我注意到规则以及跑步者和阶级规则都消失了。 根据文档,这些部分竞争的概念已被单个一致的扩展模型取代。 多年来, Frank和我…

微页面设计开发指南

一、目标实现左侧:为可用的组件列表,可拖动任一组件到中间的预览区域中间:为页面预览效果页面,选中任一组件,可在右侧进行参数配置右侧:为组件的参数配置(选中中间的组件时出现)&…

商城商品购买数量增减的完美JS效果

商城商品购买数量增减的完美JS效果 近期在开发一个地方O2O租书项目,使用ASP.NET MVC技术,其中在图书详情页,用户可以输入借阅的数量,这里使用了js来控制数量的增减和校验。 数量一定是数字 点击增减按钮的时候要能自动加1或减1 …

这款插件让你在VSCode上也能答题背单词

在VSCode上也可以在线答题了,插件市场上线了一款答题的插件,免去了去其它网站或者软件的烦恼,代码写累了,随手打开答题功能,换换脑子,或者熟悉两个单词,程序员的别样休闲时光,哈哈&a…

使用Java 8在地图上流式传输

在本文中,我将向您展示如何在标准Java映射上有效地实现Speedment Open Source流,并将Stream接口扩展为MapStream! 即使在复杂的情况下,此添加将使保持流的具体性和可读性变得更加容易。 希望这将允许您继续流式传输而不会过早收集…

如何使用python给PDF文件加水印

Python作为编程界最火的语言,能做的事几乎你能想到的它都能干,就连抢茅台都可以,还有什么不行?!Python作为脚本编程语言,可以做很多事情。使用Python,你可以轻松地给pdf加上水印。 你可以使用名…

搭建一个redis高可用系统

一、单个实例 当系统中只有一台redis运行时,一旦该redis挂了,会导致整个系统无法运行。 单个实例二、备份 由于单台redis出现单点故障,就会导致整个系统不可用,所以想到的办法自然就是备份(一般工业界认为比较安全的备…

SSH连接远程服务器,本地known_hosts文件记录了什么

今天工作时,使用ssh命令远程连接公司的本地服务器时,突然出现以下错误bash-3.2$ ssh argus192.168.200.8 WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED! IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY! Someone could be eavesdroppin…

“全人类的知识宝藏”维基百科迎来了20岁的生日!

维基百科从一个伟大的想法开始,与无数的像你像我一样的阅读者,创作者,捐赠者和粉丝经历了互联网的20年,今天让我们一起为这个属于所有互联网人的成果庆祝一次生日。值此20周年特地为它做了一个主页:https://wikimediaf…

转:智能音箱市场深度报告:怎么大家都在抢这个两亿小蛋糕?

原文链接:http://www.sohu.com/a/199335366_115978 智能音箱是今年最热的智能硬件项目之一。目前,智能音箱已经有了比较成熟的技术方案和模式思路,但消费市场似乎依然秉持着比较谨慎的态度。智能音箱市场上的主流产品都有什么思路&#xff1f…

Tailwindcss尤大神都fork了,是未来的趋势?

最近Tailwindcss频繁出现在我的视野里,从单词拼写中看,多多少少与css有点关系。近几年是JS框架大行其道,CSS方面少有新的框架出现。昨天突然看到尤大神在Github上的动态,fork了该项目,看来马上要火的节奏啊&#xff01…

JUnit 5 –架构

现在我们知道如何设置JUnit 5并使用它编写一些测试 ,下面让我们看一下。 在本文中,我们将讨论JUnit 5架构以及采用这种方式的原因。 总览 这篇文章是有关JUnit 5的系列文章的一部分: 设定 基本 建筑 条件 注射 … JUnit 4 忽略Hamcre…

前端程序员书桌上不可缺少的CSS书籍

作为前端,CSS不仅要会,而且要精通,随着各种浏览器规范参差不齐和网页交互多元化的趋势越来越复杂,前端程序员必须要将CSS基础知识打牢。由于现在的框架越来越多,导致很大一部分程序员的工作只是拿着现成的组件布局&…

nodejs 进阶:图片缩小

demo 效果: 代码: /*** Created by ZXW on 2017/10/30.*/ var fs require(fs); var gm require(gm);gm(./不饿.jpg).resize(50, 50,"!").write(./不饿1.jpg, function (err) {if (!err) console.log(done);});2017-10-30 22:10:46转载于:ht…

可能是最先出来的关于介绍使用Vue3的一本书

Vue3 release版本已发布有几个月了,不少公司都已经开始使用vue3开发项目了,市场上的主流的框架如:Vant,Element UI,Taro也都发布了支持Vue3的版本。Vue3很多的开发优势自不必再说,学习上手vue3已经成为每个…

CSGL

glShadeModel void glShadeModel(GLenum mode) GL_FLAT/【GL_SMOOTH】 着色技术选择 glClearDepth GL.glClearDepth(depth); glClearDepth:设置深度缓存的清除值 参数 depth 指定清除深度缓存时使用的深度值。 说明 本函数指定用glClear清除深度缓存时所使用的深度值…

强大的Canvas开源库Fabric.js简介与开发指南

什么是Fabric.js?Fabric.js 是一个强大且简单的Javascript HTML5 Canvas库。官网地址:http://fabricjs.com/为什么要使用Fabric.js?Canvas提供一个好的画布能力, 但是Api不够友好。绘制简单图形其实还可以, 不过做一些复杂的图形绘制, 编写一…

模拟qq斗地主-准备发牌抢地主都是农民下一轮准备

为什么要搞这样一个项目?? 1,满足自己的java网络多线程编程的欲望!因为之前一直都是搞web开发,服务器和客户端数据交流人家web服务器早就给你搞好了,比如tomcat,jetty...等等,其实之前脑子里就有…

rube3xxx_Rube GoldbergSpring整合

rube3xxxSpring Integration为集成系统所涉及的一些复杂性提供了非常好的抽象-Spring Integration从Integration的角度完美地满足了Facade的定义-简化了对复杂基础系统的访问。 为了说明这一点,请考虑一个简单的系统,该系统仅接收一条消息,然…

纯CSS实现React Logo图形,内含详细解析

以上是将要实现的效果&#xff0c;Javascript框架React的Logo图形&#xff0c;首先我们来拆解下&#xff0c;它包括三个交叉的椭圆和中间一个圆点&#xff0c;所以我们Html元素可以用以下代码实现&#xff1a;<div class"main"><div class"ellipse ell…