精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

一個(gè)非教條式的TDD例子

原創(chuàng) 精選
開發(fā)
本文我想借這個(gè)機(jī)會(huì)聊聊如何運(yùn)用TDD的方式去完成這個(gè)數(shù)據(jù)分批處理的設(shè)計(jì)和開發(fā)。

作者 | 袁慎建

問題背景

數(shù)據(jù)分批器這個(gè)名字是我臨時(shí)起的一個(gè)名字,源于我輔導(dǎo)的客戶團(tuán)隊(duì)開發(fā)人員在當(dāng)時(shí)的核心系統(tǒng)中要解決的一個(gè)實(shí)際業(yè)務(wù)問題 —— Oracle的數(shù)據(jù)庫(kù)刪除每次只支持1000條。這個(gè)問題更確切的講是因?yàn)镺racle對(duì)下面這句SQL語(yǔ)句的支持約束:

delete from t_table where id in (ids)

問題就出在這個(gè)where id in ...上,后面?zhèn)魅氲募蠀?shù)ids最大支持1000條。而實(shí)際業(yè)務(wù)場(chǎng)景中存在大于1000條數(shù)據(jù),所以需要進(jìn)行分批處理。

針對(duì)這個(gè)問題,我暫時(shí)不去探究這個(gè)SQL機(jī)制本身的合理性[1]。本文我想借這個(gè)機(jī)會(huì)聊聊如何運(yùn)用TDD的方式去完成這個(gè)數(shù)據(jù)分批處理的設(shè)計(jì)和開發(fā)。

需求分解

基于這樣的問題,我的習(xí)慣是先對(duì)問題進(jìn)行分解,也就是TDD前要做的一個(gè)關(guān)鍵動(dòng)作 —— Tasking。我快速做了個(gè)Tasking:

(1)非1000的整數(shù)倍,小于1000條

(2)1000的整數(shù)倍

(3)非1000的整數(shù)倍,大于1000條

基于Tasking結(jié)果,對(duì)上述需求場(chǎng)景進(jìn)行實(shí)例化,實(shí)例化過程中,邊界值是我要考慮的重點(diǎn):

(1)非1000的整數(shù)倍,小于1000條

  • 0條
  • 369條

(2)1000的整數(shù)倍

  • 1000條
  • 2000條

(3)非1000的整數(shù)倍,大于1000條

  • 1369條
  • 2222條

原有設(shè)計(jì)

圖片

上述代碼的for循環(huán)中做了兩件事,邊截取不同范圍的recordsId,邊調(diào)用了 CustomCustomerRiskScoreRepository 來做數(shù)據(jù)庫(kù)操作,分批邏輯和存儲(chǔ)夾雜在一起的過程式設(shè)計(jì)的好處是直接了當(dāng),當(dāng)然也讓 deleteByRecordIds() 的職責(zé)過多。

新的設(shè)計(jì)

基于我對(duì)軟件設(shè)計(jì)淺薄的理解,我認(rèn)為這個(gè)分批邏輯和Repository數(shù)據(jù)存儲(chǔ)邏輯分開會(huì)更優(yōu)雅,支持我的幾個(gè)主要理由是:

  • 數(shù)據(jù)存儲(chǔ)邏輯更加純粹,它只用關(guān)心數(shù)據(jù)的CRUD。
  • 重要:分批邏輯可以很方便地進(jìn)行自動(dòng)化測(cè)試。
  • 分批邏輯獨(dú)立出來,方便復(fù)用和維護(hù)。

基于以上的幾點(diǎn)理由,我在原來的過程式程序設(shè)計(jì)的基礎(chǔ)上引入一些OO的理念,進(jìn)行對(duì)象建模,比如抽象出一個(gè)數(shù)據(jù)分批器。我把對(duì)象建模過程看做在TDD之前的一些簡(jiǎn)單且必要的設(shè)計(jì)。

TDD不太提倡在開始前不做任何設(shè)計(jì),恰恰它提倡做一些簡(jiǎn)單且必要的程序接口設(shè)計(jì) —— 非教條主義

通過對(duì)象建模分析,我設(shè)計(jì)了兩個(gè)簡(jiǎn)單的對(duì)象,一個(gè)是BatchDivider,另一個(gè)是Range,UML如下:

圖片

BatchDivider接收一個(gè)總數(shù),然后能夠返回一個(gè)包含了起止的范圍的集合,比如接收1369條,返回集合[Range(0, 1000), (1000, 1369)],起止信息我用Range對(duì)象來表示。

前期的設(shè)計(jì)就做到這,我沒有花太多時(shí)間去糾結(jié)細(xì)節(jié),因?yàn)楝F(xiàn)在的設(shè)計(jì)足夠讓我起步了。如果在后續(xù)發(fā)現(xiàn)了不完善的地方,交給后續(xù)的驅(qū)動(dòng)和重構(gòu)。

編碼落地

至此,我已經(jīng)把需求進(jìn)行了分解和實(shí)例化,然后也做了簡(jiǎn)單的程序設(shè)計(jì),跑步前的熱身完畢,接下來我就打算采用TDD的跑姿小跑起來。

之前的實(shí)例化我寫得比較簡(jiǎn)單,由于我習(xí)慣用Given-When-Then的方式來描述,我把之前簡(jiǎn)單的實(shí)例化再結(jié)合當(dāng)前的程序設(shè)計(jì)做了細(xì)化:

非1000的整數(shù)倍,小于1000條

(1)0條

  • Given 待分批數(shù)據(jù)是0條
  • When 分批處理
  • Then 批次結(jié)果為空集合, []

(2)369條

  • Given 待分批數(shù)據(jù)是369條
  • When 分批處理
  • Then 批次結(jié)果包含1個(gè)Range的集合,[(0, 369)]

1000的整數(shù)倍

(1)1000條

  • Given 待分批數(shù)據(jù)是1000條
  • When 分批處理
  • Then 批次結(jié)果包含1個(gè)Range的集合,[(0, 1000)]

(2)2000條

  • Given 待分批數(shù)據(jù)是2000條
  • When 分批處理
  • Then 批次結(jié)果包含2個(gè)Range的集合,[(0, 1000), (1000, 2000)]

 非1000的整數(shù)倍,大于1000條

(1)1369條

  • Given 待分批數(shù)據(jù)是1369條
  • When 分批處理
  • Then 批次結(jié)果包含2個(gè)Range的集合,[(0, 1000), (1000, 1369)]

(2)2222條

  • Given 待分批數(shù)據(jù)是2222條
  • When 分批處理
  • Then 批次結(jié)果包含3個(gè)Range的集合,[(0, 1000), (1000, 2000), (2000, 2222)]

第1個(gè)測(cè)試

  • Given 待分批數(shù)據(jù)是0條
  • When 分批處理
  • Then 批次結(jié)果為空集合, []

在編寫測(cè)試代碼時(shí),有一種做法是從結(jié)果往前驅(qū)動(dòng),比如我會(huì)先寫assert,然后按照思維意圖一步一步往前倒逼我去命名變量,去給變量賦值。下面是我寫的第1個(gè)測(cè)試用例:

圖片

你現(xiàn)在看到的5 ~ 11行代碼,我的編寫順序是11 --> 5。這僅僅是我個(gè)人的習(xí)慣,因?yàn)槭艿揭越K為始和意圖導(dǎo)向編程觀念的影響,養(yǎng)成了這樣的習(xí)慣。Kent Beck在《測(cè)試驅(qū)動(dòng)開發(fā)》也提到了這種方式。

按照反向驅(qū)動(dòng)的方式寫出來的代碼,我發(fā)現(xiàn)測(cè)試代碼中的一些沒必要的臨時(shí)變量,但我先不著急去重構(gòu),我先聚焦讓這個(gè)測(cè)試通過,至少現(xiàn)在的代碼可讀性也非常好。很快,借助IDE的快捷鍵,我編寫了讓測(cè)試通過的實(shí)現(xiàn)代碼:

我使用了偽實(shí)現(xiàn)讓測(cè)試快速通過,緊接著借助Inline手法清除了測(cè)試代碼中沒必要的臨時(shí)變量totalItemSum和batchCount。

第2個(gè)測(cè)試

  • Given 待分批數(shù)據(jù)是369條
  • When 分批處理
  • Then 批次結(jié)果包含1個(gè)Range的集合,[(0, 369)]

第二個(gè)測(cè)試起名為 given_item_count_below_1000 ,這里我沒有使用具體的實(shí)例化數(shù)據(jù)369,你或許會(huì)起名為 given_item_count_is_369。我個(gè)人習(xí)慣采用抽象場(chǎng)景來命名,因?yàn)槲矣X得能夠更直觀的提供業(yè)務(wù)場(chǎng)景的信息。

圖片

第二個(gè)測(cè)試,我直接給ranges添加了一個(gè)Range對(duì)象,并保留了上一個(gè)測(cè)試的判斷,快速地讓測(cè)試通過了:

圖片

第3個(gè)測(cè)試

  • Given 待分批數(shù)據(jù)是1000條
  • When 分批處理
  • Then 批次結(jié)果包含1個(gè)Range的集合,[(0, 1000)]

圖片

這個(gè)測(cè)試運(yùn)行之后直接通過了,萬(wàn)事大吉,運(yùn)氣還不錯(cuò)。

第4個(gè)測(cè)試

  • Given 待分批數(shù)據(jù)是2000條
  • When 分批處理
  • Then 批次結(jié)果包含2個(gè)Range的集合,[(0, 1000), (1000, 2000)]

為了通過這個(gè)測(cè)試,我編寫了如下的功能代碼,節(jié)省篇幅,我只摘取了核心的batchProcess方法:

圖片

很順利,我通過了第四個(gè)測(cè)試,我發(fā)現(xiàn)該方法中1000這個(gè)數(shù)字出現(xiàn)了好幾次,這是個(gè)魔法數(shù)字,而且重復(fù)出現(xiàn),在我看來這就是一只攜帶了兩種味道的惡魔,于是抽取一個(gè)常量ONE_BATCH_SIZE。

正當(dāng)我準(zhǔn)備寫下一個(gè)測(cè)試時(shí),我運(yùn)行了之前的所有測(cè)試,發(fā)現(xiàn)第2個(gè)測(cè)試掛了 —— 我破壞了原來的功能。我回頭檢查了 batchProcess 方法的實(shí)現(xiàn),原來是 totalItemCount / ONE_BATCH_SIZE 這個(gè)運(yùn)算出了問題,當(dāng)totalItemCount = 369的時(shí)候,整除結(jié)果為0。

定位到問題,基于之前的開發(fā)經(jīng)驗(yàn),我嘗試了Math函數(shù)的幾個(gè)方法,最終找到了 Math.ceil(double) 方法:

圖片

?? 修復(fù)第2個(gè)測(cè)試之后,我心里給TDD點(diǎn)了個(gè)贊:TDD所構(gòu)建的測(cè)試安全網(wǎng)可以為重構(gòu)提供保護(hù),如果功能被破壞,測(cè)試很快就能發(fā)現(xiàn),這讓我去更有勇氣去重構(gòu)。

第5個(gè)測(cè)試

  • Given 待分批數(shù)據(jù)是1369條
  • When 分批處理
  • Then 批次結(jié)果包含2個(gè)Range的集合,[(0, 1000), (1000, 1369)]

圖片

第6個(gè)測(cè)試

  • Given 待分批數(shù)據(jù)是2222條
  • When 分批處理
  • Then 批次結(jié)果包含3個(gè)Range的集合,[(0, 1000), (1000, 2000), (2000, 2222)]

圖片

這個(gè)測(cè)試也直接通過了,到目前為止,所有的測(cè)試運(yùn)行結(jié)果都是綠色的?;诋?dāng)前的6個(gè)測(cè)試,我對(duì)當(dāng)前的程序非常有信心了,先前實(shí)例化的場(chǎng)景也都覆蓋了,所以我準(zhǔn)備停下來去倒杯水。

可規(guī)避的教條

教條:提前設(shè)計(jì)不可有

不是說TDD指Test-Driven Design,設(shè)計(jì)是由測(cè)試驅(qū)動(dòng)出來的嗎,提前設(shè)計(jì)怎么交待呢?

TDD通常也會(huì)被解讀為:測(cè)試驅(qū)動(dòng)設(shè)計(jì)。關(guān)于測(cè)試驅(qū)動(dòng)設(shè)計(jì),我覺得一點(diǎn)點(diǎn)提前設(shè)計(jì)是有必要的,它給了我一個(gè)宏觀的方向,讓我能夠順利地開始。我的個(gè)人習(xí)慣是,在開始寫測(cè)試代碼前我會(huì)做一些簡(jiǎn)單的紙面設(shè)計(jì),做一些簡(jiǎn)單的對(duì)象建模,定義好一些對(duì)外的接口。在早期,我也不會(huì)寫紙面的設(shè)計(jì),而是直接開始寫測(cè)試代碼,實(shí)際上我在寫測(cè)試的時(shí)候腦海里是有設(shè)計(jì)的,只是我沒有顯性化出來。

一方面由于年齡增加,另一方面,面臨的問題很多時(shí)候沒這么簡(jiǎn)單,顯性化出來可以減輕我大腦負(fù)載,并且還能帶來一些其他的好處。

另外,我發(fā)現(xiàn)Uncle Bob在做TDD的時(shí)候也會(huì)做一些簡(jiǎn)單必要的提前設(shè)計(jì)。比如,他在演示TDD Kata 保齡球的時(shí)候就這么干過。

教條:新增測(cè)試要見紅

TDD循環(huán)圈紅-綠-重構(gòu),新增的測(cè)試必須要掛掉,上面第3、5、6,三個(gè)測(cè)試都直接綠了,你這TDD是在騙人的吧?

之前公司有Senior的同事就和我恨恨地討論過這點(diǎn),說實(shí)話我沒有什么理由去反駁這個(gè)觀點(diǎn),但我沒想明白的是為什么新增一個(gè)測(cè)試如果直接通過了就不是TDD了呢。測(cè)試直接通過了不是更好嘛?當(dāng)然前提是你的測(cè)試是對(duì)的。

后來我觀察了很多初學(xué)者在練習(xí)TDD時(shí)的做法,搞明白這種想法背后的擔(dān)心。我看有人寫了第一個(gè)測(cè)試,然后花很多時(shí)間去寫實(shí)現(xiàn),結(jié)果一股腦實(shí)現(xiàn)了很多場(chǎng)景的功能。講真,這樣做也未嘗不可,但從體會(huì)TDD的聚焦性和驅(qū)動(dòng)性上來看,這個(gè)做法恐怕難以達(dá)到目的,這也是TDD門檻高的原因之一 —— 難以控制自己。但從實(shí)用性來看,一股腦寫完好幾個(gè)場(chǎng)景的功能實(shí)現(xiàn),然后補(bǔ)上后面幾個(gè)場(chǎng)景的測(cè)試,也并非不可。要知道咱們寫代碼的初衷是什么 —— 交付可用軟件,或美其名曰交付可用的高質(zhì)量軟件。

所以,為了在學(xué)習(xí)TDD時(shí)更好自控,就有了這樣的一個(gè)教條 —— 新增的測(cè)試一定得是掛的。但很多時(shí)候在編碼過程中,由于編程語(yǔ)言的便捷性,我們?cè)诳焖佟⒑?jiǎn)單地實(shí)現(xiàn)了某個(gè)邊界場(chǎng)景用例時(shí)難免會(huì)存在讓下一個(gè)測(cè)試直接通過的情況,比如我在寫第4個(gè)測(cè)試的時(shí)候,我直接使用了這個(gè)算法:

int batchCount = (int) Math.ceil(totalItemCount / (double) ONE_BATCH_SIZE);

我沒有再花心思去想怎么搞個(gè)hard code參數(shù)是2000,再加一個(gè)if判斷。因?yàn)榛谇懊鎺讉€(gè)測(cè)試的知識(shí)和經(jīng)驗(yàn)積累,我已經(jīng)掌握了讓當(dāng)前測(cè)試通過的算法,而且不會(huì)比我hard code更花時(shí)間。要說快,我直接上這個(gè)會(huì)更快。寫完后我其實(shí)能預(yù)測(cè)到后面兩個(gè)測(cè)試會(huì)直接通過,但我還是會(huì)加上后面兩個(gè)測(cè)試,因?yàn)檫@不僅僅關(guān)乎TDD的姿勢(shì),更關(guān)乎TDD本真的東西 —— 測(cè)試保護(hù)網(wǎng)。

另外,也可能是由于在拆分任務(wù)的時(shí)候太細(xì),使用了不同的數(shù)據(jù)來實(shí)例化了同一類場(chǎng)景,導(dǎo)致測(cè)試用例有交叉,又或者是拆分場(chǎng)景不合理產(chǎn)生了重復(fù),此時(shí)也是一個(gè)反饋調(diào)整任務(wù)列表的契機(jī)。

教條:通過測(cè)試唯快不破

TDD循環(huán)圈強(qiáng)調(diào)要以最快的速度、最簡(jiǎn)單丑陋的方式讓測(cè)試快速通過,你這寫多了???

這個(gè)教條跟上一個(gè)是緊密相關(guān)的,在上一條后半部分也在解釋這個(gè)。有時(shí)候我明明寫一個(gè)功能完整的代碼比簡(jiǎn)單、丑陋的代碼要更快,我就不會(huì)再去hard code,然后假裝慶祝自己是在做“真”TDD。Kent Beck在《測(cè)試驅(qū)動(dòng)開發(fā)》一書的可運(yùn)行模式中提到,快速讓測(cè)試通過的三種方法:

  • 偽實(shí)現(xiàn)
  • 三角法
  • 顯明實(shí)現(xiàn)

我理解這種觀點(diǎn)的支撐點(diǎn)在于對(duì)偽實(shí)現(xiàn)和三角法使用,它認(rèn)為設(shè)計(jì)應(yīng)該是通過大量實(shí)例化的測(cè)試用例驅(qū)動(dòng)出來的。對(duì)于那些很復(fù)雜的業(yè)務(wù)場(chǎng)景,通過簡(jiǎn)單的幾個(gè)用例確實(shí)沒法有效看清抽象模式,浮現(xiàn)不出良好的設(shè)計(jì),偽實(shí)現(xiàn)和三角法不失為一種好的驅(qū)動(dòng)方式。但有時(shí)候,你對(duì)設(shè)計(jì)很清楚,實(shí)現(xiàn)很明顯,這個(gè)時(shí)候何不直接上呢?我在第2個(gè)測(cè)試的實(shí)現(xiàn)中采用了偽實(shí)現(xiàn),而在第4個(gè)中由于我破壞了之前的測(cè)試,我直接上了Math.ceil函數(shù),沒想到實(shí)現(xiàn)了最終的功能。

我提倡的“教條”

提倡:顯性化知識(shí)

這么簡(jiǎn)單的業(yè)務(wù)需求,我腦袋瓜子完全夠用,有必要這么麻煩顯性地呈現(xiàn)出來嗎?

我認(rèn)為有必要寫出來,俗話說好記性不如爛筆頭。在整理呈現(xiàn)的過程中,我會(huì)投入更多的時(shí)間思考,思考有沒有準(zhǔn)確理解業(yè)務(wù)?思考如何能夠讓別人更容易理解?另外,它還可以作為一個(gè)顯性的計(jì)劃工具,幫助我評(píng)估我未來的工作。有了它,我跟團(tuán)隊(duì)成員溝通起來也更高效,并且在后續(xù)非單線程的工作模式中更容易聚焦重點(diǎn),更方便我去檢查任務(wù)進(jìn)展。在我看來,可視化的動(dòng)作能讓Tasking發(fā)揮以下四個(gè)工具價(jià)值:

  • 顯性的計(jì)劃工具
  • 高效的溝通工具
  • 便捷的檢查工具
  • 進(jìn)化的思維工具

話說回來,寫出來并不會(huì)花太多時(shí)間吧,寫不出來就去做,有可能是因?yàn)檫€想不清楚,想不清楚的話就有危險(xiǎn)了。問題域越復(fù)雜,這里越值得花時(shí)間去想。

提倡:夯實(shí)基本功

總是拿玩具代碼來忽悠新人,在實(shí)際項(xiàng)目中遠(yuǎn)比這復(fù)雜的多,還是搞不定呀?

說到這個(gè),我想起了我跟羽毛球的故事。我是2020年8月份的時(shí)候才正式接觸羽毛球,在這之前我平均一年打球不到5次,在這之后我最多的時(shí)候一周就超過了5次。以前,我無(wú)知地以為羽毛球沒什么復(fù)雜的,拿個(gè)拍子,場(chǎng)上跑跑,基本上人人都會(huì),壓根用不著花錢找教練。后來場(chǎng)上數(shù)次被虐的“恥辱”讓我不得不去好好了解一下羽毛球。不學(xué)不知道,一學(xué)嚇一跳,簡(jiǎn)單羅列一下:

  • 身體基本功:體能、爆發(fā)力、耐力、反應(yīng)速度、彈跳
  • 基礎(chǔ):發(fā)力、握拍、舉拍、步伐(6個(gè)方向,1~3步)
  • 技巧:發(fā)球、接發(fā)球、吊球、勾對(duì)角、平抽、高遠(yuǎn)球、殺球、接殺球、封網(wǎng)、搓球
  • 站位:男單、女單、男雙、混雙

上面列出來的還不齊全,并且基本功和技巧都涵蓋了正手和反手。羽毛球的技巧和戰(zhàn)術(shù)如此之多,每一個(gè)都?jí)蚓毩?xí)一陣子,羽毛球的羽字:一分為二,學(xué)習(xí) + 練習(xí),這個(gè)字讓我感慨真不是隨意取的(為了幫助廣大球友快速成長(zhǎng),我整理了羽球知識(shí)庫(kù),請(qǐng)?jiān)谖哪┇@取[2])。

我可以在這些技巧都不會(huì)或者都不嫻熟的情況下,跳過針對(duì)性的基本功練習(xí),直接上場(chǎng)叫囂要跟高手拉練,難免自取其辱還得不到有效提升。認(rèn)識(shí)到這點(diǎn)之后,唯有日練揮拍近千次來夯實(shí)基本功方可讓我有勇氣嘗試挑戰(zhàn)高手。

“練球不練功,打球一場(chǎng)空”。我認(rèn)為學(xué)習(xí)TDD也是一樣的道理,實(shí)際項(xiàng)目中確實(shí)業(yè)務(wù)和架構(gòu)復(fù)雜得多,但這不該成為你拒絕以簡(jiǎn)單的案例入手去練習(xí)基本功的理由。再?gòu)?fù)雜的案例,元能力是類似的。

早在2018年底的,我給武漢某Offshore團(tuán)隊(duì)做了一場(chǎng)OOBootcamp,大家覺得ParkingLot不過癮,在訓(xùn)練營(yíng)快結(jié)束的時(shí)候,我?guī)Т蠹姨接懥嗽谝粋€(gè)Java SpringBoot后端分層架構(gòu)中如何落地TDD。有了訓(xùn)練營(yíng)的刻意練習(xí),團(tuán)隊(duì)很快在后端分層架構(gòu)中實(shí)踐落地了TDD。

所以,我個(gè)人認(rèn)為基本功是首要的,如果你還沒有嘗試過TDD,不妨先拋開懷疑,先去嘗試一下。

寫在最后

我接觸TDD有7年多時(shí)間了,至今未通透,仍在努力學(xué)習(xí)中。在實(shí)際項(xiàng)目落地TDD以及在TDD訓(xùn)練營(yíng)中,我會(huì)堅(jiān)持一些原則,主要有以下三點(diǎn):

  • Tasking優(yōu)先性
  • 設(shè)計(jì)輕量性
  • 知識(shí)明顯性

對(duì)業(yè)務(wù)需求進(jìn)行Tasking的過程能夠讓我重新梳理業(yè)務(wù),并且減少理解上的偏差和遺漏,避免在后續(xù)開發(fā)過程出現(xiàn)返工,造成更高的修改成本。即便你做不到測(cè)試先行,Tasking也值得去做好。

設(shè)計(jì)本身就是一種不可言說的知識(shí),何為簡(jiǎn)單且必要的設(shè)計(jì)?何為恰到好處的設(shè)計(jì)?不是看了幾本書、借用幾個(gè)大牛的三兩句話就能說清的,更多源自于日常實(shí)踐中的思考和總結(jié)。

針對(duì)Tasking的產(chǎn)出物,我會(huì)使用可視化和結(jié)構(gòu)化的方式顯性化管理起來,以便跟業(yè)務(wù)人員溝通確認(rèn),并更好地在團(tuán)隊(duì)內(nèi)共享。

三條中前兩條對(duì)個(gè)人底層勝任力提出了要求。Tasking做得質(zhì)量如何,比較依賴個(gè)人的分析性思維,設(shè)計(jì)做的好不好,考驗(yàn)的是一個(gè)人對(duì)設(shè)計(jì)的Sense。這些能力不會(huì)那么輕易通過短期的培訓(xùn)得到提升,但好在我們每個(gè)人都具備一些基礎(chǔ)。在這樣的基礎(chǔ)前提下,結(jié)合一些結(jié)構(gòu)化良好的顯性知識(shí)管理方式,堅(jiān)持跟時(shí)間賽跑吧。

補(bǔ)充說明

改進(jìn)

在這個(gè)數(shù)據(jù)分批器案例中,測(cè)試用例和設(shè)計(jì)上都有可以改進(jìn)的地方,比如:

  • 測(cè)試用例使用jUnit 5的參數(shù)化測(cè)試,測(cè)試斷言的優(yōu)化;
  • 消除「域冗余」:方法BatchDivider.batchProcess() --> BatchDivider.process();
  • BatchDivider也可以做得更簡(jiǎn)單,讓其成為一個(gè)靜態(tài)工廠方法,變身為工具類;
  • BatchDivider還可以將分批處理的結(jié)果存起來,方便重復(fù)獲??;
  • BatchDivider再或者后期需要支持動(dòng)態(tài)分批,比如500一批,2000一批;
  • 喜歡Java Stream API的小伙伴可以Stream來實(shí)現(xiàn)BatchDivider
  • 等等其他未知改進(jìn);

改進(jìn)無(wú)止境,希望我想分享的點(diǎn)得到傳達(dá),更多的優(yōu)化留給文后有心的你。

手稿

過程我大概花了45分鐘的時(shí)間,從需求分解、前期設(shè)計(jì)、代碼庫(kù)的搭建和功能實(shí)現(xiàn),為了節(jié)省時(shí)間,我原先用的是手稿,文中是我后來另做了文字化。下圖是留作紀(jì)念的手稿:

? 圖片 ?

原文鏈接:??一個(gè)非教條式的TDD例子 (qq.com)??

責(zé)任編輯:趙寧寧 來源: 51CTO
相關(guān)推薦

2013-06-21 14:02:19

軟件開發(fā)方法

2009-07-14 16:02:42

JDBC例子

2011-05-06 14:19:29

ExcelSQL Server

2020-03-26 17:00:53

HashMapputJava

2010-04-19 17:21:36

Oracle寫文件

2009-08-26 15:53:42

C#數(shù)據(jù)訪問XML

2009-07-21 14:55:30

2009-08-10 10:08:45

.NET調(diào)用PHP W

2015-08-03 11:45:37

storyboard

2009-06-18 15:53:37

Hibernate B

2015-05-25 15:06:28

JavaScript函數(shù)式編程

2020-04-06 20:47:42

FishShellLinux

2012-08-23 14:23:33

函數(shù)式編程

2009-06-11 14:48:48

jbpm工作流引擎jbpm例子

2013-04-03 10:22:00

iOS開發(fā)Objective-C

2024-01-08 13:40:00

并發(fā)安全? 數(shù)量

2011-08-02 12:46:46

Oracle數(shù)據(jù)表建立索引

2023-03-14 08:02:14

靜態(tài)路由動(dòng)態(tài)路由設(shè)備

2017-03-27 21:59:57

TDD開發(fā)編程

2022-04-14 07:56:30

公平鎖Java線程
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

无码人妻丰满熟妇精品| 国产网站无遮挡| 日本最新在线视频| 国产又粗又猛又爽又黄91精品| 超碰91人人草人人干| 无码人妻一区二区三区一| 热色播在线视频| 久久久久成人黄色影片| 国产日韩中文字幕| 91国产丝袜播放在线| 国产日产一区| 日韩欧美一区二区久久婷婷| 能在线观看的av| 麻豆传媒免费在线观看| 99精品国产99久久久久久白柏 | 毛片网站在线看| 91色porny蝌蚪| 91av一区二区三区| 亚洲精品无码久久久久| 国产精品多人| www欧美日韩| av在线网站观看| 久久久精品区| 欧美日韩另类国产亚洲欧美一级| 人人干视频在线| 国产在线观看91| 国产日韩欧美一区二区三区乱码| 成人资源视频网站免费| 成人黄色三级视频| 99视频精品免费观看| 日韩在线高清视频| 91精彩刺激对白露脸偷拍| 日韩视频一区二区三区四区| 欧美日韩一区视频| 成人三级视频在线播放| 波多野结衣精品| 樱桃国产成人精品视频| 亚洲欧洲免费无码| chinese偷拍一区二区三区| 91亚洲精品久久久蜜桃| 99re在线国产| 99草在线视频| 久久99精品一区二区三区| 热99在线视频| 91午夜视频在线观看| 亚洲先锋成人| 欧美成人免费视频| 国产女人18水真多毛片18精品| 日韩精品一区二区三区免费观影| 亚洲免费电影在线观看| 爱爱的免费视频| 欧美日韩夜夜| 日韩精品在线免费观看| 中文字幕在线永久| 开心激情综合| 精品一区精品二区| 久久久久久国产精品无码| 曰本一区二区三区视频| 精品视频久久久久久久| 玖玖爱在线观看| 五月激激激综合网色播| 亚洲男人的天堂在线| 老鸭窝一区二区| 九色精品91| 亚洲天堂视频在线观看| 日本欧美一区二区三区不卡视频| 日韩精品电影| 久久成人国产精品| 精品深夜av无码一区二区老年| 国产精品v亚洲精品v日韩精品 | 午夜影院在线观看国产主播| 天天综合色天天综合色h| 精品中文字幕av| 日韩av中字| 欧美日韩视频专区在线播放| 国内自拍第二页| 午夜视频在线观看精品中文| 亚洲国产日韩一区| 欧美18—19性高清hd4k| 久久激情电影| 欧美激情国内偷拍| 国产精品免费精品一区| 免费在线观看日韩欧美| 成人天堂噜噜噜| 亚洲黄色在线播放| 26uuu另类欧美| 亚洲无玛一区| 少女频道在线观看免费播放电视剧| 亚洲午夜电影网| 无码精品国产一区二区三区免费| 国外成人福利视频| 精品少妇一区二区三区 | 风间由美一区二区av101 | 99reav在线| 亚洲精品免费电影| 国产无套内射久久久国产| 成人高清一区| 精品福利在线导航| 国产精品久久久视频| 一区二区三区四区在线观看国产日韩 | 国产精品稀缺呦系列在线| 99产精品成人啪免费网站| 99riav久久精品riav| 亚洲欧美日韩精品在线| free性欧美| 欧美久久久一区| 性色av蜜臀av色欲av| 久久精品青草| 欧洲日韩成人av| 国产按摩一区二区三区| 久久久久国产精品麻豆ai换脸| 国产日韩欧美大片| 激情开心成人网| 精品日韩一区二区| 青青青视频在线播放| 亚洲美女网站| 成人国产精品av| www.黄在线观看| 精品福利樱桃av导航| 中文字幕国产高清| 九一成人免费视频| 亚州国产精品久久久| 国产免费av观看| 国产免费成人在线视频| 好吊妞无缓冲视频观看| 久久免费福利| 日韩有码在线播放| 这里只有精品免费视频| 99久久99久久精品免费看蜜桃| 黄色一级视频播放| 四虎成人精品一区二区免费网站| 亚洲精品自拍视频| 日本五十熟hd丰满| 国产成人午夜精品影院观看视频| 亚洲国产欧洲综合997久久 | 黑丝一区二区| 91在线中文字幕| 日本中文字幕伦在线观看| 色哟哟一区二区| 3d动漫精品啪啪一区二区下载| 亚洲激情午夜| 国产精品久久7| 3344国产永久在线观看视频| 日韩免费高清av| 在线观看亚洲网站| 精品一区二区影视| 一区不卡字幕| 久久夜夜久久| 日韩中文第一页| 一级黄色免费看| 国产精品国产自产拍高清av| 天天干天天玩天天操| 色小子综合网| 国产日韩中文在线| 成人在线免费看片| 欧美三级电影精品| 91麻豆精品久久毛片一级| 免费在线观看成人| 91xxx视频| 天堂久久av| 韩国日本不卡在线| 深夜影院在线观看| 在线视频国内自拍亚洲视频| 久久丫精品忘忧草西安产品| 三级欧美在线一区| 亚洲一区二区三区精品动漫| 视频欧美精品| 欧美裸身视频免费观看| 少妇精品高潮欲妇又嫩中文字幕| 午夜精品免费在线| 男人天堂av电影| 免费日本视频一区| 国产麻豆电影在线观看| 欧美二区观看| 97国产精品视频人人做人人爱| 色中色在线视频| 欧美日韩一区视频| 久久久www成人免费毛片| 成人深夜福利app| av动漫在线观看| 日产午夜精品一线二线三线| 亚洲自拍偷拍色图| 精品极品在线| 中文字幕亚洲欧美一区二区三区| 国产国语亲子伦亲子| 天天影视色香欲综合网老头| 粉嫩精品久久99综合一区| 国产精品一区一区三区| 黄色一级在线视频| 日韩欧美在线中字| 国产精品高清一区二区三区| 五月激情久久| 欧美日韩成人在线观看| 精品av中文字幕在线毛片| 欧美日本精品一区二区三区| 懂色av.com| 国产精品妹子av| 欧美激情一区二区三区p站| 日韩国产在线一| 成人在线观看毛片| 精品久久视频| 国产高清在线一区| 国产精品videossex撒尿| 欧美激情中文网| 第一福利在线| 日韩经典一区二区三区| 国产美女免费看| 欧美在线视频日韩| www.日本精品| 一区二区三区中文字幕精品精品| 真实乱视频国产免费观看| 粉嫩欧美一区二区三区高清影视| 国产精品入口免费软件| 亚洲麻豆av| 日日噜噜夜夜狠狠久久丁香五月| 欧美美乳视频| 国产原创精品| 日韩精品一区二区三区中文 | 成人免费观看49www在线观看| 91精品国产91久久久| av在线看片| 日韩中文字幕在线看| 男人的天堂在线免费视频| 精品精品国产高清一毛片一天堂| 一级黄色片免费看| 欧美三级三级三级| 性色av免费观看| 亚瑟在线精品视频| 久久综合综合久久| 亚洲男同性恋视频| 色婷婷粉嫩av| 欧美国产一区视频在线观看| 丰满少妇一区二区| 97超碰欧美中文字幕| 黄色av电影网站| 国产精品一区二区久久精品爱涩| www.这里只有精品| 奇米亚洲午夜久久精品| 国产一区亚洲二区三区| 免费视频一区二区三区在线观看| 国产欧美日韩网站| 黄色亚洲在线| 国产精品久久久久久久乖乖| 欧美激情视频一区二区三区在线播放 | 久久中文字幕av一区二区不卡| 欧美在线一区二区三区四区| 美女呻吟一区| 精品国产乱码久久久久久108| 成午夜精品一区二区三区软件| 99国产在线视频| av成人综合| 国产一区二区三区无遮挡| 女同另类激情重口| 欧美激情导航| 精品免费在线| 亚洲视频精品一区| 在线电影一区二区| 国产aaa免费视频| 亚洲三级国产| 欧美 日韩 国产在线观看| 香蕉久久a毛片| 精品www久久久久奶水| 日韩影院免费视频| 在线观看日本一区二区| 国产主播一区二区| 最新中文字幕日本| 91在线视频网址| 亚洲码无人客一区二区三区| 国产精品护士白丝一区av| 小泽玛利亚一区二区免费| 一级女性全黄久久生活片免费| 久久老司机精品视频| 精品露脸国产偷人在视频| 蜜臀精品一区二区三区| 欧美三级视频在线播放| 精品国产99久久久久久宅男i| 精品日韩在线观看| 欧美18xxxxx| 久久中文字幕国产| 九色porny视频在线观看| 国产精品91在线观看| 欧美经典一区| 久久本道综合色狠狠五月| 日韩精品久久久久久久电影99爱| 久久综合亚洲精品| 免费视频一区| 亚洲国产综合av| 久久无码av三级| 99热这里只有精品4| 亚洲国产一区二区视频| 337p粉嫩色噜噜噜大肥臀| 3d成人动漫网站| 香蕉人妻av久久久久天天| 最近2019中文免费高清视频观看www99| 1024在线播放| 日本在线观看天堂男亚洲| 国产激情综合| 日韩经典在线视频| 狠色狠色综合久久| 色片在线免费观看| 97精品超碰一区二区三区| 三级av在线免费观看| 色婷婷激情久久| 可以免费看毛片的网站| 这里只有精品视频在线| a√中文在线观看| 成人免费视频网址| 亚洲小说图片视频| 日本中文字幕一级片| 秋霞国产午夜精品免费视频| 欧美一区二区免费在线观看| 日韩一区在线免费观看| 亚洲AV无码成人精品区东京热| 欧美大肚乱孕交hd孕妇| 在线观看免费版| 欧美在线观看日本一区| 中文字幕亚洲在线观看| 日本三级福利片| 日韩二区三区四区| 一区二区三区免费在线观看视频| 一区av在线播放| 国产片在线播放| 在线观看免费高清视频97| 特黄毛片在线观看| 国产欧美日本在线| 综合视频在线| 国模私拍视频在线观看| 国产亚洲成年网址在线观看| 日本三级午夜理伦三级三| 91麻豆精品国产91久久久久 | 乱熟女高潮一区二区在线| 日本午夜一本久久久综合| 欧美熟妇一区二区| 欧美日韩中文在线| 五月天婷婷激情网| 97欧美精品一区二区三区| 国产精品qvod| 欧美国产视频一区| 成人一区在线观看| 久久久久免费看| 欧美xfplay| 好看的中文字幕在线播放| 成人18视频| 欧美视频久久| 99免费观看视频| 亚洲国产精品久久久久婷婷884| 亚洲黄色在线播放| 国语自产偷拍精品视频偷| 都市激情久久| 日本福利视频在线| 91亚洲国产成人精品一区二区三 | 狠狠色噜噜狠狠色综合久| 亚洲黄色av| 中文字幕av观看| 91电影在线观看| 欧美成人性生活视频| 成人黄色免费网站在线观看| 女主播福利一区| 中文字幕一区二区三区人妻在线视频| 亚洲夂夂婷婷色拍ww47| 日批视频免费播放| 日本中文字幕久久看| 欧美亚洲国产激情| 亚洲精品在线视频播放| 亚洲精品视频在线观看免费 | 国产精品成人3p一区二区三区| 樱空桃在线播放| 成人av第一页| 黄色片网站在线免费观看| 尤物yw午夜国产精品视频明星| 色999久久久精品人人澡69| 中文字幕第50页| 97久久精品人人做人人爽| 小泽玛利亚一区二区三区视频| 精品国产一区二区三区在线观看| 日本精品视频| 国产麻花豆剧传媒精品mv在线| 国产女同性恋一区二区| 国产婷婷在线视频| 奇米成人av国产一区二区三区| 欧美日韩精品在线一区| 天天色天天干天天色| 五月天中文字幕一区二区| 国产福利免费在线观看| 91丝袜脚交足在线播放| 久久久成人网| 18岁成人毛片| 亚洲毛片在线看| 精品999日本久久久影院| 无罩大乳的熟妇正在播放| 国产精品天干天干在线综合| 欧美熟妇乱码在线一区| 国产精品福利小视频| 欧美亚洲不卡| 内射毛片内射国产夫妻| 亚洲精品一区二区三区影院 | 免费网站在线高清观看| 欧美www视频| 国产精品久久久久久妇女| 99在线精品免费视频|