2009-05-13 作者:coffeewoo 來(lái)源:coffeewoo的blog
軟件架構是一種思想,一個(gè)系統藍圖,對軟件結構組成的規劃和職責設定。而軟件框架是一個(gè)實(shí)現,一個(gè)半成品,是針對一個(gè)特定問(wèn)題的解決方案和輔助工具。
這一篇講軟件架構和軟件框架在UML設計過(guò)程中所起的作用。本系列文章不是專(zhuān)門(mén)討論軟件架構和軟件框架的,所以不會(huì )深入講怎么做軟件架構和軟件框架。另一個(gè)原因是筆者尚無(wú)這個(gè)自信能夠在這里班門(mén)弄斧講軟件架構。之所以要講,是因為在設計過(guò)程中,設計類(lèi)必然會(huì )受到軟件架構和框架的約束。從分析類(lèi)到設計類(lèi),軟件架構和框架是不得不考慮的一個(gè)重要因素。
軟件架構和軟件框架是一回事兒?jiǎn)??相信有相當一部分人搞不清楚這個(gè)問(wèn)題,也會(huì )有相當一部分人認為是一回事兒,只是不同的叫法而已。架構的英文原文是Architecture,而框架呢,則是Framwork。顯然這是兩個(gè)完全不同的詞兒。從技術(shù)上講,IT有一個(gè)職業(yè)是架構師,架構師代表了軟件技術(shù)人員最高的職業(yè)頂峰,卻從沒(méi)有聽(tīng)說(shuō)過(guò)有軟件框架師的。所以肯定的說(shuō),軟件架構和軟件框架是兩回事兒。
那么什么是軟件架構,什么又是軟件框架呢?軟件架構是一種思想,一個(gè)系統藍圖,對軟件結構組成的規劃和職責設定。而軟件框架是一個(gè)實(shí)現,一個(gè)半成品,是針對一個(gè)特定問(wèn)題的解決方案和輔助工具。因此,架構是一個(gè)邏輯的構成,而框架是一個(gè)可用的半成品。比如說(shuō),J2EE規范描述了一系列邏輯部件,描述了這些部件的職責和它們的規范,約定了這些部件之間交互的接口和協(xié)議、標準,規劃出一個(gè)如何利用這些邏輯部件來(lái)實(shí)現一個(gè)應用系統的藍圖。J2EE是一個(gè)軟件架構。而根據這一設想,各產(chǎn)商開(kāi)發(fā)出了各自的產(chǎn)品,包括開(kāi)發(fā)工具和應用容器,開(kāi)發(fā)者利用這些工具和容器就能方便的開(kāi)發(fā)出符合J2EE規范的應用程序。這些工具和容器就是軟件框架。再比如,MVC是一個(gè)設計模式,它將應用程序劃分為實(shí)體,控制和視圖三個(gè)邏輯部件,我們可以說(shuō)它是一個(gè)軟件架構。而Strus,JSF,WEBWork等分別以自己的方式實(shí)現了這一架構,提供了一個(gè)半成品,幫助開(kāi)發(fā)人員迅速地開(kāi)發(fā)一個(gè)符合MVC架構的應用程序,我們說(shuō)Strus,JSF,WEBWork是軟件框架。
在一個(gè)商業(yè)軟件的開(kāi)發(fā)過(guò)程中,如何去設定軟件的架構和框架,在設計過(guò)程中,軟件架構和框架又是如何影響設計的呢?
軟件架構在一個(gè)商業(yè)系統的開(kāi)發(fā)過(guò)程中,是由軟件架構師這一角色來(lái)完成的。架構師要從很高的角度,根據應用環(huán)境,用戶(hù)需求,公司技術(shù)發(fā)展要求等等來(lái)對這一個(gè)系統作出邏輯的劃分。例如是集中式還是分布式?采用什么中間件?采用何種技術(shù)體系?應用什么標準?符合什么規范?軟件的層次是什么?傳輸協(xié)議是什么?與公司其它產(chǎn)品如何銜接?如何使公司產(chǎn)生核心競爭力?可見(jiàn)一個(gè)架構師對一個(gè)公司的重要性。
可惜架構師這一角色在很大程度上被誤解,架構師這一稱(chēng)謂也被濫用。知道幾個(gè)設計模式,用過(guò)幾個(gè)框架,有過(guò)幾個(gè)中間件或應用服務(wù)器的經(jīng)歷,就號稱(chēng)是架構師了。也難怪有人說(shuō)架構師己死。掌握以上技能的,在我看來(lái),只是經(jīng)驗豐富的設計師而已。因為他能做的,只是應用現成的技術(shù)。架構師要做的,是發(fā)明J2EE規范,是創(chuàng )造SOA架構,是構架出領(lǐng)先于市場(chǎng)的技術(shù)產(chǎn)品,是領(lǐng)導軟件技術(shù)潮流,是引導軟件技術(shù)發(fā)展趨勢。這種差別,就如同科學(xué)家和工程師的差別。
因此,在一般的中小企業(yè)里,如果沒(méi)有領(lǐng)先于業(yè)界的產(chǎn)品,沒(méi)有引導了市場(chǎng)的思想,沒(méi)有稱(chēng)霸一方的應用領(lǐng)域,就不需要架構師這個(gè)角色,也產(chǎn)生不了架構師。有幾個(gè)高級設計師,能緊緊跟住技術(shù)潮流,把先進(jìn)技術(shù)玩兒轉并應用到自己的產(chǎn)品里,也就足夠了。也因此,在一般的商業(yè)系統開(kāi)發(fā)過(guò)程中,軟件架構這一個(gè)領(lǐng)域,最主要的工作是選擇適合自己的現成的軟件架構。換句話(huà)說(shuō)是用好現有的技術(shù)。比如,決定采用J2EE架構。再能做的一點(diǎn),是劃分軟件邏輯層次,決定使用的標準和規范。
作為例子,一個(gè)軟件架構和商業(yè)系統開(kāi)發(fā)過(guò)程中可以用這樣的形式來(lái)表述:
一個(gè)軟件架構的表述例子:
有的讀者可能會(huì )說(shuō),沒(méi)什么難的嘛,我也懂,我們的項目也是這樣做的。呵呵,是的,在很多人心目的,架構師做的可能就是這樣的工作??墒亲屑毾胂?,雖然懂得這么多已經(jīng)不容易了,可這樣的人并不少見(jiàn),那不就是滿(mǎn)天都是架構師了么?雖然這個(gè)工作的確是在做軟件架構,可是我認為并不能稱(chēng)為架構師,頂多是高級設計師,懂得如何應用現有技術(shù)而已。
好了,軟件架構已經(jīng)定下來(lái)了,現在該由設計師(實(shí)際上,絕大多數公司里的架構工作也是由設計師來(lái)做的)來(lái)決定每一個(gè)層次的具體框架設計了。下面的例子,是以Entity層作為例子來(lái)表述框架的。
Entity層框架的例子:
這個(gè)例子只給出了靜態(tài)圖。為了讓開(kāi)發(fā)人沒(méi)明白這個(gè)設計,還應當給出交互圖。例如,如果應用程序增加一個(gè)VO,Business層怎么調用EntityControl,EntityControl如何分解VO,怎么訪(fǎng)問(wèn)Relationship,怎么處理PO,怎么訪(fǎng)問(wèn)DBControl層。也就是這些框架基類(lèi)如何交互來(lái)完成業(yè)務(wù)要求。這個(gè)圖筆者就不再繪制了。建議有興趣的讀者設計自己的框架,并自己繪制這些交互圖。自己動(dòng)手認識會(huì )更深。
架構有了,框架也有了,對于設計類(lèi)來(lái)說(shuō),架構和框架形成了規范,設計類(lèi)必須遵守這些規范,并了解如何使用框架的接口。當然,這個(gè)架構和框架僅僅是一個(gè)例子,現實(shí)中的架構和框架可不僅僅這一點(diǎn),考慮的東西會(huì )更多,比如日志如何處理,事務(wù)如何處理,異常如何處理。每一個(gè)可能又都是一個(gè)框架。另外,如果選擇了某一個(gè)成熟產(chǎn)商的架構,例如Websphere,Weblogic,可能就不需要自己來(lái)設計架構和框架了,這些產(chǎn)品已經(jīng)提供了。
這一篇就到這里。下一篇本來(lái)是應當講如何從分析類(lèi)到設計類(lèi)的,不過(guò)覺(jué)得好象沒(méi)什么可講,因為框架既然規定了,并且正常的業(yè)務(wù)邏輯都已經(jīng)由框架處理了,分析類(lèi)轉化成設計類(lèi)應當是一件水到渠成的事情。筆者還在考慮下一篇該寫(xiě)些什么,就暫不預告了。