上一篇我們說到了稚晚,早年單機程序最麻煩的事情就是繪制控件崇堵,把界面做美觀不容易。當時上網(wǎng)還需要撥號客燕,而且費用昂貴鸳劳,互聯(lián)網(wǎng)的基礎(chǔ)設(shè)施還沒有完善。主流的軟件公司都在為企業(yè)開發(fā)軟件也搓。
企業(yè)軟件一般都要多人來使用赏廓,所以就催生了C/S架構(gòu)的誕生。早先就是單機客戶端訪問一個共同的數(shù)據(jù)庫傍妒,這樣就做到了所有人數(shù)據(jù)的共享幔摸。
C/S架構(gòu)首先碰到的問題就是不同生產(chǎn)商數(shù)據(jù)庫的訪問問題,不解決這個問題颤练,單機客戶端早晚就得耦合各種數(shù)據(jù)庫的特殊代碼既忆。說個題外話,大家可能覺得用一個單一數(shù)據(jù)庫不就沒問題了嗦玖,但是現(xiàn)實場景中患雇,企業(yè)的采購會盡量避免單一化,如果你做的軟件想迎合大多數(shù)客戶踏揣,這個問題還真就是個問題庆亡。這可能也是企業(yè)軟件和互聯(lián)網(wǎng)軟件業(yè)務(wù)需求的很大不同。
解決這個問題的主流方案有兩個捞稿,分別是ODBC和JDBC又谋。其實兩者都采用了Driver驅(qū)動模式。驅(qū)動模式很簡單娱局,其實就是面向?qū)ο蟮慕涌诰幊趟枷胝煤ァO燃s定一個接口,然后各家廠商給出實現(xiàn)衰齐。系統(tǒng)具體訪問數(shù)據(jù)庫的時候任斋,根據(jù)配置信息來裝載不同的實現(xiàn),我們訪問數(shù)據(jù)庫只需要跟這個接口打交道就好了耻涛。
我們可以看到废酷,很多領(lǐng)域都采用了類似的模式瘟檩,比如我們用的Window系統(tǒng)經(jīng)常就會碰到要裝驅(qū)動,只要符合PCI接口的外設(shè)澈蟆,操作系統(tǒng)裝載這個設(shè)備的驅(qū)動后就可以使用墨辛。再比如Spring框架中的IOC,也是同樣的效果趴俘。我們只需要針對接口編程睹簇,不用關(guān)心具體實現(xiàn)方案。
針對C/S軟件的IDE有不少寥闪,PowerBuilder應(yīng)該是當時最流行的工具之一吧太惠。UI組件豐富,設(shè)計器拖拽生成界面疲憋,而且跟數(shù)據(jù)庫的數(shù)據(jù)結(jié)合自然凿渊,事件驅(qū)動腳本代碼,學(xué)習成本極低柜某。坦率的講嗽元,PB是到目前為止,我接觸過最易用的IDE之一喂击。
看起來C/S架構(gòu)軟件也還不錯剂癌,能滿足用戶需求,也有很好的IDE支撐翰绊,界面體驗也足夠好佩谷。但是,C/S架構(gòu)的軟件有一個天然的問題监嗜,就是邏輯代碼都在客戶端谐檀,迭代升級都需要用戶重新安裝,非常麻煩裁奇。
為了解決這個問題桐猬,大家想了各種方法。我們可以把客戶端的業(yè)務(wù)代碼抽取出來刽肠,用數(shù)據(jù)庫的存儲過程實現(xiàn)溃肪。這樣客戶端就只剩下界面展示和控制代碼。實際到今天為止音五,在企業(yè)舊的系統(tǒng)中惫撰,還能看到這個方案殘存的影子。
這個方案有什么缺點呢躺涝,第一厨钻,各廠商數(shù)據(jù)庫存儲過程標準并不統(tǒng)一,切換數(shù)據(jù)庫非常麻煩;第二夯膀,客戶端雖然只剩下界面展示代碼诗充,但是更新仍然很頻繁;解決問題一诱建,就需要我們在客戶端和數(shù)據(jù)庫之間再加一層其障,把業(yè)務(wù)邏輯從存儲過程中抽離出來,這樣數(shù)據(jù)庫就只負責數(shù)據(jù)存儲和查詢涂佃,切換變得簡單;解決問題二蜈敢,如果客戶端展示邏輯也能由服務(wù)器端下發(fā)辜荠,客戶端變?yōu)楹鼙〉倪\行層是否就能解決。如果這個展示邏輯統(tǒng)一為Html標準抓狭,運行層統(tǒng)一為瀏覽器伯病,大家看一下,這是不是就是B/S的基本框架否过。
B/S架構(gòu)能有效解決C/S架構(gòu)出現(xiàn)的問題午笛,而且隨著互聯(lián)網(wǎng)基礎(chǔ)設(shè)施的逐步完善,軟件從服務(wù)企業(yè)內(nèi)部客戶苗桂,逐漸變?yōu)榉?wù)大眾用戶药磺。普通大眾對軟件的可用性和易用性要求會更高,給普羅大眾安裝客戶端變得極其困難煤伟,另外數(shù)據(jù)量越來越多癌佩,單臺數(shù)據(jù)庫也無法支撐。這一切的變化便锨,使得C/S架構(gòu)逐漸退出了歷史舞臺围辙。
C/S架構(gòu)雖然逐漸不再采用,但是基于UI組件的事件開發(fā)模式深入人心放案,一直以來姚建,各種方案層出不窮,期望用組件化抹平B/S界面繪制的復(fù)雜度吱殉,下一篇我們再聊掸冤。