軟件架構(gòu)(software archivtecture)是軟件設(shè)計的高層部分,是用于支撐更細(xì)節(jié)的設(shè)計的框架。架構(gòu)也稱為“系統(tǒng)架構(gòu)/system architecture”、“高層設(shè)計/high-level design”或“頂層設(shè)計/top-level design”。
為什么要把架構(gòu)作為前期準(zhǔn)備呢?
因?yàn)榧軜?gòu)的質(zhì)量決定了系統(tǒng)的“概念完整性”。后者繼而決定了系統(tǒng)的最終質(zhì)量。一個經(jīng)過慎重考慮的架構(gòu)為“從頂層到底層維護(hù)系統(tǒng)的概念完整性”提供了必備的結(jié)構(gòu)和體系,它為程序員提供了指引——其細(xì)節(jié)程度與程序員的技能和手邊的工作相配,它將工作分為幾個部分,使得多個開發(fā)者或者多個開發(fā)團(tuán)隊可以獨(dú)立工作。
架構(gòu)的典型組成部分
很多組成部分是優(yōu)秀的系統(tǒng)架構(gòu)所共有的。
1.程序組織
系統(tǒng)架構(gòu)首先要以概括的形式對有關(guān)系統(tǒng)做一個綜述。
如果對某個類在系統(tǒng)中的角色沒有一個清晰的構(gòu)思,那么編寫這個類就是一件令人灰心喪氣的工作。描述其他組織結(jié)構(gòu),才能說明架構(gòu)最后選定的這種關(guān)系組織結(jié)構(gòu)的緣由并且表明各個類都是經(jīng)過慎重考慮的。
架構(gòu)應(yīng)該定義程序的主要構(gòu)造塊(building blocks)。根據(jù)程序規(guī)模不同,各個構(gòu)造塊可能是單個類,也可能是由許多類組成的一個子系統(tǒng)。每個構(gòu)造塊無論是一個類還是一組協(xié)同工作的類和子程序,它們共同實(shí)現(xiàn)一種高層功能,諸如用戶交互、顯示web頁面、解釋命令、封裝業(yè)務(wù)規(guī)則、訪問數(shù)據(jù)等等。每條列在需求中的功能特性(feature)都至少應(yīng)該有一個構(gòu)造塊覆蓋它。如果兩個或多個構(gòu)造塊聲稱實(shí)現(xiàn)同一項(xiàng)功能,那么它們就應(yīng)該相互配合而不會沖突。
應(yīng)該明確定義各個構(gòu)造塊的責(zé)任。每個構(gòu)造塊應(yīng)該負(fù)責(zé)某一個區(qū)域的事情,并且對其他構(gòu)造塊負(fù)責(zé)的區(qū)域知道的越少越好。通過使各個構(gòu)造塊對其他構(gòu)造塊的了解達(dá)到最小,你能將設(shè)計的信息局限于各個構(gòu)造塊之內(nèi)。
應(yīng)該明確定義每個構(gòu)造塊的通信規(guī)則。對于每個構(gòu)造塊,架構(gòu)應(yīng)該描述他能直接使用哪些構(gòu)造塊,能間接使用哪些構(gòu)造塊,不能使用哪些構(gòu)造塊。
2.主要的類
架構(gòu)應(yīng)該詳細(xì)定義所用的主要的類。
3.數(shù)據(jù)設(shè)計
架構(gòu)應(yīng)該描述所用到的主要文件和數(shù)據(jù)表的設(shè)計。
4.業(yè)務(wù)規(guī)則
如果架構(gòu)依賴于特定的業(yè)務(wù)規(guī)則,那么它就應(yīng)該詳細(xì)描述這些規(guī)則,并描述這些規(guī)則對系統(tǒng)設(shè)計的影響。
5.用戶界面設(shè)計
用戶界面常常在需求階段進(jìn)行詳細(xì)說明。如果沒有,就應(yīng)該在軟件架構(gòu)中進(jìn)行詳細(xì)說明。
架構(gòu)應(yīng)該模塊化,以便在替換為新用戶界面時不影響業(yè)務(wù)規(guī)則和程序的輸出部分。
6.資源管理
架構(gòu)應(yīng)該描述一份管理稀缺資源的計劃。稀缺資源包括數(shù)據(jù)庫連接、線程、句柄(handle)等。
7.安全性
架構(gòu)應(yīng)該描述實(shí)現(xiàn)設(shè)計層面和代碼層面的安全性的方法。如果先前尚未建立威脅模型(threat model),那么就應(yīng)該在架構(gòu)階段建立威脅模型。
8.性能
如果需要關(guān)注性能,就應(yīng)該在需求中詳細(xì)定義性能目標(biāo)。
9.可伸縮性
可伸縮性是指系統(tǒng)增長以滿足未來需求的能力。架構(gòu)應(yīng)該描述系統(tǒng)如何應(yīng)對用戶數(shù)量、服務(wù)器數(shù)量、網(wǎng)絡(luò)節(jié)點(diǎn)數(shù)量、數(shù)據(jù)庫記錄數(shù)、數(shù)據(jù)庫記錄長度、交易量等的增長。如果預(yù)計系統(tǒng)不會增長,而且可伸縮性不是問題,那么架構(gòu)應(yīng)該明確地列出這一假設(shè)。
10.互用性
如果預(yù)計這個系統(tǒng)會與其他軟件或硬件共享數(shù)據(jù)或資源,架構(gòu)應(yīng)該描述如何完成這一任務(wù)。
11.國際化/本地化(Internationalization/Localization)
“國際化”是一項(xiàng)“準(zhǔn)備讓程序支持多個locales(地域/文化)”的技術(shù)活動。
12.輸入輸出(Input/Output)
輸入輸出(I/O)是架構(gòu)中值得注意的另一個領(lǐng)域。
13.錯誤處理(Error Processing)
錯誤處理已被證實(shí)為現(xiàn)代計算機(jī)科學(xué)中最棘手的問題之一,你不能武斷地處理它。
14.容錯性(Fault Tolerance)
架構(gòu)還應(yīng)該詳細(xì)定義所期望的容錯種類。
15.架構(gòu)的可行性(Architectural Feasibility)
設(shè)計師多半會關(guān)注系統(tǒng)的各種能力,例如是否達(dá)到性能目標(biāo),能夠在有限的資源下運(yùn)轉(zhuǎn),實(shí)現(xiàn)環(huán)境(運(yùn)行環(huán)境)是否有足夠的支持。架構(gòu)應(yīng)該論證系統(tǒng)技術(shù)的可行性。
16.過度工程(Overengineering)
詳細(xì)定義一種過度工程(裕度工程)的方法尤其重要,因?yàn)樵S多程序員會出于專業(yè)自豪感,對自己編寫的類做過度工程。通常在架構(gòu)中明確的設(shè)立期望目標(biāo),就能避免出現(xiàn)“某些類異常健壯,而其他類勉強(qiáng)夠健壯”的現(xiàn)象。
17.關(guān)于“買”還是“造”的決策(Buy-vs-Build Decision)
18.關(guān)于復(fù)用的決策(Reuse Decisions)
19.變更策略(Change Strategy)
20.架構(gòu)的總體質(zhì)量(General Architectural Quality)
架構(gòu)應(yīng)該是帶有少許特別附加物的精煉且完整的概念體系。