中文字幕一区二区人妻电影,亚洲av无码一区二区乱子伦as ,亚洲精品无码永久在线观看,亚洲成aⅴ人片久青草影院按摩,亚洲黑人巨大videos

JavaScript的行為驅(qū)動(dòng)開(kāi)發(fā):第一部分

發(fā)布于:2021-02-12 00:00:41

0

63

0

JavaScript 驅(qū)動(dòng)開(kāi)發(fā) TDD

早在2005年,當(dāng)我第一次開(kāi)始了解TDD時(shí),我就迷上了–或如他們所說(shuō)的“受測(cè)試感染”。至此,我已經(jīng)在軟件開(kāi)發(fā)領(lǐng)域擁有十多年的經(jīng)驗(yàn)。即使我有一些自動(dòng)化測(cè)試的經(jīng)驗(yàn),發(fā)現(xiàn)TDD就像發(fā)現(xiàn)新世界。

為了獲得所有這些好處,您必須以正確的方式應(yīng)用TDD,這是棘手的部分。盡管有我的經(jīng)驗(yàn)和奉獻(xiàn)精神,但我花了很長(zhǎng)時(shí)間才意識(shí)到TDD的最重要規(guī)則……

這與測(cè)試無(wú)關(guān)!

聽(tīng)起來(lái)令人驚訝,這是事實(shí)。TDD給我們帶來(lái)了很多東西,而測(cè)試只是其中的一小部分。萬(wàn)一您想知道,我將在“什么是BDD?”一章中詳細(xì)介紹。我要強(qiáng)調(diào)的主要觀點(diǎn)是:要正確使用TDD,您將不得不將其視為一種設(shè)計(jì)技術(shù),要考慮行為和規(guī)范,而不要考慮測(cè)試。

我并不是唯一一個(gè)很難充分利用TDD的人。在線上有很多問(wèn)題,例如: 

  • 從哪里開(kāi)始?

  • 測(cè)試什么,不測(cè)試什么?

  • 一次測(cè)試多少錢(qián)?

  • 什么叫測(cè)試?

  • 如何理解測(cè)試失敗的原因?

然后Dan North出現(xiàn)并寫(xiě)了一篇非常有趣的文章,回答了其中一些問(wèn)題。他建議我們將TDD的詞匯替換為一個(gè)不專(zhuān)注于測(cè)試而是針對(duì)您的應(yīng)用程序行為的詞匯。沒(méi)有誤導(dǎo)性的測(cè)試術(shù)語(yǔ),初學(xué)者可以更快地學(xué)習(xí)重要的東西。他創(chuàng)造了BDD一詞。在其他人的幫助下,BDD逐漸發(fā)展成為今天的狀態(tài)。現(xiàn)在,我們有了一套方法和技術(shù),可以幫助我們進(jìn)行交流并提供更好的文檔編制概念。

這有助于我們編寫(xiě)高質(zhì)量的代碼并發(fā)現(xiàn)合理的設(shè)計(jì)。它吸引了開(kāi)發(fā)人員以及商人,產(chǎn)品所有者和測(cè)試人員。由于它仍然是一種新興的方法論,我很確定我們將來(lái)會(huì)看到它的繼續(xù)增長(zhǎng)。

 近年來(lái),JavaScript及其生態(tài)系統(tǒng)有了很大的改善。它已經(jīng)成為網(wǎng)絡(luò)上最重要的語(yǔ)言-網(wǎng)絡(luò)語(yǔ)言。使用Java,Ruby,PHP或服務(wù)器上的其他任何代碼都沒(méi)關(guān)系。在客戶端上,您需要使用JavaScript!盡管該語(yǔ)言有許多出色的BDD框架可用,但我每天仍然面對(duì)大量不良JavaScript代碼。雖然BDD和TDD逐漸成為服務(wù)器端的常規(guī)功能,但客戶端的自適應(yīng)速率卻比我希望的慢得多。也許缺乏集中和專(zhuān)業(yè)的文檔是一個(gè)影響因素。 問(wèn)題: “ Java和JavaScript有什么區(qū)別?” 答: “它們與汽車(chē)和地毯有很多共同點(diǎn)。”  

JavaScript不是玩具語(yǔ)言

JS以“玩具”語(yǔ)言而聞名,無(wú)法與Java,C ++和其他流行語(yǔ)言在同一個(gè)領(lǐng)域競(jìng)爭(zhēng)。大多數(shù)開(kāi)發(fā)人員花了幾年時(shí)間才意識(shí)到JS的重要性和出色之處。像道格拉斯·克羅克福德(Douglas Crockford)這樣的人為了讓人們了解JavaScript 1的力量而進(jìn)行了長(zhǎng)期的戰(zhàn)斗。JS具有一些非常有用的語(yǔ)言功能,例如原型設(shè)計(jì),函數(shù)表達(dá)和閉包。遺憾的是,布蘭登·艾希(Brandon Eich)僅有十天的時(shí)間來(lái)實(shí)現(xiàn)JS的第一個(gè)版本,因此他犯了一些錯(cuò)誤,而這些錯(cuò)誤今天對(duì)JS仍然是個(gè)問(wèn)題,但是您不能真正責(zé)怪他。

這些問(wèn)題大多數(shù)都是句法性質(zhì)的,并且會(huì)在將來(lái)的JS版本中得到改善。ECMAScript5標(biāo)準(zhǔn)(ES5)已經(jīng)改善了這種情況。下一個(gè)版本將是ECMAScript6 aka Harmony,它將解決更多當(dāng)前問(wèn)題。

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

基本工具

console.log 如前所述,您確實(shí)應(yīng)該使用開(kāi)發(fā)工具來(lái)獲取可用于調(diào)試代碼的console.log命令。

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

與警報(bào)框相比,它提供了更好的反饋,您不必連續(xù)關(guān)閉那些煩人的框。 

jsHint / jsLint

為了盡早獲得有關(guān)可能的錯(cuò)誤和不良樣式的反饋,您應(yīng)該使用棉絨工具。Lint工具會(huì)尋找您的編碼風(fēng)格中可能存在的問(wèn)題,例如if語(yǔ)句(清單1.2)中的賦值,全局變量和無(wú)法訪問(wèn)的代碼。

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

如果皮棉工具發(fā)現(xiàn)任何問(wèn)題,您會(huì)得到警告,并且可以在問(wèn)題仍然很小的情況下及早解決問(wèn)題。

有兩種可用的出色工具: jsLint(www.jslint.com)和 jsHint(www.jshint.com)。您使用哪一個(gè)只是一個(gè)偏好問(wèn)題。某些IDE(例如JetBrains Webstorm3)直接在編輯器中支持它們。

您還應(yīng)該禁用其中一些棉絨檢查,因?yàn)槟承〣DD框架使用了棉絨工具認(rèn)為危險(xiǎn)的編碼樣式。 

嚴(yán)格模式

另一個(gè)很棒的檢查輔助工具是 ES5的嚴(yán)格模式 。您可以通過(guò)提供以下字符串將現(xiàn)代瀏覽器置于嚴(yán)格模式下:

"use strict";

較舊的瀏覽器將忽略它-它只是一個(gè)字符串!但是現(xiàn)代瀏覽器會(huì)將js引擎切換為嚴(yán)格模式。在這種模式下,瀏覽器報(bào)告在以下代碼中發(fā)現(xiàn)的各種其他錯(cuò)誤–就像lint工具一樣。您將在開(kāi)發(fā)周期的早期就發(fā)現(xiàn)怪異的錯(cuò)誤。

JavaScript功能正常

JS是一種功能語(yǔ)言,而它是一種面向?qū)ο蟮恼Z(yǔ)言。它可能缺少像Haskell這樣的更現(xiàn)代的功能語(yǔ)言的某些功能,但它從功能世界繼承了一些真正有用的屬性。

我認(rèn)為JS最有用的功能特性是 函數(shù)表達(dá)式 和 閉包。讓我們從第一個(gè)開(kāi)始。

創(chuàng)建函數(shù)表達(dá)式

在JS函數(shù)中,頭等公民。這意味著您可以像使用其他任何值一樣使用它們。您可以將它們綁定到變量,將它們用作其他函數(shù)調(diào)用的參數(shù),甚至從函數(shù)返回它們。

也許您習(xí)慣于以這種方式定義函數(shù):

function greetMe() { return 'Hello' }

但這實(shí)際上幾乎只是“語(yǔ)法糖”:

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

該行定義了一個(gè)函數(shù)值,并將其分配給greetMe變量。現(xiàn)在greetMe包含函數(shù)-更確切地說(shuō),它是綁定到函數(shù)的變量名稱(chēng)greetMe。您可以通過(guò)以下方式進(jìn)行驗(yàn)證:

alert(greetMe);

alert命令需要greetMe中函數(shù)的字符串表示形式。因此,它調(diào)用反編譯器,該反編譯器以字符串形式返回greetMe的原始實(shí)現(xiàn)?,F(xiàn)在Alert可以在其框中打印字符串。

使用函數(shù)表達(dá)式

JS 通過(guò)在函數(shù)名稱(chēng)后面加括號(hào)“()”來(lái)區(qū)分調(diào)用函數(shù) 和 函數(shù)作為值 。

JavaScript的基礎(chǔ)庫(kù)中甚至還有一些示例??紤]一下 Array的排序方法 ;sort默認(rèn)情況下會(huì)進(jìn)行詞法排序。因此,以下表達(dá)式

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

但是下一個(gè)表達(dá)式

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

返回此結(jié)果:

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

這可能不是您想要的。即使您想要數(shù)值,它也會(huì)使用詞匯排序。如果沒(méi)有功能分解,JS庫(kù)團(tuán)隊(duì)將不得不為各種訂單變體編寫(xiě)各種排序方法。

為了避免這種情況,您要做的就是提供一個(gè)通過(guò)比較兩個(gè)值來(lái)定義排序順序的函數(shù)。Sort期望一個(gè)函數(shù)接受兩個(gè)參數(shù),并根據(jù)它們之間的關(guān)系返回-1、1或0。例如,可以通過(guò)以下方式進(jìn)行數(shù)字排序:

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]

排序算法與順序邏輯分開(kāi)。如果您需要其他訂購(gòu),只需編寫(xiě)一個(gè)新的訂購(gòu)功能。您不必自己編寫(xiě)任何排序邏輯(例如quicksort或hashsort)。

我曾經(jīng)寫(xiě)過(guò)一份俱樂(lè)部的申請(qǐng)書(shū)。其中一項(xiàng)功能是列出俱樂(lè)部成員。特殊要求是俱樂(lè)部主席應(yīng)始終列在首位。一個(gè)簡(jiǎn)單的事情:

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

現(xiàn)在我們有:

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

這將產(chǎn)生:

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

未完待續(xù),敬請(qǐng)期待JavaScript的行為驅(qū)動(dòng)開(kāi)發(fā):第二部分。