架構(gòu)基礎(chǔ)(Frameworks Fundamentals)
Windows編程很適合面向?qū)ο缶幊,通過建立封裝通用Windows編程任務(wù)的類,一個(gè)程序員能編寫出更多的產(chǎn)品。例如,當(dāng)封裝窗口不同任務(wù)的類建立以后,這個(gè)類就可以一遍一遍地應(yīng)用,于是架構(gòu)革命就開始了。
New Term:架構(gòu)(framework)是一個(gè)類的集合,這些類可以通過封裝常用編程技術(shù)簡(jiǎn)化Windows編程,架構(gòu)也稱為類庫(class libraries),封裝(Encapsulation)的意思是通過提供一個(gè)簡(jiǎn)化的接口,把一個(gè)復(fù)雜的編程任務(wù)簡(jiǎn)單化。
普通的架構(gòu)有封裝窗口、編輯框、列表框、圖形操作、位圖、滾動(dòng)欄、對(duì)話框等類。
為什么如此重視架構(gòu)?
其根本在于用架構(gòu)使Windows編程比直接用C、匯編語言或Pascal語言更簡(jiǎn)便。例如用C++編寫的加載和顯示一個(gè)位圖的代碼多達(dá)50多行,代碼看起來很嚇人,而采用VCL實(shí)現(xiàn)等價(jià)的功能的代碼:
Image.LoadFromFile('winnt.bmp');
由此看出你到底喜歡哪一種方式?甚至都不必知道這個(gè)代碼到底干什么的就可以作出決定。VCL的版本更短,并且可讀性更強(qiáng)。
架構(gòu)隱藏了不必知道的具體細(xì)節(jié),那個(gè)50多行的C++代碼中包含的每一件事情在VCL代碼中都在幕后完成了。當(dāng)VCL工作時(shí),不必知道幕后工作的每一個(gè)具體細(xì)節(jié),所有要知道就是構(gòu)成架構(gòu)的對(duì)象,以及把它們應(yīng)用到程序中。
一個(gè)好的架構(gòu)要充分利用OOP,并且比其他的要利用的更好。Delphi中的Object Windows Library和Visual Component Library是面向?qū)ο缶幊痰臉O好示例,它們?yōu)閿[脫忙亂,集中精力完成重要的編程任務(wù)提供了恰到好處的抽象提升。
如果要使所有的東西都變得很容易的話,就一定要放棄一些東西,這時(shí)千真萬確的。由架構(gòu)編寫的程序比用低級(jí)語言編寫的程序要大而且要慢,這只是部分正確,由架構(gòu)編寫的應(yīng)用程序不一定比其它語言編寫的程序慢。當(dāng)然,用面向?qū)ο笳Z言有一些額外的內(nèi)部開銷,但絕大部分在一般的Windows程序中區(qū)別是不明顯的。
初步趨向是由Delphi編寫的程序比用諸如C等語言編寫的程序要大。例如,假設(shè)一個(gè)簡(jiǎn)單的Windows程序,由C編寫它是75KB,等價(jià)的程序用Delphi編寫可能是250KB,這看起來好像區(qū)別很大,但這個(gè)例子只說明了一種最壞的情況,在很小的程序中,C應(yīng)用程序與架構(gòu)編寫的Delphi應(yīng)用程序其程序大小區(qū)別很大,但隨著程序的規(guī)模增加和復(fù)雜化,這兩者之間的區(qū)別就不太明顯了。
程序大小不同的簡(jiǎn)單原因之一就是程序語言與面向?qū)ο笳Z言之間的不同,面向?qū)ο笳Z言(C++和Object Pascal)要為一些功能增加額外的開銷,其性能諸如異常處理,運(yùn)行時(shí)類型信息(RTTI)和其他OPP內(nèi)容。其實(shí)代碼大小的不同于Object Pascal提供的性能交換是值得的。
我也是很愿意犧牲一些代碼規(guī)模的大小來換取Object Pascal和VCL提供的強(qiáng)大功能。換句話說,一般不愿意花一個(gè)月的時(shí)間去編寫一個(gè)編譯成可執(zhí)行文件大小為100KB的Windows程序,而同樣的程序在Delphi只需要兩天時(shí)間,只是它編譯出來的可執(zhí)行文件大小為400KB,與節(jié)省開發(fā)時(shí)間相比,其結(jié)果的可執(zhí)行文件大小并不重要。
用架構(gòu)來引導(dǎo)面向?qū)ο缶帉懞驮O(shè)計(jì)
如果把這種瘋狂玩意就叫做Windows編程的話,那么實(shí)際上也就等于終止了窺視架構(gòu)的源代碼。遲早是要知道架構(gòu)是怎么工作的。從VCL源代碼中可以得到這種信息。
應(yīng)該花一些時(shí)間來瀏覽一下VCL源代碼,開始時(shí)可能有點(diǎn)令人生畏,但看了一會(huì)后,就會(huì)看懂設(shè)計(jì)者在做什么,不要低估自己,用所學(xué)的知識(shí)最大限度地理解Object Pascal,把一些復(fù)雜難懂的內(nèi)容先放下來,等以后再說。
要注意VCL設(shè)計(jì)者是怎樣在類中使用私有的、保護(hù)的和公用的,注意應(yīng)該不讓用戶知道的內(nèi)容是怎樣從公眾的視線中隱藏起來的。研究VCL源代碼可以學(xué)會(huì)很多有關(guān)Object Pascal和面向?qū)ο笤O(shè)計(jì)方面的知識(shí)。