TDD會(huì)破壞架構(gòu)嗎?

責(zé)任編輯:editor004

作者:Andrew Morgan

2017-04-06 11:28:35

摘自:INFOQ

作為敏捷宣言的共同作者,我們熟知的鮑勃大叔Bob Martin,在最近發(fā)表的一篇文章中對(duì)TDD是否會(huì)損害架構(gòu)進(jìn)行了評(píng)估。不管是否實(shí)踐TDD,開發(fā)者本身才能決定良好的設(shè)計(jì):TDD不會(huì)導(dǎo)致壞的設(shè)計(jì),也不會(huì)導(dǎo)致好的設(shè)計(jì)。

作為敏捷宣言的共同作者,我們熟知的鮑勃大叔Bob Martin,在最近發(fā)表的一篇文章中對(duì)TDD是否會(huì)損害架構(gòu)進(jìn)行了評(píng)估。文中大部分討論圍繞著遵循測試驅(qū)動(dòng)方法對(duì)高層設(shè)計(jì)和實(shí)現(xiàn)代碼的總體可維護(hù)性是否會(huì)產(chǎn)生消極影響。Martin認(rèn)為,雖然TDD是重要的守則,但良好的設(shè)計(jì)來源于解耦、分離和隔離等原則。

Ruby on Rails的作者David Heinemeier Hansson曾發(fā)表過一篇有關(guān)測試破壞了設(shè)計(jì)的文章。Martin對(duì)此觀點(diǎn)作了進(jìn)一步探索。這篇文章基本上是對(duì)以下兩種設(shè)計(jì)進(jìn)行比較,其一是Hansson所倡導(dǎo)的設(shè)計(jì),另一個(gè)則是Ruby的貢獻(xiàn)者和布道者Jim Weirich所倡導(dǎo)的更易于測試的設(shè)計(jì)。Martin鼓勵(lì)讀者選擇更適合自己的設(shè)計(jì),并寫道:

爭論的焦點(diǎn)在于隔離性和間接性。 DHH的優(yōu)秀設(shè)計(jì)理念最小化了上述兩點(diǎn),而Weirichdd 設(shè)計(jì)則將這兩點(diǎn)最大化。

Martin還撰寫了一篇測試脆弱性的問題。文章中提到對(duì)實(shí)現(xiàn)代碼的細(xì)微改動(dòng)都可能會(huì)對(duì)數(shù)以百計(jì)的相關(guān)測試用例造成影響,從而不得不把它們?nèi)扛隆?/p>

Martin在闡釋他的觀點(diǎn)時(shí)首先指出,不論是否遵循了TDD,測試代碼都需要像產(chǎn)品代碼那樣精心設(shè)計(jì):

應(yīng)用在測試上的設(shè)計(jì)原則應(yīng)當(dāng)和普通代碼一樣多。測試是系統(tǒng)的一部分,必須和系統(tǒng)中的其他部分那樣維持相同的標(biāo)準(zhǔn)。

Martin還解釋道,對(duì)TDD的一個(gè)常見誤區(qū)就是測試和實(shí)現(xiàn)是一一對(duì)應(yīng)的。這可能意味著一個(gè)實(shí)現(xiàn)類對(duì)應(yīng)一個(gè)測試類,一個(gè)實(shí)現(xiàn)方法對(duì)應(yīng)一個(gè)測試方法。這種做法的不足之處主要在于,它將測試和實(shí)現(xiàn)緊緊綁在了一起,導(dǎo)致很難進(jìn)行重構(gòu)和梳理。

Martin認(rèn)為高層架構(gòu)和設(shè)計(jì)不會(huì)從TDD中浮現(xiàn):

坦白講,系統(tǒng)的高層設(shè)計(jì)和架構(gòu)會(huì)從TDD中浮現(xiàn)這一說法聽起來很荒謬。在動(dòng)手編碼之前,你就應(yīng)當(dāng)對(duì)軟件項(xiàng)目具備一定的架構(gòu)視野。而這是TDD無法帶給你的。

另一方面,Martin認(rèn)為那些實(shí)現(xiàn)代碼級(jí)別的低層設(shè)計(jì)確實(shí)來源于TDD的實(shí)踐過程。換句話說,在測試代碼保持不變的同時(shí),實(shí)現(xiàn)代碼可以進(jìn)行重構(gòu)和結(jié)構(gòu)化,使得代碼更具有可維護(hù)性。Martin認(rèn)為這會(huì)導(dǎo)致事物向兩個(gè)方向發(fā)展:“一方面測試變得越來越具體,另一方面產(chǎn)品代碼則越來越通用。”

除了這些差別之外,Martin堅(jiān)信TDD是一條守則。不管是否實(shí)踐TDD,開發(fā)者本身才能決定良好的設(shè)計(jì):

TDD不會(huì)導(dǎo)致壞的設(shè)計(jì),也不會(huì)導(dǎo)致好的設(shè)計(jì)。開發(fā)者才是設(shè)計(jì)好壞的決定因素。TDD只是一條守則,是組織工作的方法,是確保測試覆蓋率的途徑,是在應(yīng)對(duì)特殊性的同時(shí)確保適當(dāng)通用性的手段。

Martin的觀點(diǎn)總結(jié)起來就是,TDD產(chǎn)出的設(shè)計(jì)事實(shí)上就是開發(fā)者的設(shè)計(jì)。TDD的主要優(yōu)勢在于測試覆蓋率和應(yīng)用程序的可靠性。真正良好的設(shè)計(jì)來源于解耦、分離和隔離等原則。

查看英文原文Does TDD Harm Architecture?

鏈接已復(fù)制,快去分享吧

企業(yè)網(wǎng)版權(quán)所有?2010-2024 京ICP備09108050號(hào)-6京公網(wǎng)安備 11010502049343號(hào)