10/23日,我在部門內部進行了一次內部學習,使用目前流行的coding dojo(道場)方式,進行了tdd開發的演練。
演練的題目如下:
從效果來看,基本達到了傳達tdd是什麼樣的開發方式的目的。尤其是大家從最初滿腦子如何實現這個程式,怎樣去設計演算法,逐漸轉變為了先想如何測試,從最簡單的實現開始,最終演化成最終的設計。當然,目前為止,參加人員也只是理解了tdd是乙個什麼樣的開發方式而已,還談不到真正使用tdd進行開發。這需要乙個更加長期的自我訓練和使用的過程。
使用tdd,最主要的是一種思維方式的變化。
首先:要堅信所有的程式皆可測,如果不能測試,不是產品的特性導致,而是自己的能力不足導致,設計上有問題。因此必須從設計上加以改變,使得程式可測。如一般認為曲線的顯示是否正常,是無法使用自動測試的。換個角度:如果顯示只是乙個資料-座標的轉換的話,測試的重點就變成了資料是否正確,而這一點是完全可測的。
其次:雖然需要全域性的考慮,但是要從簡單入手,演進式設計。
這一點,在本次道場演練中體現的就很明顯,此次道場開始,很多人的想法就是,建立某種演算法,將需要的字元顯示出來。於是第乙個函式就是:void displaysegmentdigital(string input),然後再寫那些子函式。如何測試這個函式?這是乙個輸出到螢幕顯示的函式,它只能用眼來判斷,顯然不適合自動測試或者單元測試。所以,tdd不是乙個先實現框架,再實現具體功能的做法。輸出到螢幕,只是最後的乙個過程,也是乙個簡單的過程,因此可以不必作為重點。重點在於顯示的資料是什麼?所以,函式就變為了:string displaysegmentdigital(string input)。這個時候,這個函式不再是向螢幕輸出,而是輸出乙個字串,再由另外乙個字串顯示函式完成向螢幕的輸出。而原來這個函式就變得可測了。於是,第乙個測試函式被寫出來了:
string strtext = "910"; string strtextresult = "._.|_|..|.....|..|._.|.||_|";第乙個測試順利通過,因為實現非常簡單:string stroutput = digitalsegment.displaysegmentdigital(strtext);
assertequals(stroutput , strtextresult);
public string displaysegmentdigital(string strtext)接下來的困難是:下乙個測試什麼?測試「3456」的輸出?ok,我們先試試看,於是我們想寫第二個測試:
string strtext = "3456"; string strtextresult = "????????";問題接著出來了:這串問號該填什麼?這樣測試真的有意義麼?幾乎所有的人都直覺得發現這裡有問題。簡短的討論後,結論是應該測試每個數字的顯示,而非乙個字串。於是,測試變為:
string strtext = "9"; string strtextresult = "._.|_|..|";實現變為:string stroutput = digitalsegment.displaysegmentdigital(strtext);
assertequals(stroutput , strtextresult);
public string displaysegmentdigital(string strtext)實現後,接著測試:
strtext = "1"; strtextresult = ".....|..|";實現也變為:stroutput = digitalsegment.displaysegmentdigital(strtext);
assertequals(stroutput , strtextresult);
public string displaysegmentdigital(string strtext)至此,很顯然我們的演算法也就自然而然的誕生了。可能與很多人自己開始的演算法設計不太一樣,但也不應該差到**:)。這就是tdd演進式設計。
但有個問題,._.|_|..|是什麼東東?我怎麼知道最終輸出是正確的。因此,我們稍微改變了一下寫法:
string strtext = "9"; string strtextresult = "._." +實現變為:"|_|" +
"..|";
string stroutput = digitalsegment.displaysegmentdigital(strtext);
assertequals(stroutput , strtextresult);
strtext = "1";
strtextresult = "..." +
"..|" +
"..|";
stroutput = digitalsegment.displaysegmentdigital(strtext);
assertequals(stroutput , strtextresult);
public string displaysegmentdigital(string strtext)現在直觀多了。
為什麼一定要變得直觀,其目的不單純是為了程式的易讀性,更重要的是:測試不應該抄實現的**,實現也不要抄測試的**,否則後果很嚴重。寫測試**時,必須是含著測試的心態,含著使用者的心態去寫測試**,而非一門心思去想實現。如果這樣,tdd就失敗了。這也是為什麼tdd要求先寫測試**,再寫實現**的原因。因為我們一旦先想到了實現,那麼接下來的測試,必然會跟著實現的邏輯走,從而違背「測試獨立性」的原則。實現發生錯誤,測試也無法發現。
接下來需要整理一下**,顯然displaysegmentdigital這個函式名不是那麼準確,後來議論了一番,得出的名字是:getdigitaldisplaycontent。結束後,我想getdigitalfont可能更好。
好了,有關第一次道場就寫到這裡,留乙個小小的問題:到目前為止我們還沒有設計顯示的演算法。為了便於輸出,目前的設計如何改進?
第一次飛行
開始敲下這段話時,窗外下面正是一片片陽光照耀著的白雲,伴隨著張學友的歌聲,心潮起伏.雖然從初中起,我就經常乙個人坐著火車,汽車東奔西跑,坐飛機卻是第一次.早上上飛機前,心裡忐忑,必竟還是踏在陸地上踏實.但上了飛機後注意力就放在其它地方上去了,而且,運氣好的是我有乙個靠窗的位置.飛機準備起飛了,助跑加...
第一次面試
話說3月4號學院召開實習動員大會並有三家公司過來進行宣講會,分別是國家體育總局亞運專案組,金蝶和華際友天,由此開始了實習生涯。周五的傍晚,正吃著飯的時候突然收到簡訊通知,金蝶週六上午10點有個面試。當晚就瀏覽著些簡歷製作相關的網頁,為第二天做準備,總以為,簡歷弄得可以了,然後每太留意去完善 後來才知...
第一次哭泣
第一次來到南方 沒有朋友 沒有親人 乙個從沒有出過門的乙個女孩子 為了工作 學習c 在這碰到了乙個很好的老師 當老師控制我的機器時 或者給我講題時 我都是很感動的 幾乎是每天都有問題 形成了依賴 以前他說不要一有問題就舉手問 我依然問 就算我不問他也會控制我的機器 看看我在做什麼 或者有什麼錯誤 現...