2009年5月5日
五、架構(gòu)的技術(shù)層面
(一)基礎(chǔ)手段
提高開發(fā)效率和品質(zhì)的基本手段是分解——即充分的分離系統(tǒng)中不同的關(guān)注點,好處不用說了,可以并發(fā)的工作,每個人面對的問題都簡單而容易操作。而與分解對應(yīng)的集成,只有提供了好的集成能力,分解才成為現(xiàn)實,而只有分解了,才能清晰的提供業(yè)務(wù)更多適應(yīng)性。
分解和集成的手段分為編程語言和技術(shù)框架兩個層面。所謂語言就是強(qiáng)框架,而框架就是弱語言。
A. 開發(fā)語言
現(xiàn)代面向?qū)ο蟮恼Z言提供如下能力:抽象和派生能力,以及接口隔離能力。實際提供兩種分解和集成能力:
1. 把邏輯分解在兩個層次中,而通過繼承的方式把兩個部分集成在一起。
2. 把邏輯的外觀和實現(xiàn)分解在兩個地方,而通過接口實現(xiàn)的方式把兩部分集成在一起。
另一種語言AspectJ或者C#語言2.0之后提供的特性:把流程邏輯,分解在不同的地方,而通過簽名匹配,利用代碼生成的方式來把幾部分集成在一起。
B. 應(yīng)用框架
然而語言提供的集成能力,畢竟底層,而且有限,擴(kuò)展起來也格外小心。因而技術(shù)框架提供另外的集成能力就格外重要:
1. 對象關(guān)聯(lián)關(guān)系的分解和集成,如Spring提供容器管理能力
依賴注入對于依賴關(guān)系是適合的,對于服務(wù)間,技術(shù)層次間都是適合的(因為無狀態(tài));但對于聚合(整體和部分)的關(guān)系——主要是領(lǐng)域模型(有狀態(tài)的)——則不合適;
2. 模塊間關(guān)聯(lián)關(guān)系的分解和集成,如OSGi,ESB等
3. 流程邏輯的分解和集成,如Spring Web Flow以及jBPM。
4. 不同系統(tǒng)的類型分解和集成,如Spring利用動態(tài)代理提供的Exporter模式。
5. 模式的封裝集成,設(shè)計應(yīng)當(dāng)是面向服務(wù)的設(shè)計,但是服務(wù)的暴露方式以及模式可以有很多種,比如API,Web Service,RMI,以及Command模式,Event模式等,框架應(yīng)該利用動態(tài)代理等技術(shù)對于這些服務(wù)暴露方式,模式進(jìn)行封裝。
C. 分析設(shè)計
設(shè)計中涉及到的組合方式,包括類(接口)組合,繼承組合以及產(chǎn)生組合三種。三種組合各有優(yōu)缺點,設(shè)計時適應(yīng)不同場合。這就涉及到現(xiàn)有面向?qū)ο蟮脑O(shè)計粒度:類(第一公民)和方法(二等公民)。
類(接口)組合實際上復(fù)用的是類一級粒度的設(shè)計,而繼承組合本質(zhì)上是一種有方向的組合,復(fù)用的方法一級粒度的設(shè)計,提供與或非的邏輯操作。而產(chǎn)生組合,例如AspectJ,也是在方法一級粒度的設(shè)計復(fù)用。
因為繼承組合復(fù)用在方法一級的粒度上,因而其更適合存在嵌入式,最低粒度的差異性的設(shè)計中,借助于虛擬機(jī)的支持,無需額外工作。而類(接口)在類一級上,更適合在更高一級的邏輯復(fù)用上;其實不一定需要接口,普通的類也可以,但是在這一級粒度的差異性替換,采用接口優(yōu)于類,因此稱為類(接口)組合;接口是類(接口)組合的編碼需要;對于接口一級,需要通過框架的集成和適配來提供差異性的設(shè)計。產(chǎn)生組合其實也是在方法一級,不過更關(guān)注于廣泛的橫切面,同時由于現(xiàn)有的語言對它的支持不同,Java需要額外的編譯器,而.Net則是在內(nèi)置編譯器上支持。
更高一級的組合是組件組合。對于組件邊界的設(shè)計,遵從兩點:嚴(yán)格把關(guān)設(shè)計和代碼優(yōu)先。接口優(yōu)先的設(shè)計通常導(dǎo)致成本太高,實踐中會導(dǎo)致開發(fā)人員在項目的進(jìn)度壓力下把代碼寫在不合適的地方。
D. 開發(fā)方式
常見的開發(fā)方式可以歸結(jié)為3類:開發(fā)式編程(Programmatic programming),聲明式編程(Declarative programming)和產(chǎn)生式編程(Generative programming)。
開發(fā)式編程 |
聲明式編程 |
產(chǎn)生式編程 |
|
開發(fā)手段 |
編碼。 如:Java, C# |
解析。 如:ANT(spring等的xml不一樣,它們是靜態(tài)描述型的,不那么verb) |
生成。 如:AOP(AspectJ),DSL(Drools) |
開發(fā)性質(zhì) |
聚合 |
聲明 |
組合 |
代表事物 |
接口 |
N/A |
DSL 自然語言的表達(dá)能力很強(qiáng)大,雖然說有時具有二義性,但是在特定領(lǐng)域下是確定的,既然是講DSL,那都是特定領(lǐng)域相關(guān)的,一定是明確的。 |
基礎(chǔ)設(shè)施 |
解析器; 編輯器,如jbpm; 元模型; |
生成器; 正統(tǒng)的需要編輯器; 元模型 |
|
開發(fā)方式 |
自上向下,聲明式編程是解析概念,用統(tǒng)一的概念來理解,把不同差異性交由具體程序解析; 編輯器生成的是xml文件,將由框架程序解析; 聲明式是粗粒度的(不能直接比較大小,定義的是無差異性的概念); |
自底向上,產(chǎn)生式編程用的思路是組合概念(用小粒度的概念組合生成大粒度的概念); 產(chǎn)生式生成程序代碼,不做解析運行; 產(chǎn)生式是相對細(xì)粒度的; |
E. 小結(jié)
通常語言作為架構(gòu)的基礎(chǔ),語言的設(shè)計帶來的好處遠(yuǎn)遠(yuǎn)高于框架和模式,但其引入和更換也是有巨大風(fēng)險的;而通過提供強(qiáng)大的框架能力,框架盡可能多的完成技術(shù)問題,并通過元數(shù)據(jù),模式以及約定降低業(yè)務(wù)和框架的耦合。避免因為框架升級帶來不必要的成本。
Meta Programming的最高層次是語言級別直接解決,比如,Smalltalk, Ruby, Python, 還有其他Reflection支持的非常好的語言。甚至STL等template技術(shù),也可以算作語言級別。 Code Generation 是最低級別的Meta Programming解決方案,技術(shù)含量也最低。這個級別必須超越,才能夠真正達(dá)到質(zhì)變,完全跳出概念炒作的層次。
從技術(shù)手段上,提高開發(fā)效率的另外兩個手段是代碼生成和類庫引用。但代碼生成和類庫引用,都只解決了邏輯的分解能力,沒有提供集成能力,所以一般情況下需要提供框架集成,尤其代碼生成需要在系統(tǒng)的最外層,避免集成帶來的問題。
代碼生成也沒有那么壞,關(guān)鍵在于生成什么,如果是生成結(jié)構(gòu)性的代碼,由于往往不是最終的產(chǎn)物,就存在同步維護(hù)問題;同時這種代碼是大都可以用template完成的。
但如果生成的是功能性代碼,這類代碼是最終執(zhí)行代碼,那么通常就把用于設(shè)計的代碼看作是最終產(chǎn)物,最明顯的例子是DSL。
(二)核心問題
1. 領(lǐng)域化
領(lǐng)域化,即領(lǐng)域建模。通常而言,領(lǐng)域模型設(shè)計中,模塊分解,抽象分層和職責(zé)分層都是重要手段。問題域為:流程,領(lǐng)域模型和領(lǐng)域服務(wù)(包括規(guī)則)。
a. 對象的抽象分解和集成
b. 對象的依賴分解和集成(模塊內(nèi)和模塊外)
c. 流程的分解和集成(頁面流,工作流以及計算流程)
d. 進(jìn)程邊界:用戶請求重定向,以及業(yè)務(wù)數(shù)據(jù)持久化等。
對于中等項目來說,系統(tǒng)中應(yīng)該有50-100個領(lǐng)域?qū)ο蟠砹藰I(yè)務(wù)抽象;
2. 組件化
面向?qū)ο笳Z言本身沒有提供的組件級別的依賴關(guān)系集成能力。語言不提供,因為領(lǐng)域組件的粒度太大,超越了語言的范疇。但我們可以通過框架提供,在Java體系中,目前已經(jīng)有兩個較好的解決方案:OSGi(JSR291)和SCA。可以很好的解決組件服務(wù)依賴關(guān)系管理,包括熱替換。
同時另一個問題——邏輯分層的問題:如保險產(chǎn)品面臨的核心層,國家層以及公司層三個邏輯層次分解和集成能力。這點的解決方案可以通過OSGi + Spring來解決,包括了靜態(tài)差異性替換和動態(tài)差異性替換。
還有組件邊界保護(hù)問題,我們希望限制別的組件訪問本組件內(nèi)部實現(xiàn),有兩種手段可以完成,1是提交/部署時,通過在代碼提交時的代碼檢查工具,或者發(fā)布時編譯工具完成;2是通過OSGi的邊界限制能力。
3. 產(chǎn)品化
A. 定制化支持
領(lǐng)域定制化涉及到邏輯替換問題。邏輯的替換根據(jù)開發(fā)方式不同,有兩種類型:基于接口和基于繼承;
A. 基于接口(包括了靜態(tài)替換和動態(tài)替換)
1. 靜態(tài)替換是Override,在OSGi中只要停止原有服務(wù),啟用新服務(wù)即可,而在Spring中更改相應(yīng)配置文件即可;
2. 動態(tài)替換,其實是指運行時Condition Service Locator,在OSGi中可以利用Extension Point(Plug-in)解決,而Spring中只要提供一個類似Service Locator就可以。
B. 基于繼承(或者靜態(tài)類)
1.開發(fā)時,直接修改源代碼編譯;
2.編譯時,采用AspectJ,在編譯時提供替換;
3.加載時,開發(fā)一個新邏輯的同名類,但其加載路徑優(yōu)先于原有類;
B. 升級支持
主要是增量升級支持,以及有限的降級支持。同時要考慮到對于定制化產(chǎn)品的升級支持。
4. 平臺化
A.基礎(chǔ)設(shè)施
基礎(chǔ)設(shè)施包括:類庫和框架?;A(chǔ)設(shè)施可以自己開發(fā),或者應(yīng)用第三方(開源商業(yè))實現(xiàn)。
A1. 基礎(chǔ)設(shè)施的選型
應(yīng)考慮幾點:1. 商業(yè)角度的可維護(hù)性和可升級性;2. 組織的學(xué)習(xí)和管理能力;3. 基礎(chǔ)設(shè)施自身功能以及所支持的開發(fā)效率。以下是詳細(xì)要求:
客戶角度 |
|
成熟度要求 |
基礎(chǔ)設(shè)施是業(yè)界成熟方案; |
性能要求 |
基礎(chǔ)設(shè)施滿足系統(tǒng)運行的性能要求; |
穩(wěn)定性要求 |
基礎(chǔ)設(shè)施版本穩(wěn)定,經(jīng)過大量測試; |
環(huán)境性要求 |
基礎(chǔ)設(shè)施不會帶來額外的軟硬件兼容要求; |
管理角度 |
|
開發(fā)成本要求 |
基礎(chǔ)設(shè)施的開發(fā)維護(hù)成本低,最好是業(yè)界成熟開源成果; |
開發(fā)效率要求 |
基于該基礎(chǔ)設(shè)施的應(yīng)用開發(fā)效率高; |
維護(hù)成本要求 |
分析設(shè)計與開發(fā)之間的銜接性好; |
測試成本要求 |
基于該基礎(chǔ)設(shè)施的應(yīng)用測試成本低,效率高; |
培訓(xùn)招聘成本要求 |
網(wǎng)絡(luò)上的參考資料豐富性;基礎(chǔ)設(shè)施的流行度; 內(nèi)部員工學(xué)習(xí)培訓(xùn)成本低; 招聘外部員工成本低; |
A2. 基礎(chǔ)設(shè)施的集成
基礎(chǔ)設(shè)施獨立后,出現(xiàn)平臺化的發(fā)展趨勢,這個趨勢有兩個方向:通用化和專業(yè)化。通用化意味著基礎(chǔ)設(shè)施和應(yīng)用的距離加大,易用性減低;而專業(yè)化意味著適應(yīng)性的減少。這是一個矛盾體。在基礎(chǔ)設(shè)施選型后,再進(jìn)行一定集成工作,可以結(jié)合當(dāng)前情況,平衡易用性和適應(yīng)性;同時合適的集成也有助于隔離技術(shù)和業(yè)務(wù)兩個方面。
從維護(hù)升級角度看集成的合適性:對于沒有標(biāo)準(zhǔn)的,不要做不必要的封裝,封裝等于是建立一個標(biāo)準(zhǔn),而這是不現(xiàn)實的;應(yīng)當(dāng)盡可能采用框架方式,屏蔽基礎(chǔ)設(shè)施對于應(yīng)用程序的侵入性。如果是標(biāo)準(zhǔn),就更沒有必要封裝,畫蛇添足。
B.業(yè)務(wù)支持
B1. 基本原則和手段
基本原則是:應(yīng)用程序POJO化。減少技術(shù)對于業(yè)務(wù)侵入性。主要手段是:容器上下文;依賴注入;AOP技術(shù);元數(shù)據(jù)支持;事件機(jī)制;開發(fā)工具和代碼生成;
依賴注入+AOP+元數(shù)據(jù)構(gòu)成了簡單對象(POJO)的支撐技術(shù)?;诖巳灰惑w的技術(shù)可以有效的隔離業(yè)務(wù)問題和技術(shù)問題,更為甚者它可以支撐簡單對象體系,每個對象做且只做一件事。
B2. 開發(fā)模式與最佳實踐
基礎(chǔ)平臺應(yīng)該提供業(yè)務(wù)相關(guān)的模式封裝。
B3. 關(guān)于元數(shù)據(jù)
元數(shù)據(jù)有多種:語言級別為Annotation(微軟.NET為Customer Attribute);框架級別可以是XML文件或者其它配置文件。
元數(shù)據(jù)可以通過以下幾個視角觀察
1. 應(yīng)用層次:元數(shù)據(jù)代表了業(yè)務(wù)含義和技術(shù)含義;
2. 技術(shù)分析:文檔類型(開發(fā)管理型);編譯類型(類加載型);運行期行為。
3. 物理分析,包括Annotation和接口,XML文件,甚至是EL和類。
元數(shù)據(jù)系統(tǒng)的建立其實是代表了認(rèn)知過程。
以運行期的元數(shù)據(jù)為例,代表了系統(tǒng)通過反射獲取相關(guān)元數(shù)據(jù)來自適應(yīng)系統(tǒng),其實際意義在于將軟件設(shè)計開發(fā)人員對于系統(tǒng)的認(rèn)知通過技術(shù)手段固化下來。
元數(shù)據(jù)系統(tǒng)的開發(fā)目的有兩個:
1. 業(yè)務(wù)應(yīng)用上,提供業(yè)務(wù)動態(tài)能力;
2. 技術(shù)應(yīng)用上,簡化開發(fā)減低成本;
這里面有一個誤區(qū)是:為了技術(shù)應(yīng)用而過分地開發(fā)元數(shù)據(jù)系統(tǒng),而隨著業(yè)務(wù)的演化導(dǎo)致為技術(shù)應(yīng)用的元數(shù)據(jù)迅速被拋棄,導(dǎo)致投入的浪費。實踐中要避免。
(三)應(yīng)用問題
1.事務(wù)管理
A. 成熟的事務(wù)技術(shù):如數(shù)據(jù)庫;
B. 合理的并發(fā)設(shè)計控制;
C. 完整的業(yè)務(wù)日志;這也是解決業(yè)務(wù)回退的主要手段;
D. 輔助的數(shù)據(jù)校驗?zāi)芰Γ?/span>
并發(fā)設(shè)計控制和完整的業(yè)務(wù)日志,是架構(gòu)設(shè)計中保障數(shù)據(jù)一致性主要著力點。并發(fā)設(shè)計控制,需要結(jié)合業(yè)務(wù),通過悲觀鎖定來保障。
而業(yè)務(wù)日志的獲取則面臨著諸多困難,主要是業(yè)務(wù)事務(wù)和物理事務(wù)的不一致性(即一個業(yè)務(wù)事務(wù)可能橫跨多個物理事務(wù),也可能一個物理事務(wù)包括多個業(yè)務(wù)事務(wù));業(yè)務(wù)日志控制層面有兩個:應(yīng)用系統(tǒng)或基礎(chǔ)設(shè)計;通過應(yīng)用系統(tǒng)編碼控制,則不可避免的提高了應(yīng)用系統(tǒng)開發(fā)和測試的成本;通過基礎(chǔ)設(shè)施控制,有助于減低成本,但提高基礎(chǔ)設(shè)施的設(shè)計成本;
2.并發(fā)處理
分析業(yè)務(wù)所涉及的并發(fā)場景,制定相應(yīng)的原則和方法,并合理選用現(xiàn)有的并發(fā)處理框架,進(jìn)行一定程度的剪裁,通過框架支持和簡化這些原則和方法的實踐。
3.系統(tǒng)分解
基于應(yīng)用的層面的分解,有多個緯度,包括:業(yè)務(wù)抽象度,業(yè)務(wù)任務(wù),業(yè)務(wù)產(chǎn)品線,以及業(yè)務(wù)領(lǐng)域等等。
4.集成能力
軟件開發(fā)的適應(yīng)性在于分解粒度的大小,而分解粒度大小取決于集成能力。
1)依賴管理
在技術(shù)的角度看,軟件系統(tǒng)是一個存在大量依賴關(guān)系的對象系統(tǒng)。其中包括了兩種依賴:
1.業(yè)務(wù)代碼的對象依賴;比如調(diào)用一個工廠類創(chuàng)建一個對象。
2.業(yè)務(wù)代碼的環(huán)境依賴;它可能依賴于一個Web環(huán)境(讀寫Request和Response流),數(shù)據(jù)庫系統(tǒng)(讀寫數(shù)據(jù)記錄),文件系統(tǒng)和網(wǎng)絡(luò)系統(tǒng)等。
不幸的事是這種代碼量占據(jù)了大量的開發(fā)工作。重復(fù)的開發(fā)工作(對象或者數(shù)據(jù)的依賴關(guān)系維護(hù)工作)減低了開發(fā)效率和系統(tǒng)適應(yīng)變化的能力。
而這樣復(fù)雜依賴關(guān)系也給軟件的測試帶來了相當(dāng)大的困難需要搭建足夠的依賴環(huán)境(如一臺Web服務(wù)器和數(shù)據(jù)庫服務(wù)器),甚至是硬調(diào)試。
于是就有了采用第三方代碼來完成依賴關(guān)系維護(hù)工作的思路,所謂的依賴注入。業(yè)務(wù)對象出現(xiàn)Spring等著名框架
動態(tài)代理技術(shù)則解決了提供支撐環(huán)境封裝的問題。比如提供網(wǎng)絡(luò)訪問能力(如RMI,URL和Web Services),文件訪問能力(如xml、property文件讀寫)。
由于企業(yè)開發(fā)中數(shù)據(jù)庫技術(shù)的應(yīng)用不可避免,因而ORM框架的出現(xiàn)還有特別的意義,在它的支撐下,核心業(yè)務(wù)西可以嚴(yán)格區(qū)別領(lǐng)域邏輯和業(yè)務(wù)邏輯,而這在以前是做不到的。
AOP開發(fā)的出現(xiàn)解決了面向?qū)ο笙碌臋M向組織關(guān)系。從一定程度上看,AOP可以看作是另一種依賴關(guān)系,可以另外依賴注入來實現(xiàn)。當(dāng)然也可以采用編程實現(xiàn)。
2)數(shù)據(jù)對象
說起集成,就不得不提到一種類型的對象存在——VO對象。
VO對象是為了集成而存在的;其意義是:1. 保護(hù)系統(tǒng)的信息邊界,提供一種結(jié)構(gòu)可以使其它系統(tǒng)或者組件通過編碼方式獲取系統(tǒng)內(nèi)信息的方式;2. 保護(hù)系統(tǒng)的事務(wù)邊界,領(lǐng)域?qū)ο蠹夹g(shù)上攜帶著持久化信息,通過VO可以屏蔽得以屏蔽。常見的VO對象存在于Web層和Domain層。
因此,VO對象的存在只是為了集成而存在,其是否存在的取決于兩個方面1. 集成的設(shè)計結(jié)構(gòu);2. 框架的兩個能力——對象路徑訪問能力以及事務(wù)邊界管理。
Domain層VO對象,通常是用于不同領(lǐng)域組件間的交互,但隨著架構(gòu)的改進(jìn),集成代碼獨立存在而不再嵌入到組件內(nèi)部,組件的邊界問題保護(hù)不復(fù)存在;更進(jìn)一步的是,框架提供自動化的接口適配映射能力的增強(qiáng)。因而VO對象失去存在的意義。
Web層VO對象,以SWF為例,早在SWF 1.x時代,框架就提供了豐富的對象路徑訪問能力,但其Web交互是典型的MVC2方式,事務(wù)邊界在view的render前關(guān)閉,因而導(dǎo)致需要特定的VO對象來避免持久化信息問題;而SWF 2.x時代,view的render是在事務(wù)邊界內(nèi),VO不再需要。
系統(tǒng)設(shè)計是一種結(jié)構(gòu)化過程,邏輯和數(shù)據(jù)被分解和集成到系統(tǒng)的各個部分;在運行期,真正重要的是結(jié)構(gòu)化路徑訪問能力,換句話說重要的是結(jié)構(gòu)化后的路徑,而實際用何種數(shù)據(jù)結(jié)構(gòu)其實不重要。
可以使用數(shù)據(jù)樹Data Tree形式,提供扁平化的數(shù)據(jù)訪問能力,是一種較好的開發(fā)方式,極大的提升了開發(fā)效率。Spring Web Flow以及其它框架廣泛的運用EL提供統(tǒng)一的表達(dá)式訪問數(shù)據(jù),也大大降低了開發(fā)成本。
3)事件機(jī)制
事件機(jī)制應(yīng)用非常廣泛,是很重要的集成手段。事件機(jī)制的優(yōu)勢在于其提供了松散耦合而帶來的擴(kuò)展能力?;趥鹘y(tǒng)事件模式,可以擴(kuò)展提供同步/異步,事務(wù)隔離等額外控制能力。
4)組件設(shè)計
一個組件包括了API和SPI,其中API是用于客戶方編程,SPI用于服務(wù)方編程(屬于框架回調(diào))。無論是API和SPI都是該組件所有,體現(xiàn)了一個組件自身的完備性。其與其它組件依賴通過集成模塊完成,依賴解藕。
組件的設(shè)計還分層次,上層組件的邏輯依賴下層組件,上層組件直接訪問下層組件的服務(wù)和模型,保持單向依賴有助于降低開發(fā)和維護(hù)成本。而平級組件,由于組件的替換可能性大,因而保障組件邊界完整性尤為重要。
接口的實現(xiàn)是關(guān)鍵。面臨的問題是,在開發(fā)初期需求不確定和經(jīng)驗不足的情況下,接口的設(shè)計不盡合理,導(dǎo)致需求變動后,所進(jìn)行的修改將影響三個方面,接口、接口實現(xiàn)對象和測試用例。工作量將可能很大。特別是在并行開發(fā)過程中,一個通訊接口的變化將可能引起很大連鎖反應(yīng),導(dǎo)致其他成員不得不停下手上的工作。
因而在實際開發(fā)中需要做個權(quán)衡。不同模塊的通訊接口應(yīng)該由團(tuán)隊成員共同負(fù)責(zé),一旦接口變化,接口實現(xiàn)成員應(yīng)該提供相應(yīng)的假實現(xiàn)。而模塊內(nèi)部可以由開發(fā)人員自行設(shè)計,可以在初期不提供接口和簡單的測試用例,在項目具有一定穩(wěn)定性后,利用重構(gòu)實現(xiàn)接口和完整的測試用例。
有效定位系統(tǒng)錯誤。尤其在組件化和分層化,以及其它開發(fā)手段混合運用情況下。例如,A,B,C。由于C引起的錯誤導(dǎo)致A錯誤是很難查的。代價很高。
5)膠水層
膠水層代碼屬于集成范疇。它是系統(tǒng)開發(fā)中不可避免的。膠水層代碼的存在增加了設(shè)計、開發(fā)和測試的成本。因盡量減少膠水層代碼的人工開發(fā)。
膠水層代碼有兩種類型:一是適配器,二是開發(fā)模式。
適配器對于集成來說并不陌生。適配器從用途上分可以分為兩種:業(yè)務(wù)適配和技術(shù)適配。業(yè)務(wù)適配是指處理應(yīng)用程序接口的適配調(diào)用,消除應(yīng)用程序的耦合度;技術(shù)適配是指處理應(yīng)用程序和技術(shù)框架上,消除技術(shù)框架的耦合度。
開發(fā)模式是指基礎(chǔ)平臺對于應(yīng)用開發(fā)的支持減少無效代碼,例如采用ORM系統(tǒng)(如Hibernate)以及有狀態(tài)的Web層框架(如Seam和SWF)可以有效減少應(yīng)用系統(tǒng)處理數(shù)據(jù)(對象)狀態(tài);以及各種元數(shù)據(jù)的識別和增強(qiáng)。
6)集成階段
根據(jù)階段分為:設(shè)計時, 編譯(加載)時和運行時。設(shè)計時是由人工編碼,通常就是一些特定業(yè)務(wù)代碼,完成集成工作;編譯時集成工作通常指配置文件,由程序員提供,但不需要編碼工作;而運行時指通過指定元數(shù)據(jù),由框架運行時解析;
5.部署方式
部署有兩種:本地部署和分布式部署。
分布式部署會帶來額外的問題。如果支持分布式部署,有兩種方案:
1. 前后端分離方案
傳統(tǒng)EJB方案就是此種。面臨的問題和風(fēng)險:
a) 部署成本,即分布部署帶來開發(fā)成本;
包括:分布式調(diào)用;分布式事務(wù)管理;開發(fā)模式(即上下文的傳遞)。
b) 運行成本,即分布式數(shù)據(jù)傳輸性能問題;
2. 采用Portal或類似技術(shù)
(四)設(shè)計問題
設(shè)計文檔依然有用,采用Color UML有助于閱讀。
面向?qū)ο筇峁└鞣N關(guān)系的表達(dá)能力:關(guān)聯(lián),依賴,集成,組合等;類似于數(shù)據(jù)庫表關(guān)系,但是更強(qiáng)烈。在設(shè)計時需要注意表現(xiàn)。
新的開發(fā)方式,應(yīng)該可以通過代碼記錄分析設(shè)計的成果,形成系統(tǒng)中一個穩(wěn)定的可發(fā)展的抽象層次代碼,而開發(fā)實現(xiàn)則繼承或者適配該抽象層次,最終保證系統(tǒng)可運行性。
這樣知識層面的分析設(shè)計可以有效貫徹發(fā)展,而操作層面的開發(fā)實現(xiàn)可以關(guān)注于實現(xiàn)過程的工具和手段。這樣就可以確保設(shè)計是做正確的事,而開發(fā)過程提供各種框架工具則把事做更有效率。
六、架構(gòu)的展示
1.兩個要素
架構(gòu)要展示的兩個基本要素是:業(yè)務(wù)和技術(shù)組件。而業(yè)務(wù)又可分為組件和功能兩個層次,技術(shù)又可分為基礎(chǔ)平臺與組件所需提供工件兩個部分。
后續(xù)所有展示都圍繞此二要素。
2.核心視圖
由RUP貢獻(xiàn)的四個視圖是架構(gòu)展示的核心視圖。
邏輯視圖(靜態(tài)類圖)
關(guān)注功能,不僅包括用戶可見的功能,還包括為實現(xiàn)用戶功能而必須提供的"輔助功能模塊";它們可能是邏輯層、功能模塊等。
應(yīng)映射為業(yè)務(wù)組件、功能包以及技術(shù)工件(分層),以及它們之間關(guān)聯(lián)依賴關(guān)系;
開發(fā)視圖(靜態(tài)類圖)
關(guān)注程序包,不僅包括要編寫的源程序,還包括可以直接使用的第三方SDK和現(xiàn)成框架、類庫,以及開發(fā)的系統(tǒng)將運行于其上的系統(tǒng)軟件或中間件。
開發(fā)視圖和邏輯視圖之間可能存在一定的映射關(guān)系:比如邏輯層一般會映射到多個程序包等。
應(yīng)映射為具體的SDK和框架等,以及關(guān)聯(lián)依賴關(guān)系;注:開發(fā)視圖應(yīng)盡可能和邏輯視圖一一對應(yīng);
處理視圖(動態(tài)類圖)
關(guān)注進(jìn)程、線程、對象等運行時概念,以及相關(guān)的并發(fā)、同步、通信等問題。
處理視圖和開發(fā)視圖的關(guān)系:開發(fā)視圖一般偏重程序包在編譯時期的靜態(tài)依賴關(guān)系,而這些程序運行起來之后會表現(xiàn)為對象、線程、進(jìn)程,處理視圖比較關(guān)注的正是這些運行時單元的交互問題。
可映射為狀態(tài)圖和活動圖(高層和詳細(xì));
物理視圖(部署視圖)
關(guān)注"目標(biāo)程序及其依賴的運行庫和系統(tǒng)軟件"最終如何安裝或部署到物理機(jī)器,以及如何部署機(jī)器和網(wǎng)絡(luò)來配合軟件系統(tǒng)的可靠性、可伸縮性等要求。
物理視圖和處理視圖的關(guān)系:處理視圖特別關(guān)注目標(biāo)程序的動態(tài)執(zhí)行情況,而物理視圖重視目標(biāo)程序的靜態(tài)位置問題;物理視圖是綜合考慮軟件系統(tǒng)和整個IT系統(tǒng)相互影響的架構(gòu)視圖。
可映射為組件圖,部署說明圖;
3.擴(kuò)展視圖
在核心視圖,針對于不同受眾,還需要提供三個擴(kuò)展視圖。
非功能視圖
展示非功能性指標(biāo)的支持能力。通常針對于技術(shù)人員。
基礎(chǔ)設(shè)施視圖
展示架構(gòu)所采用基礎(chǔ)設(shè)施,以及它們之間的關(guān)系。通常針對于技術(shù)人員。
數(shù)據(jù)視圖
關(guān)注于數(shù)據(jù)組織和存儲形式。通常針對于DBA,或者需對數(shù)據(jù)進(jìn)行定期維護(hù)的用戶。
4.原則和約束
架構(gòu)因明確說明本架構(gòu)采用原則、方法論以及相關(guān)約束。
5.技術(shù)選型分析
由于架構(gòu)涉及眾多底層技術(shù),也應(yīng)給出相應(yīng)的選型分析。