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

JavaScript的行為驅(qū)動開發(fā):第一部分

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

0

63

0

JavaScript 驅(qū)動開發(fā) TDD

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

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

這與測試無關(guān)!

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

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

  • 從哪里開始?

  • 測試什么,不測試什么?

  • 一次測試多少錢?

  • 什么叫測試?

  • 如何理解測試失敗的原因?

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

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

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

JavaScript不是玩具語言

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

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

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

基本工具

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

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

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

jsHint / jsLint

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

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

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

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

您還應(yīng)該禁用其中一些棉絨檢查,因為某些BDD框架使用了棉絨工具認為危險的編碼樣式。 

嚴(yán)格模式

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

"use strict";

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

JavaScript功能正常

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

我認為JS最有用的功能特性是 函數(shù)表達式 和 閉包。讓我們從第一個開始。

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

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

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

function greetMe() { return 'Hello' }

但這實際上幾乎只是“語法糖”:

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

該行定義了一個函數(shù)值,并將其分配給greetMe變量?,F(xiàn)在greetMe包含函數(shù)-更確切地說,它是綁定到函數(shù)的變量名稱greetMe。您可以通過以下方式進行驗證:

alert(greetMe);

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

使用函數(shù)表達式

JS 通過在函數(shù)名稱后面加括號“()”來區(qū)分調(diào)用函數(shù) 和 函數(shù)作為值 。

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

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

但是下一個表達式

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

返回此結(jié)果:

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

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

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

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

我曾經(jīng)寫過一份俱樂部的申請書。其中一項功能是列出俱樂部成員。特殊要求是俱樂部主席應(yīng)始終列在首位。一個簡單的事情:

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ù),敬請期待JavaScript的行為驅(qū)動開發(fā):第二部分。