在解答這個問題之前宠能,來聊聊什么是設(shè)計亚隙。類、方法命名成什么樣子是不是設(shè)計违崇?這個方法隸屬于那個類是不是設(shè)計阿弃?給這個方法傳什么參數(shù)算不算設(shè)計?等等等羞延,其實這些都是代碼設(shè)計渣淳。不只是設(shè)計模式那些東西才叫設(shè)計。
首先伴箩,測試驅(qū)動開發(fā)中的驅(qū)動更多的突出一種以終為始的思想入愧,我們先要弄清楚我們要去哪里?如何判斷我們到那里了嗤谚?先定義好客戶的驗收標準棺蛛,在定義驗收標準的時候肯定會驅(qū)使我們思考如何設(shè)計出方便用戶使用的接口,這樣子我們設(shè)計就是被反向驅(qū)動出來的巩步。
其次旁赊,人是一種趨利避害的高等動物。我們在寫測試的時候椅野,一定會想辦法讓測試更容易編寫终畅,沒有人喜歡在一上路就給自己找麻煩籍胯,這就不得不驅(qū)使我們寫出更易于測試的代碼,而無數(shù)軟件開發(fā)實踐證明离福,利于測試的代碼杖狼,它的設(shè)計不會太差,那些耦合度高术徊、設(shè)計復(fù)雜的代碼通常都不易于寫測試(看看沒有自動化測試的遺留系統(tǒng)就知道了)本刽。”TDD并不會驅(qū)動出好的設(shè)計赠涮,TDD只會給你及時的反饋什么可能是糟糕的設(shè)計子寓。” Kent Beck的這句話笋除,體現(xiàn)的正是這個理斜友。
最后,TDD中有一個核心動作–重構(gòu)垃它。我們先定義好驗收標準鲜屏,在定義驗收標準的時候已經(jīng)來過一輪設(shè)計了(接口的定義,類的定義等)国拇,然后讓測試快速通過洛史,這兩個過程我們都能夠很好的分離關(guān)注點,每次聚焦在一件事情上酱吝。通過之后也殖,我們不能就這么過了,還要去停下來去重構(gòu)實現(xiàn)代碼务热,這就需要我們對好的設(shè)計有一定的理解忆嗜,能夠識別一些代碼壞味道,識別不良的設(shè)計崎岂。如果從重構(gòu)驅(qū)使著我們?nèi)ジ牧荚O(shè)計捆毫,那么TDD的測試先行能夠讓我們的重構(gòu)充滿信息。從這個層面來講冲甘,測試也是在驅(qū)動你去改良設(shè)計绩卤。