軟體架構:提升抽象層次(譯)
Peter Eeles的文章,文中一些定義以下面的為準。
架構,是系統的基本組織,涵蓋組件,組件與組件的關係,組件與環境的關係,以及一些指導設計和演變的原則。[IEEE 1471]
與此相關的一些術語:
系統,是具有一個或一組功能的組件集合。該術語的概念涵蓋了個人應用程式,傳統意義上的系統,子系統,綜合系統,產品線,產品系列,整個企業,以及其他利益集合體。系統為任務而生。[IEEE 1471]
環境(或上下文),決定了開發、操作、政治、以及其他方面的設定和條件。[IEEE 1471]
使命是對系統的使用和操作,系統是用來,為一個或多個參與者,實現一些目標的集合。[IEEE 1471]
參與者是個人,團隊,或者組織(或者它所屬於的階級),他們或是利益相關者,或感興趣者。
組件是一個實現了功能的系統之模組化的局部,且具有可替換性。組件基於規定和要求的介面,來定義行為。因此,在提供服務的時候,組件的一致性是由規定和要求的介面定義的(既包括靜態語義,也包括動態語義)。
此外,架構是重大決定的集合,這些決定事關一個軟體系統的組織,架構元素的選擇,組成系統的各部分的介面,還有這些元素間協作的指定行為,如何把這些元素逐步組裝成子系統,指導這種組織的架構風格—包括這些元素及其介面、協作和構成。
程式或者計算系統的軟體架構就是它的結構,包括軟體元素,這些元素的外部可見屬性,以及它們之間的關係。
架構是系統的組織圖和相關行為。一個架構可以被遞迴地拆解成:靠介面互動的小塊,小塊之間的關係,以及組裝約束。小塊之間互動的介面包括類,組件和子系統。[UML 1.5]
一個或一組系統的軟體架構,包括所有關於軟體結構和不同結構間的互動,的重要設計決策。設計決策支援一套理想的品質,以支援系統能夠成功。設計決策還為系統的部署、支援和維護提供一套概念基礎。[McGovern]
本文提供了關於軟體架構的下列觀察。我已把它們分為三組:
1. 軟體系統的結構特徵
- 架構定義了結構或結構特徵
- 架構定義了行為或結構元素間的互動
- 架構關注於重要的元素或所有重要行為相關的主要結構元素
2. 利益相關者(包括Team Dev)的影響
- 架構平衡利益相關者的需要
- 架構最終解決利益相關者的功能或非功能的需求
- 架構包含了基於邏輯依據的決策
- 環境影響著架構,例如架構的上下文
- 架構影響團隊結構
- 架構可能遵照架構風格
- 架構具有特定的範圍
3. 關注點分離
- 架構定義相關元素的連貫組合,處理一組給定的關注點
在所有定義裡面,共同的主題當然是“關注點分離”。劃分關注點,從關注點的這些特定的範式中進行抽象,提供一個使用方式。
論文“軟體架構介紹”跟蹤了軟體架構觀點的演化,從早期的計算到現在複雜的軟體系統。在抽象層次以及如何談論抽象層次上都有了提高。從早期的打孔卡的計算系統到程式設計語言,執行類似於迴圈、條件運算式、程序呼叫的通用模式出現,並由組合語言轉換為進階程式設計語言。焦點轉移到了資料和關於不同類型資料不同結構化的概念上。抽象資料類型出現。不管是資料的單獨處理,還是真的像數學函數所描述的那樣計算,從早期的機器語言到進階程式設計語言到編程模式,儘管我們對軟體的理解已經在演化,如何看待計算仍然有不同的觀點。
最終我們需要一種架構風格,按照這種風格我們可以在結構組織模式方面,定義一系列軟體系統。這樣的架構風格將能夠決定被使用的組件、串連件、以及一系列串連約束的詞彙。我們已經有軟體架構的第一個概念了。
Booch在他的個人網站Handbook of Software Architecture上一再提到,“軟體開發,從根本上,一直是,現在是,並且將來仍然是很困難的。為此,軟體工程的整個曆史就是提升抽象層次的曆史(因為我們人類在處理複雜事物時抽象是一種主要的方式),並且我們看到這也反映在我們的程式設計語言、平台、過程、工具,以及模式的成熟上面。事實上,每個結構良好的軟體密集型系統裡,從形成特定程式設計語言的使用風格到定義了社會中的對象、組件以及其他部分之間的協作的機制,到處都充滿了模式。在抽象的最高層次,每個系統都有一個架構,包括關鍵的抽象和機制,它們定義了從各個利益相關者的角度所看到的不同的關注點的結構和行為。在任何情況下-從語言風格到機制再到架構-這些模式要麼是有意要麼是偶然的,但是只要他們是可見的,這些模式反映了每個系統的風格和內在的美。
至於軟體架構的重要性被總結成三點,它們在“軟體架構實戰”中有提到,前兩個是:
- 作為利益相關者之間的通訊手段,架構包括一組通用的系統抽象,系統的利益相關者們可以用來相互理解,協商,達成共識和溝通。
- 能夠影響軟體實現的早期設計決策,可以採用之前對架構風格方面的瞭解來指導。
第三點是說一個軟體架構包括一個系統的可轉移的抽象,它可以被用作相同結構的其他系統,但是我相信我們已經在架構中看到了抽象的作用。建立架構是因為需要,而不是重要,事實上正是架構關注的是結構元素的抽象,根本上這也是我們建立架構的原因。
對我而言,十字架就是抽象層次的概念是怎樣的,面向語言編程,面向特徵編程和軟體架構是聯絡在一起的,以致於想出面向語言(/面向特徵)的軟體架構。