github地址:https://github.com/DaisyCJ/Frequency-Number.git
本次是用TDD(測試驅動開發(fā)Test-Driven Development)方法來實現(xiàn)一個簡單的程序。編程工具是webstorm。nodeJS測試框架是jasmine。git創(chuàng)建代碼庫,保存每一次提交的代碼版本?;玖鞒淌?strong>單元測試實現(xiàn)-->功能代碼實現(xiàn)-->jasmine測試-->git commit提交。
命令行簡單介紹
命令行 或 命令行界面,是一個基于文本的用來查看、 處理、 和操作您的計算機上的文件的應用程序。git和nodeJS都會用的命令行。筆者用的Windows系統(tǒng),使用快捷鍵win+R,再輸入cmd即可。
可通過網(wǎng)站簡單了解:https://tutorial.djangogirls.org/zh/intro_to_command_line/
git基礎
__1. 介紹、安裝、教程 __
安裝包、安裝教程: http://www.runoob.com/git/git-install-setup.html
快速入門:http://codecloud.net/4635.html
這個比較詳細:http://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000/001373962845513aefd77a99f4145f0a2c7a7ca057e7570000
2. 本次練習需要用到的命令(都是很常用,很重要的)
git init------------------------------在當前目錄新建一個Git代碼庫
git add [file1] [file2] ...---------添加指定文件到暫存區(qū)
git add .---------------------------添加當前目錄的所有文件到暫存區(qū)
git commit -m [message]-----提交暫存區(qū)到倉庫區(qū)
git status--------------------------顯示有變更的文件
git log------------------------------顯示當前分支的版本歷史
git checkout [file]----------------恢復暫存區(qū)的指定文件到工作區(qū)
git checkout .---------------------恢復暫存區(qū)的所有文件到工作區(qū)
git reset----------------------------(回退到之前的版本)(用HEAD表示當前版本,HEAD表示上一個版本,HEAD^表示上上個版本)如回退到上一個:git reset --hard HEAD^
3. 深入學習
除了上述的一些簡單的命令之外,git最大的優(yōu)勢在于其分布式,可在github代碼庫創(chuàng)建分支,多人參與編程,并將各種的修改提交到同一個遠程代碼庫。本次練習中只運用到了一些簡單的命令,沒有涉及分布式,可自己嘗試,深入學習。
NodeJS基礎
- 介紹、安裝、教程
入門級新手必看:http://www.runoob.com/nodejs/nodejs-tutorial.html - karme jasmine測試框架安裝
在命令行輸入:npm install -g jasmine
在聯(lián)網(wǎng)的情況下,輸入后會自動全局安裝,之后就可以使用jasmine測試框架了。
創(chuàng)建代碼庫,初始化jasmine測試文件
在目標文件所在文件夾,直接點擊右鍵進入git bush,在git init創(chuàng)建代碼庫即可

再告訴git你要使用jamine測試框架,jasmine init初始化。
接著進入webstorm碼代碼就可以啦,需要測試的時候在git里面輸入jasmine就好,你也可以隨時對代碼進行提交。
TDD
TDD是什么?有什么特點?
- 測試驅動開發(fā)(Test-Driven Development)的英文簡稱,是敏捷開發(fā)中的一項核心實踐和技術,也是一種設計方法論。 TDD的原理是在開發(fā)功能代碼之前,先編寫單元測試用例代碼,測試代碼確定需要編寫什么產(chǎn)品代碼。
簡單點說就是一個先寫測試,再寫實現(xiàn)代碼,用剪單的方式讓測試通過,之后再優(yōu)化代碼。把程序拆分成一個個功能來實現(xiàn)。
編程實現(xiàn)
Frequency Number需求:
- 我想要一個nodejs小程序,
它可以幫我處理一段字符串信息,這段字符串信息是由英文單詞組成,每兩個單詞之間有空格,
處理結果也為一段字符串,這個字符串應該每行只顯示一個單詞和它的數(shù)量,并且按出現(xiàn)頻率倒序排列
example:
- input:
“it was the age of wisdom it was the age of foolishness it is”
- output
it 3
was 2
the 2
age 2
of 2
wisdom 1
foolishness 1
is 1
任務分解
想要實現(xiàn)要求,需對測試字符串進行
- 拆分
- 分組
- 單詞統(tǒng)計
- 按數(shù)量排序
- 拼接輸出
具體實現(xiàn)
可從測試空字符開始,為以上要求先寫一個測試,在寫功能代碼,讓測試通過,進而實現(xiàn)全部功能。
代碼
//***test_spec.js***
var main= require('../../shixian.js');
describe("Word Frequency",function(){
it("return empty string given empty string",function(){
var result = main('');
expect(result).toEqual('');
});
it("return string given one word",function(){
var result = main('he');
expect(result).toEqual('he 1');
});
it("return string given two different words",function(){
var result = main('he is');
expect(result).toEqual('he 1\r\nis 1');
});
it("return string given duplicated words",function(){
var result = main('he he is');
expect(result).toEqual('he 2\r\nis 1');
});
it("return string given words splited by multiple space",function(){
var result = main('he is');
expect(result).toEqual('he 1\r\nis 1')
});
it("a test",function(){
var result = main('it was the age of wisdom it was the age of foolishness it is');
expect(result).toEqual('it 3\r\nwas 2\r\nthe 2\r\nage 2\r\nof 2\r\nwisdom 1\r\nfoolishness 1\r\nis 1')
});
//***shixian.js***
var formatWordAndCount = function (words, count){
return words + ' ' + count;
}
var group = function (wordArray ){
return wordArray .reduce((array, word) =>{
let entry = array.find((e) => e.word === word);
if(entry){
entry.count++;
}
else{
array.push({word: word,count: 1});
}
return array;
}, []);
};
var split = function (words){
return words.split(/\s+/);
}
var sort = function (groupWords) {
groupWords .sort((x, y) => y.count - x.count);
}
var format = function (groupWords) {
return groupWords.map((e) => formatWordAndCount(e.word, e.count)).join('\r\n');
}
function main(words){
if(words !== ''){
let wordArray = split(words);
let groupWords = group(wordArray);
sort(groupWords);
return format(groupWords);
}
return '';
}
module.exports = main;
文件目錄:
git log 記錄
總結
本次練習涉及很多以前沒有接觸過的新技術、新概念,導致開始不知道從哪里下手,花了很長時間配置安裝。如何在信息泛濫的互聯(lián)網(wǎng)搜索自己想要的信息,而不被一個又一個新概念牽著走,也是一個很重要的技能。從最簡單的開始,安裝、配置、HelloWorld、基本語法、跟著實現(xiàn)一個小程序,慢慢來,給自己逐漸增加信心想繼續(xù)學下去。另外,當一個問題在網(wǎng)上找不到滿意的資料,得不到解決,還是要厚著臉皮請教一些大神呀。