轉自 http://www.survivalescaperooms.com/daxnet/archive/2009/02/07/1686994.html
很多IT行業的讀者,如果有過一些面試經驗的,都會被問到一個經典問題:什么是類庫?什么是框架?兩者有什么關系?我語文不好,要我用一句話去概括這個問題,恐怕也有點難度。就在此多花點筆墨,多寫幾句吧。
首先要談到面向對象。為什么要面向對象?因為對象與其之間的關系能夠客觀地描述現實生活中的事物及其之間的關系。現實生活中的事物有如下特點:不同種類的事物,有著不同的屬性,也有不同的行為。各種類的事物之間、同種類的事物之間,又多少有些關系。不僅如此,事物與事物之間需要通信,也就是信息交流。顯然,傳統的面向過程的設計思想無法很好的描述這些現實問題。
為了能夠面向對象,我們就把多種事物進行種類抽象,抽象出來的東西形成“類”。各個事物種類之間的關系使用類之間的關系進行表述,這樣就形成一張類的關系網絡,也就是常說的類庫。
常見的類庫有:MFC,估計也是大家最熟悉的了;還有VCL,它有兩個版本,VCL for C++和VCL for PASCAL的。這兩種類庫都是非常經典的。此外還有標準C++的STL。在進行軟件開發的過程中,或許我們會覺得,即使有著豐富的類庫支持,也無法使我們大幅度提高開發效率:我們仍然需要花費大量的精力在基于類庫的基礎上開發著各種能夠重用或者再也無法重用的權限管理模塊、實時編譯系統、服務器調度策略等等。軟件開發過程一度陷入僵局。
在討論什么是“類庫”的時候,我們引出了一個棘手的問題,即使有了類庫支持,軟件開發也不是一件容易的事情。開發出來的模塊、系統如果能夠重用那還好說,但如果不能重用,那簡直就是一堆廢鐵,軟件開發效率沒有得到任何改善。
為此,人們針對不同的應用系統,在基于某一類庫的基礎上,開發出一套特定的框架,框架中包含了應用系統中的“不變因素”,并為“可變因素”留出位置,今后只需要在“可變因素”的位置上部署功能模塊,就可以實現不同的應用系統需求。 舉例來說,對于圖書管理系統、門市銷售系統這些小型MIS系統而言,雖然服務的業務領域不同,業務流程也有很大區別,但是,這些系統都需要有用戶管理、權限設置、報表輸出、查詢界面等基礎模塊。假如有一套框架能夠提供這部分功能,那么在進行進一步的系統開發時,就可以大大提高開發效率。 由此可見,框架是一種半成品,也可以看成是軟件核心實體(業務實體)的運行環境,它為軟件系統提供了各種服務,脫離業務實體而獨立存在的框架是無法獨立運行的,一點意義都沒有。 常見的框架有:.NET Framework、基于.NET Framework上的DotNetNuke、NHibernate、NUnit,基于NHibernate上的Castle ActiveRecord、Microsoft Dynamics AX ERP系統、各種操作系統等。
日常生活中,框架也無處不在,最典型的就是我們平常玩的游戲機,它本身就是一個框架,沒有安插游戲卡或者游戲光盤的時候,一點意義都沒有,它為游戲提供了運行環境,不同的游戲卡帶中包含了不同的游戲內容
模式的范圍很大。模式分為設計模式、體系結構模式和慣用法[POSA1]。正如唐俊所說,模式是實踐經驗的總結,也是一種設計思想的表述形式。在對待模式的態度上,我認為我們不應該抱著學習的態度,而應該抱著“了解”的態度。因為它是經驗的總結,不是靠讀書學習就能得到的東西。“在做軟件設計的時候,每個人都想使用某種模式來提高軟件的韌度,卻不是每個人都知道,在他的設計中,已經采用了這種模式”,談不談模式其實都無所謂,只要你能說出你所設計的系統到底好在什么地方。
模式貫穿于類庫中,更多的是設計模式,例如,其中的模版方法(Template Method)模式應用非常廣泛。模式貫穿于框架中,更多的是體系結構模式,例如分層模式、Broker模式等。模式為設計人員解決現實問題提供了經驗參考,它更不可能是可以直接拿來使用的代碼。有時候,解決某個問題需要多種模式的配合,比如在實現ORM時,分層、橋、虛代理、模版方法等各種模式都會被涉及到。 模式貫穿于各行各業,建筑有建筑模式、軟件設計有設計模式、體系結構模式,商業運作有商業模式、盈利模式。我們的確應該正視模式的重要作用,而不要將其當作是一種炫耀自己的手段。
新聞熱點
疑難解答