ASP.NET MVC論壇應用程序(下)
6、 軟件設計模式
軟件設計模式描述的是應用軟件設計原則所遵循的策略的問題。換句話說,一個軟件設計原則是一個好的思想,而一個軟件設計模式是你用于實現這種好的思想的工具。
軟件設計模式的思想最初源于書籍《Design Patterns: Elements of Reusable Object-Oriented Software》。正是這本書為其它許多描述軟件設計模式書的創作帶去靈感。
例如,另一本書《The Head First Design Pattern》就以一種更易于理解的方式向人們介紹了GOF所著的書(即上面的那本《Design Patterns: Elements of Reusable Object-Oriented Software》)中所引入的設計模式。這本書中總共詳細介紹了下列14種軟件設計模式:
◆Strategy
◆Observer
◆Decorator
◆Factory
◆Singleton
◆Command
◆Adaptor
◆Façade
◆Template
◆Iterator
◆Composite
◆State
◆Proxy
◆Compound
另一本在軟件設計模式方面較有影響的書是Martin Fowler的《Patterns of Enterprise Application Architecture》。這本書還擁有一個公司網站,其中列舉了本書中所介紹的模式。此網站的網址是:http://www.martinfowler.com/eaaCatalog/。
軟件設計模式提供給你按照模式的方式構建你的代碼,從而使之更富于適應未來的彈性修改。例如,當構建本文中的論壇應用程序時,我們就使用了一種名字為 Repository的軟件設計模式進行設計。Eric Evans,在他的著作《Domain-Driven Design》中這樣描述Repository模式:
一個REPOSITORY把某種類型的所有對象描述為一個概念的集合(通常是模擬的)。其行為類似于一個集合,但是具有更細致的支持查詢的能力。于是,符合相應類型的對象可以被添加或刪除,而位于此REPOSITORY背后的系統則可以從數據庫中添加或刪除它們。
根據Evans的解釋,Repository模式的一個主要的優點是,它能夠幫助你實現“應用程序和域設計與存儲技術,多種數據庫策略,甚至是多個數據源之間的解耦。”換句話說,Repository模式能夠使你的應用程序免于因數據庫訪問方式的不同而重新加以改變。
為了使我們的論壇應用程序從某一種特定的存儲技術中獨立出去,我們將在系統中引入上述Repository模式。因此,最終的此論壇應用程序的設計將能夠支持我們可以在不同的數據訪問技術(例如LINQ to SQL,Entity Framework或NHibernate)之間切換。
7、 測試驅動開發
我打算使用測試驅動開發原則構建本文中的MVC論壇應用程序。更具體地說是,在我編寫任何應用程序代碼之前,我將首先編寫一個應用程序代碼的單元測試。
測試驅動開發將會基于下列原因為你帶來更高質量的代碼:
(1)為你的代碼編寫測試能夠提供給你一個適應于未來可能改變的安全網。
(2)為你的代碼編寫測試迫使你書寫松耦合的代碼。
(3)在正式書寫你的代碼前為你的代碼編寫測試將迫使你從一個用戶的角度來觀察自己書寫的代碼。
讓我們更細致地分析上述每種特征的優點。
首先,單元測試提供你一個適應于未來可能改變的安全網。這是Michael Feathers在他的著作《Working Effectively with Legacy Code》一再強調的一個觀點。事實上,他把遺留代碼定義為“簡單地編碼而不進行測試”。
當你的應用程序代碼被單元測試所覆蓋時,你可以修改該代碼而不必擔心此改動會你的代碼既有的功能。單元測試有助于使你的代碼進行更安全的重構。如果你能夠重構,那么,你可以使用軟件設計模式修改你的代碼,這將產生更好的適應未來修改的代碼。
其次,遵循測試驅動開發將迫使你使用一種特定的方式書寫代碼。可測試的代碼將趨于導致松耦合的代碼。單元測試能夠在各自孤立的代碼單元中執行一個測試。為了構建你的應用程序以便使之可測試,你需要使用一種可孤立的組件方式來構建應用程序。
一個類與另一個類之間是松耦合的是指,當你改變第一個類時不必改變另一個類。測試驅動開發經常迫使你編寫松耦合的代碼,因為松耦合代碼是經得起改變的。
最后,按照測試先行的方式書寫代碼將迫使你從一個用戶的角度來觀察自己書寫的代碼。通過首先編寫測試的方式書寫代碼,會使你站在一個未來的有可能使用你的代碼的開發者的角度進行工作。既然編寫測試迫使你考慮另一個開發者(也許是未來的你自己)如何使用你的代碼,那么,你最終編寫的代碼應該是設計得更好的代碼。
8、 莫圖眼前之利益更宜立足于長遠
使用測試驅動開發原則構建軟件在軟件開發之初要求開發者付出更多的努力。盡管編寫測試需要花費一定的時間;然而,其思想是,最初構建單元測試所要求付出的努力將會在未來獲得豐厚的回報。
存在兩種方式可以使你成為一名開發者。你可以成長為一個牛仔,也有可能成長為一個工匠。一個牛仔能夠立即開始編碼。也就是說,一個牛仔可以以很快的速度構建一個軟件應用程序。然而,作為一個牛仔,其問題在于軟件必須要進行長期的維護。
一個工匠則是很有忍耐性的。一個工匠總會精雕細琢地開發一款軟件。一個工匠總是非常仔細地構建單元測試,并使之涵蓋一個應用程序中所有的代碼。因此,一個工匠要花費更長的時間才能創建成功一款應用程序。然而,此應用程序在創建后,卻是易于后期的維護—更易于修改錯誤且更易于把新特征添加到應用程序中。
9、 總結
總之,我們的最終目標是構建一個MVC論壇應用程序,此程序能夠經得起長時間的測試。它應該是不僅現在良好地工作,還應該在未來繼續工作—即使是當有人需要對該應用程序進行更改之時。
我想利用微軟ASP.NET MVC框架開發此論壇應用程序。原因在于,這個框架可以使我更容易地編寫程序的測試代碼。而另一方面,ASP.NET MVC框架本身就從設計之初提供了對測試驅動開發的最忠誠的支持。
【編輯推薦】