JavaScript的行为驱动开发:第一部分

发布于:2021-02-12 00:00:41

0

51

0

JavaScript 驱动开发 TDD

早在2005年,当我第一次开始了解TDD时,我就迷上了–或如他们所说的“受测试感染”。至此,我已经在软件开发领域拥有十多年的经验。即使我有一些自动化测试的经验,发现TDD就像发现新世界。

为了获得所有这些好处,您必须以正确的方式应用TDD,这是棘手的部分。尽管有我的经验和奉献精神,但我花了很长时间才意识到TDD的最重要规则……

这与测试无关!

听起来令人惊讶,这是事实。TDD给我们带来了很多东西,而测试只是其中的一小部分。万一您想知道,我将在“什么是BDD?”一章中详细介绍。我要强调的主要观点是:要正确使用TDD,您将不得不将其视为一种设计技术,要考虑行为和规范,而不要考虑测试。

我并不是唯一一个很难充分利用TDD的人。在线上有很多问题,例如: 

  • 从哪里开始?

  • 测试什么,不测试什么?

  • 一次测试多少钱?

  • 什么叫测试?

  • 如何理解测试失败的原因?

然后Dan North出现并写了一篇非常有趣的文章,回答了其中一些问题。他建议我们将TDD的词汇替换为一个不专注于测试而是针对您的应用程序行为的词汇。没有误导性的测试术语,初学者可以更快地学习重要的东西。他创造了BDD一词。在其他人的帮助下,BDD逐渐发展成为今天的状态。现在,我们有了一套方法和技术,可以帮助我们进行交流并提供更好的文档编制概念。

这有助于我们编写高质量的代码并发现合理的设计。它吸引了开发人员以及商人,产品所有者和测试人员。由于它仍然是一种新兴的方法论,我很确定我们将来会看到它的继续增长。

 近年来,JavaScript及其生态系统有了很大的改善。它已经成为网络上最重要的语言-网络语言。使用Java,Ruby,PHP或服务器上的其他任何代码都没关系。在客户端上,您需要使用JavaScript!尽管该语言有许多出色的BDD框架可用,但我每天仍然面对大量不良JavaScript代码。虽然BDD和TDD逐渐成为服务器端的常规功能,但客户端的自适应速率却比我希望的慢得多。也许缺乏集中和专业的文档是一个影响因素。 问题: “ Java和JavaScript有什么区别?” 答: “它们与汽车和地毯有很多共同点。”  

JavaScript不是玩具语言

JS以“玩具”语言而闻名,无法与Java,C ++和其他流行语言在同一个领域竞争。大多数开发人员花了几年时间才意识到JS的重要性和出色之处。像道格拉斯·克罗克福德(Douglas Crockford)这样的人为了让人们了解JavaScript 1的力量而进行了长期的战斗。JS具有一些非常有用的语言功能,例如原型设计,函数表达和闭包。遗憾的是,布兰登·艾希(Brandon Eich)仅有十天的时间来实现JS的第一个版本,因此他犯了一些错误,而这些错误今天对JS仍然是个问题,但是您不能真正责怪他。

这些问题大多数都是句法性质的,并且会在将来的JS版本中得到改善。ECMAScript5标准(ES5)已经改善了这种情况。下一个版本将是ECMAScript6 aka Harmony,它将解决更多当前问题。

 您可以查看 http://kangax.github.com/es5-compat-table/ 以查看哪些浏览器版本支持ECMAScript5。  

基本工具

console.log 如前所述,您确实应该使用开发工具来获取可用于调试代码的console.log命令。

var a = [1, 2, 3]; console.log(a);

与警报框相比,它提供了更好的反馈,您不必连续关闭那些烦人的框。 

jsHint / jsLint

为了尽早获得有关可能的错误和不良样式的反馈,您应该使用棉绒工具。Lint工具会寻找您的编码风格中可能存在的问题,例如if语句(清单1.2)中的赋值,全局变量和无法访问的代码。

<span>if (a = 3) //should have been if (a == 3) or (a === 3)</span>

如果皮棉工具发现任何问题,您会得到警告,并且可以在问题仍然很小的情况下及早解决问题。

有两种可用的出色工具: jsLint(www.jslint.com)和 jsHint(www.jshint.com)。您使用哪一个只是一个偏好问题。某些IDE(例如JetBrains Webstorm3)直接在编辑器中支持它们。

您还应该禁用其中一些棉绒检查,因为某些BDD框架使用了棉绒工具认为危险的编码样式。 

严格模式

另一个很棒的检查辅助工具是 ES5的严格模式 。您可以通过提供以下字符串将现代浏览器置于严格模式下:

"use strict";

较旧的浏览器将忽略它-它只是一个字符串!但是现代浏览器会将js引擎切换为严格模式。在这种模式下,浏览器报告在以下代码中发现的各种其他错误–就像lint工具一样。您将在开发周期的早期就发现怪异的错误。

JavaScript功能正常

JS是一种功能语言,而它是一种面向对象的语言。它可能缺少像Haskell这样的更现代的功能语言的某些功能,但它从功能世界继承了一些真正有用的属性。

我认为JS最有用的功能特性是 函数表达式 和 闭包。让我们从第一个开始。

创建函数表达式

在JS函数中,头等公民。这意味着您可以像使用其他任何值一样使用它们。您可以将它们绑定到变量,将它们用作其他函数调用的参数,甚至从函数返回它们。

也许您习惯于以这种方式定义函数:

function greetMe() { return 'Hello' }

但这实际上几乎只是“语法糖”:

var greetMe = function() { return 'Hello' };

该行定义了一个函数值,并将其分配给greetMe变量。现在greetMe包含函数-更确切地说,它是绑定到函数的变量名称greetMe。您可以通过以下方式进行验证:

alert(greetMe);

alert命令需要greetMe中函数的字符串表示形式。因此,它调用反编译器,该反编译器以字符串形式返回greetMe的原始实现。现在Alert可以在其框中打印字符串。

使用函数表达式

JS 通过在函数名称后面加括号“()”来区分调用函数 和 函数作为值 。

JavaScript的基础库中甚至还有一些示例。考虑一下 Array的排序方法 ;sort默认情况下会进行词法排序。因此,以下表达式

['Brandon', 'James', 'Alan'].sort()returns this array:   ['Alan', 'Brandon', 'James']

但是下一个表达式

[4, 1, 2, 3, 31, 10].sort()

返回此结果:

[1, 10, 2, 3, 31, 4]

这可能不是您想要的。即使您想要数值,它也会使用词汇排序。如果没有功能分解,JS库团队将不得不为各种订单变体编写各种排序方法。

为了避免这种情况,您要做的就是提供一个通过比较两个值来定义排序顺序的函数。Sort期望一个函数接受两个参数,并根据它们之间的关系返回-1、1或0。例如,可以通过以下方式进行数字排序:

function numericalOrder(a, b) {   if (a < b) {return -1};   if (a > b) {return 1};   return 0;   }     [4, 1, 2, 3, 31, 10].sort(numericalOrder)   //returns [1, 2, 3, 4, 10, 31]

排序算法与顺序逻辑分开。如果您需要其他订购,只需编写一个新的订购功能。您不必自己编写任何排序逻辑(例如quicksort或hashsort)。

我曾经写过一份俱乐部的申请书。其中一项功能是列出俱乐部成员。特殊要求是俱乐部主席应始终列在首位。一个简单的事情:

function memberOrder(a, b) {   if (a == 'Chris Clubchief') return -1;   if (b == 'Chris Clubchief') return 1;   return a > b;   }

现在我们有:

['Brandon', 'Chris Clubchief', 'James', 'Alan'].sort(memberOrder)

这将产生:

["Chris Clubchief", "Alan", "Brandon", "James"]

未完待续,敬请期待JavaScript的行为驱动开发:第二部分。