軟件設計模式提供給你按照模式的方式構建你的代碼從而使之更富於適應未來的彈性修改例如當構建本文中的論壇應用程序時我們就使用了一種名字為Repository的軟件設計模式進行設計Eric Evans在他的著作《DomainDriven Design》中這樣描述Repository模式
一個REPOSITORY把某種類型的所有對象描述為一個概念的集合(通常是模擬的)其行為類似於一個集合但是具有更細致的支持查詢的能力於是符合相應類型的對象可以被添加或刪除而位於此REPOSITORY背後的系統則可以從數據庫中添加或刪除它們
根據Evans的解釋Repository模式的一個主要的優點是它能夠幫助你實現應用程序和域設計與存儲技術多種數據庫策略甚至是多個數據源之間的解耦換句話說Repository模式能夠使你的應用程序免於因數據庫訪問方式的不同而重新加以改變
為了使我們的論壇應用程序從某一種特定的存儲技術中獨立出去我們將在系統中引入上述Repository模式因此最終的此論壇應用程序的設計將能夠支持我們可以在不同的數據訪問技術(例如LINQ to SQLEntity Framework或NHibernate)之間切換
測試驅動開發
我打算使用測試驅動開發原則構建本文中的MVC論壇應用程序更具體地說是在我編寫任何應用程序代碼之前我將首先編寫一個應用程序代碼的單元測試
測試驅動開發將會基於下列原因為你帶來更高質量的代碼
()為你的代碼編寫測試能夠提供給你一個適應於未來可能改變的安全網
()為你的代碼編寫測試迫使你書寫松耦合的代碼
()在正式書寫你的代碼前為你的代碼編寫測試將迫使你從一個用戶的角度來觀察自己書寫的代碼
讓我們更細致地分析上述每種特征的優點
首先單元測試提供你一個適應於未來可能改變的安全網這是Michael Feathers在他的著作《Working Effectively with Legacy Code》一再強調的一個觀點事實上他把遺留代碼定義為簡單地編碼而不進行測試
當你的應用程序代碼被單元測試所覆蓋時你可以修改該代碼而不必擔心此改動會你的代碼既有的功能單元測試有助於使你的代碼進行更安全的重構如果你能夠重構那麼你可以使用軟件設計模式修改你的代碼這將產生更好的適應未來修改的代碼
其次遵循測試驅動開發將迫使你使用一種特定的方式書寫代碼可測試的代碼將趨於導致松耦合的代碼單元測試能夠在各自孤立的代碼單元中執行一個測試為了構建你的應用程序以便使之可測試你需要使用一種可孤立的組件方式來構建應用程序
一個類與另一個類之間是松耦合的是指當你改變第一個類時不必改變另一個類測試驅動開發經常迫使你編寫松耦合的代碼因為松耦合代碼是經得起改變的
最後按照測試先行的方式書寫代碼將迫使你從一個用戶的角度來觀察自己書寫的代碼通過首先編寫測試的方式書寫代碼會使你站在一個未來的有可能使用你的代碼的開發者的角度進行工作既然編寫測試迫使你考慮另一個開發者(也許是未來的你自己)如何使用你的代碼那麼你最終編寫的代碼應該是設計得更好的代碼
莫圖眼前之利益 更宜立足於長遠
使用測試驅動開發原則構建軟件在軟件開發之初要求開發者付出更多的努力盡管編寫測試需要花費一定的時間然而其思想是最初構建單元測試所要求付出的努力將會在未來獲得豐厚的回報
存在兩種方式可以使你成為一名開發者你可以成長為一個牛仔也有可能成長為一個工匠一個牛仔能夠立即開始編碼也就是說一個牛仔可以以很快的速度構建一個軟件應用程序然而作為一個牛仔其問題在於軟件必須要進行長期的維護
一個工匠則是很有忍耐性的一個工匠總會精雕細琢地開發一款軟件一個工匠總是非常仔細地構建單元測試並使之涵蓋一個應用程序中所有的代碼因此一個工匠要花費更長的時間才能創建成功一款應用程序然而此應用程序在創建後卻是易於後期的維護—更易於修改錯誤且更易於把新特征添加到應用程序中
總結
總之我們的最終目標是構建一個MVC論壇應用程序此程序能夠經得起長時間的測試它應該是不僅現在良好地工作還應該在未來繼續工作—即使是當有人需要對該應用程序進行更改之時
我想利用微軟ASPNET MVC框架開發此論壇應用程序原因在於這個框架可以使我更容易地編寫程序的測試代碼而另一方面ASPNET MVC框架本身就從設計之初提供了對測試驅動開發的最忠誠的支持
[] [] []
From:http://tw.wingwit.com/Article/program/net/201311/14492.html