Cyh的博客

          Email:kissyan4916@163.com
          posts - 26, comments - 19, trackbacks - 0, articles - 220

          ~ 第二章   什么是軟件構架

          • 軟件構架概念的澄清      下面我們給出軟件構架的確切定義: 某個軟件或計算系統的軟件構架是該系統的一個或多個結構,它們由軟件元素、這些元素的外部可見屬性以及這些元素之間的關系組成。 這里所說的某個元素的“外部可見屬性”是指其他元素對該元素所做的假設,如它所提供的服務、性能特性、錯誤處理、共享資源的使用,等等。下面我們深入闡述一下該構架的含義。

            1. 構架定義了軟件元素。構架中包含了關于各元素應如何彼此相關的信息。也就是說,構架必須省略各元素中與其交互無關的某些信息。因此,構架首先是對系統的抽象,該抽象去除了不影響它們如何使用、其他元素如何使用以及如何與其他元素關聯或交互的細節。在幾乎所有的現代系統中,各元素是通過接口實現交互的,而這些接口又將各元素的細節劃分為共有和私有兩大類。根據這種劃分,構架屬于共有部分,而私有部分--即僅與內部具體實現有關的細節--是不屬于構架的。
            2. 該定義明確指出系統可能而且確實由多個結構組成,而且,其中任何一個結構并不能與構架等同。
            3. 該定義意味著具有軟件的每個計算系統都有一個軟件構架,這是因為每個軟件系統都可以看做是由若干個元素及其相互聯系構成的。在最簡單的情況下,我們可以把一個系統看做是一個元素。雖然僅有一個元素的構架沒有多大價值,而且也不實用,但它符合我們的定義。每個系統都有構架,但這并不意味這任何人都知曉該構架的存在。或許當時參與設計某個系統的所有人員都已故去,文檔已經不存在了(或者根本沒有將其編成文檔),源代碼已經丟失(或根本就沒發布過),我們所能得到的就是可執行的機器代碼。這就是系統構架和對構架具體表述的區別。遺憾的是,構架可以獨立于對構架的描述而存在,這也讓我們更加認識到構架編檔構架重構的重要性。
            4. 只要某個元素的行為可以從其他元素的角度觀察到或區別開,這個元素的行為就是構架的內容。這是這種行為的存在,才使各元素的交互成為可能,而這種交互顯然是構架的一部分。這是被當作構架的框線圖其實根本就不是構架的另一個原因。它們只是框線圖,提供了所展示的元素做什么的更多信息。 這并不是說在各種情況下都要對各元素的行為和性能給出精確的描述,但如果某個元素的行為對與之交互的另一個元素的代碼編寫有特定的要求,或者影響到整個系統的可接受性,則該行為就是軟件構架的一部分。

                 最后,我們所給的這個定義并不涉及對構架優劣的評價,這意味著構架將支持或阻止系統滿足其行為、性能和生命期需求。我們并不把試錯法--即任意選用一個構架,在該構架之上展開系統的開發,并期望得到理想的結果--當作為系統選擇構架的最佳方法,因此,這就提出了構架評估和構架設計。

            其他觀點      大多數常見的定義的要點都是一致的--結構、元素以及元素之間的元素--但它們在細節上有很大不同,不能互換。對系統設計中內在的共性進行抽象是一種嘗試,由此它必須說明各種活的、概念、方法、途徑和結果。鑒于此,軟件工程團體中存在其他構架定義:因為您很可能會遇到其中的一些定義,因此應該理解這些定義的含義并能夠對其進行討論。下面是幾個最常見的定義。

            • 構架是一種高層設計。與設計相關的其他任務并不是屬于構架,如確定將要封裝的重要數據結構。訪問數據結構的接口肯定屬于構架的范疇,但實際做出的選擇卻不是。
            • 構架是系統的總體結構。 這個常見說法(不正確地)暗含的意思是系統只有一個結構。我們知道這種說法是錯誤的,如果有人持這種觀點,不妨問問他所說的結構到底是什么。這種觀點不僅僅具有教學上的重要性。后面我們將會看到,不同的結構提供了一個關鍵的工程設計平衡點,這些平衡點使系統中具有了導致系統成功或失敗的質量屬性。構架中結構的多樣性位于概念的核心。
            • 構架是一個軟件或系統的組件、組件之間的相互關系以及管理其設計和演變的原理和方針的結構。 任何系統都有一個構架,并且可以獨立于設計或演變該構架的過程的知識對其進行探索和分析。
            • 構架是組件和連接器。  連接器是指系統運行時為傳送控制和數據信息而采用的機制。因此,該定義主要強調了系統運行時的構架。

            構架模式、參考模型和參考構架      在框線骨架和已經填充了關于系統的所有適當信息的構架之間,有很多中間階段。每個階段都是執行一組構架決策的結果。其中的一些中間階段是非常重要的。要討論構架結構前,我們先給出以下3個定義:

            1. 構架模式是對元素和關系類型以及一組對其使用方式的限制的描述。可以把構架模式看作是對構架的一組制約條件--即對各元素類型及其交互模式的限制條件,而這些制約條件就確定了一組或一系列能滿足它們的構架。   模式最有用的一個方面就是它們展示了已知的質量。這就是為什么設計師選擇某個特定的模式,而不是隨機選擇模式的原因。一些模式代表了性能問題的已知解決方案,一些模式使用于高安全性系統,還有一些模式成功應用在了高可用性系統中。選擇構架模式通常是設計師做出的第一個主要的設計決策。   術語構架樣式的使用也非常廣泛,它用于描述相同的概念。
            2. 參考模型是一種考慮數據流的功能劃分。參考模型是對已知問題的標準分解,分解所得的各個部分相互協作,構成問題的解決方案。產生于實踐經驗的參考模型是熟知某個領域的體現。
            3. 參考構架是映射到軟件元素(它們相互協作,共同實現在參考模型中定義的功能)及元素之間數據流上的參考模型。參考模型實現了功能劃分,而參考構架則將這種功能劃分與系統分解對應起來。這種對應可能(但不一定必須)是一一映射。一個軟件元素可以實現某個功能的一部分,也可以實現若干個功能。  參考模型、構架模式和參考構架都不是構架,但它們都是捕獲構架元素的有用的概念。這三者都是早期設計決策的產物。圖2.2給出了這些設計元素之間的關系。  人們經常拿構架這個詞與該詞的其他用法進行類比,他們對這些用法有更多認識。他們經常將構架與某些物理結構或物理分布聯系在一起。建筑設計師在設計大樓時必須要考慮方便性、美觀、光照、可維護性等方面的要求。軟件設計師在設計中也必須考慮并發性、可移植性、可修改性、易用性、安全性等因素,并且要在這些需求之間進行適當的權衡。

            為什么說軟件構架非常重要      第1章討論了構架對企業的重要性。本章將從技術的角度重點討論構架的重要性。軟件構架之所以重要,主要有以下3個基本原因:

            1. 涉眾之間的交流。   軟件構架是一種常見的對系統的抽象,絕大多數(如果不是全部的話)系統的涉眾都以此作為彼此理解、協商、達成共識或相互溝通的基礎。
            2. 早期設計決策。  軟件構架是所開發系統的最早設計決策的體現,而這些早期決策對系統的后續開發、部署和維護具有重要影響。這也是能夠對所開發系統進行分析的最早時間點。
            3. 可傳遞的系統抽象。   軟件構架是關于系統構造及系統各元素工作機制的相對較小、卻又能突出反映問題的模型。這種模型可以在多個系統之間傳遞,特別是可以應用刀具有相似質量屬性和功能需求的系統中,并能促進大規模的重用。  
            • 構架是涉眾進行交流的手段      軟件系統的涉眾--客戶、用戶、項目經理、程序員、測試人員等--分別關注系統的不同特征,而這些特征都受構架影響。例如,用戶關心的是系統的可靠性和可用性;客戶關心的是構架能否在規定時間內實現,并且開支不超出預算;項目經理關心的是如果按此構架進行開發,能否保證各小組的任務在很大程度上都獨立完成,各部分的交互方式是否規范、可控;而設計師所關心的則是實現構架的所有這些目標的策略。

                    構架提供了一種共同語言,有關各方可借助它表達和協商各自的需求,并理性地找到解決方案,即使對大型、復雜系統的開發也是如此。如果沒有這樣一種語言,要想充分理解大型系統并理智地做出對系統質量和易用性都具有重要影響的早期決策將十分困難。構架分析不僅依賴于而且促進了這個層次上的交流。

              構架是早期設計決策的體現      構架明確了對系統實現的約束條件。如果系統實現遵循構架設計中所做出的關于系統結構的決策,則系統實現將能夠體現出構架的特色。

                    資源分配方面的決策也制約著系統實現。這些決策對從事各元素開發的實現人員來說可能是不可見的。這些限制條件使將各方關心的問題分離開成為可能,從而使管理者能夠做出科學的決策,最大限度地利用人才和計算資源。各元素的開發者對自己所從事的開發任務的要求必須十分清楚,但沒有必要了解在構架上所做的權衡。相反,構架設計師未必要精通算法設計或編程語言的各個方面,但必須能夠做出構架上的合理權衡。

              構架決定了開發組織的組織結構。因為系統的構架中包含了對系統的最高層次的分解,因而一般被作為工作分解結構的基礎;這反過來也規定了計劃、調度及預算的單元,組內交流的渠道,配置控制和文件系統的組織,集成與測試計劃和規程,甚至提出了對一些瑣事的要求。各開發小組根據構架中各主要元素的接口規范進行交流。一旦進入維護階段,維護活動也會反映出軟件的結構,常由不同的小組分別負責各具體部分的維護。

                    建立工作分解結構的一個副作用:它限定了軟件構架的某些方面。如果已經將某個子系統的開發交由某個小組完成,則該小組會對將此任務分派給其他小組提出異議。如果這種責任劃分已經用合同的形式確定下來,則改變任務分配的代價可能是昂貴的。對分配到各小組的任務的進展情況的跟蹤也要困難得多。

                    因此,一旦對構架達成一致,不管是由于管理上的還是商業傷的原因,想要對它進行修改,幾乎都是不可能的。這也是為什么在確定某個大型系統的構架之前必須進行全面分析的原因之一。

              構架阻止或支持系統的質量屬性的實現。  系統能否具有所期望的質量屬性主要是由其構架決定的。第5章將詳細討論構架和質量屬性之間的關系,現在僅需牢記以下幾點:

              • 如果您的系統要求高性能,就需要管理元素基于時間的行為以及元素間通信的頻率和數量。
              • 如果可修改性很重要,就需要給元素分配責任,以使對系統的修改不會產生很大的影響。
              • 如果系統必須非常安全,就需要管理和保護元素間的通信以及允許哪些元素訪問哪些信息。可能還需要在構架中引入專門的元素(如受信的內核)
              • 如果您認為系統需要可擴展性,就必須仔細定位資源的使用,以有利于引入容量更高的更換組件。
              • 如果項目需要交付系統的增量式子集,就必須仔細管理組件間的使用。
              • 如果希望可以在其他系統中重要該系統的元素,就需要限制元素間的耦合,以便提取元素時,它能發揮作用,且不會與當前環境有過多依賴。

                  這些和其他質量屬性策略都與構架有很大關系。然而,僅靠構架也無法保證系統功能和質量屬性的實現,理解這一點非常重要。

              通過研究構架來預測系統質量。能否在系統開發和部署前就知道做出了適當的構架決策(也就是系統是否將表現出所期望的質量屬性)? 所幸的是,僅僅依靠對構架的評估來預測系統未來的質量屬性是可能的。

              構架使推理判斷和控制更改更簡單。每個構架都將可能的更改劃分為3類:本地的、非本地的和構架上的。本地更改只需修改某一個元素就可以實現。非本地更改的實現則需對多個元素進行修改,但并不改動構架。構架的更改會影響各元素之間交互的基本方式--即構架模式--并很可能要求系統做全面的修改。顯然,僅做本地更改是最理想的。所以,一個富有生命力的構架應該是這樣的:最有可能發生的更改也是最容易進行的更改。    構架有助于循序漸進的原型設計。一旦確定了構架,就可以對其進行分析,并將其原型構造為一個骨架系統。這從兩個方面協助開發過程的順利進行:

              1. 在產品生命期的早期就能得到一個可執行的系統。隨著原型中的各部分逐漸被真實系統各部分的最終實現所代替,原型的這種真實性將越來越明顯地體現出來。原型的各組成部分可能與系統的最終實現有較大差異,也可能能夠比較逼真地處理和產生數據。
              2. 使系統在早期執行的一個特例就是在產品生命期的早期確定潛在的性能問題。

              可以通過構架進行更準確的成本和進度估計。  成本和進度估計是一個重要的管理工具,它能夠使管理人員獲得必要的資源并了解項目開發中是否遇到了困難。與了解整個系統相比,了解系統的某些部分本質上可以使成本估計更加準確。正如我們已經說過的,項目的組織結構基于它的構架。與項目經理相比,每個小組能夠對其所開發的部分進行更準確的估計,并且在使估計成為現實的過程中,擁有強烈的主人翁責任感。第二,構架的最初定義意味著已經評審了系統的需求,從某種意義上來說,已經對需求進行了驗證。對系統范圍了解的越多,估計就會越準確。

              構架是可傳遞、可重用的模型       在整個生命期中,重要的越早,收益就越大。代碼的重用能帶來極大的便利,而在構架層次上的重用則為具有類似需求的系統開發提供了有利的手段。不僅可以實現代碼的重用,還可以實現決定構架選用的系統需求及構建構架的經驗的重用。如果構架決策能夠在多個系統中得到重用,則也可以獲得上面講到的早期決策所帶來的所有好處。     產品線共享一個公共的構架。   軟件產品線或家族是一組軟件密集型系統,這些系統共享一個公共的、可管理性的特性集,滿足了待定市場或任務的具體需要,是 按照規定的方式根據一組公共的核心資產開發的。在這些核心資產中,主要部分就是設計用來處理整個家族需要的構架。產品線設計師通過制定在早期適用與整個家族的設計決策,以及在后期僅適用于單個成員的其他決策,來選擇一個滿足產品線的所有預想成員的構架。該構架定義了對產品線的所有成員來說,什么是固定的,什么是可變的。對多系統開發來說,軟件產品線是一種強大的開發方法,它可以在上市時間、成本、生產率和產品質量方面實現極大的回報。構架的強大源于范例的核心。與其他資本投資類似,產品線的構架將成為開發組織的核心資產。    系統開發可以使用大型的、由其他組織開發的元素。以前的軟件范例總是將編程作為最根本的任務,把編寫了多少行代碼作為衡量項目進展情況的依據。基于構架的開發則更強調對各元素的組合或裝配,而這些元素很可能已分別甚至是完全獨立地開發實現了。由于構架定義了可以集成到系統中的元素,因此,這種組合是可能的。構架從元素與環境的交互、對控制的接收和釋放、所能使用或產生的數據、訪問數據的方式、通信方式以及用于通信和資源共享的協議等方面對可能做的更換做了種種約定。   元素結構、接口和操作概念的組織是構架的一個重要方面。互換性是這種組織的最重要的原則。   商業組件、子系統、兼容的通信接口都是基于互換性原則的。      少就是多:限制選擇范圍是值得的。隨著所積累的構架模式和設計模式越來越多,我們將會越來越清楚地認識到:雖然計算機程序可以以近乎無限的方式來組合,但涉及到程序的協調和交互時,有意識地限制在一定范圍內選擇將使我們受益匪淺。也就是說,我們希望使所構建系統的設計盡可能簡單。這種方法的優勢包括:重用程度更高、更易于理解和交流的簡單規范的設計、更為透徹的分析、更短的選擇時間、更強的可互操作性。       軟件設計的特性來自于構架模式的選擇。那些更適用于某個特定問題的構架模式將改善設計方案的實現,這可能通過更輕松地在相沖突的設計要求之間進行權衡、提高對設計環境的人認識和/或使需求描述中的不一致性更為突出等方式體現出來。    系統構架與軟件構架。在過去的5到10年中,我們在很多場合對軟件構架進行了討論。每次總會有人提出如下問題:為什么談論軟件構架?系統構架是否同軟件構架一樣重要?或者說軟件構架和系統構架之間的區別是什么?    在創建軟件構架時,通常很少考慮系統。  如果您想讓構架具有很高的性能,就需要了解該系統將運行的硬件平臺的物理特性以及該系統將與之交互的任何設備的特性,您通常還會關注網絡的特性。如果您需要構架具有很高的可靠性,也需要關注硬件,在這種情況下就是關心其故障率和冗余處理或網絡設備的可用性。如此等等,不一而足。設計師很少考慮硬件。    因此,設計軟件構架時,大概需要考慮整個系統--硬件和軟件,否則就是蠻干。當僅規定了系統的一部分時,任何一個工程師都不可能預測系統的特性。    但我們主要談論的仍然是軟件構架而非系統構架。這是為什么呢?因為大多數設計師在軟件方面都可以做出選擇,而在硬件方面則沒有這種自由。  構架使基于模板的開發成為可能。構架體現了關于元素交互方式的設計決策。這些決策雖然是每個元素的實現中體現出來的,但卻能夠局部化,只需編寫一次即可。可以在某處用模板將元素間的交互機制描述清楚。  構架可以做為培訓的基礎。 在對項目新成員介紹所開發的系統時間,可以首先介紹系統的結構,以及對組件之間如何交互從而實現系統需求的高層次的描述。我們曾經指出,軟件構架的重要用途之一就是支持并促進各涉眾之間的交流,這進一步印證了我們的觀點。構架是一個公共的參考點。

            構架結構和視圖      現代系統非常復雜,很難一下子領會它們。相反,在任何時刻,我們只能把注意力放在軟件系統的一個或幾個結構上。為了有意義的傳達構架信息,必須說明此刻正在討論哪個或哪些結構--即采用的是構架的哪個視圖。

               在討論構架表示時,我們將使用相關術語結構視圖。視圖是構架元素的內聚集的表示,由系統涉眾編寫和閱讀。它由一個元素集的表示和元素之間的關系組成。結構是元素本身的集合,它們存在于軟件或硬件中。   大體上可將構架分為3組,這取決于它們所展示的元素的主要特性。  大體上可將構架結構分為3組,這取決于它們所展示的元素的主要特性。

            • 模塊結構。此處的元素是模塊,它們是實現單元。模塊表示一種考慮系統的基于代碼的方法。模塊被分配功能責任區域。這不怎么強調所開發出來的軟件如何在運行時表現自己。模塊結構能夠使我們回答諸如此類的問題:分配給每個模塊的主要功能責任是什么?允許模塊使用的其他軟件元素是什么?它實際使用的其他軟件是什么?什么模塊通過泛化或特化關系與其他模塊相關?
            • 組件-連接件結構。此處的元素為運行時組件(它們是計算的主要單元)和連接器(它們是組件間通信的工具)。組件-連接件結構能夠使我們回答諸如此類的問題:什么是主要的執行組件,它們如何交互?什么是主要的共享數據存儲?復制系統的哪些部分?數據在系統中經過了哪些地方?系統的哪些部分可以并行運行?在系統執行時,其結構可能會發生怎樣的變化?
            • 分配結構。分配結構展示了軟件元素和創建并執行軟件的一個或多個外部環境中的元素之間的關系。它們回答了諸如此類的問題:每個軟件元素在什么處理器上執行?在開發、測試和系統構建期間,每個元素都存儲在什么文件中?分配給開發小組的軟件元素是什么?

            這3種結構與構架設計所涉及的3大類決策一致:

            • 系統如何被組織為一個代碼單元集合的?
            • 系統如何被組織為一個具有運行時行為(組件)和交互(連接器)的元素集合的?
            • 系統如何與其環境中的非軟件結構相關(也就是CPU、文件系統、網絡和開發小組等)?
            • 軟件結構      圖2.3展示了一些最常見和最有用的軟件結構。

               

              模塊。基于模塊的結構包括如下內容。

              • 分解。   這些單元是通過“是一個子模塊”關系將彼此關聯起來的模塊,展示了如何將較大的模塊遞歸地分解為較小的模塊,直到它們足夠小,很容易理解為之。該結構中的模塊代表了設計中一個常見的起點,因為設計師列舉了軟件的單元必須做什么工作,并把每個項目分配給模塊以進行隨后的設計和最后的實現。模塊通常有關聯的產品。通過確保很可能會發生的變化最多只在幾個小模塊中,分解結構提供了很大一部分的系統可更改性。通常將其用作開發項目的組織的基礎,包括分解結構、其集和測試計劃。該結構中的單元通常具有特定于組織的名稱。
              • 使用。這一重要但是結構經常被忽略的單元也是模塊,或者是過程,或者是模塊接口上的資源。這些單元通過“使用”關系彼此相關。如果一個單元的正確性要求另一個單元提供正確版本的話,那么我們稱第一個單元使用第二個單元。使用結構用于設計可以輕松擴展以添加功能的系統,或從中可以輕松提取有用功能子集的系統。輕松提取工作系統的子集的能力允許進行增量式開發。
              • 類或泛化。該結構中的模塊單元被稱為類。關系是“繼承自”或“是一個實例”。可以根據該視圖推斷出類似行為或能力的集合,以及通過劃分子類所捕獲的參數化的差別。類結構能夠使我們對重用以及功能的增量式增加進行推斷。

              組件-連接器。這些結構包括如下內容

              • 進程或通信進程。向所有組件-連接器結構一樣,該結構與基于模塊的結構是正交的,它處理的是運行系統的動態方面。此處的單元為通過通信、同步和/或排除操作將彼此相連的進程或線程。在該結構中(而且在所有組件-連接器結構中)的關系是“附加”,展示了組件和連接器是如何連接在一起的。進程結構非常重要,它有助于設計系統的執行性能和可用性。
              • 并發。該組件-連接器結構能夠使設計師確定并行的機會以及可能出現資源爭用的位置。單元是組件,連接器是“邏輯線程”。邏輯線程是一系列計算,可以將這些計算在稍后的設計過程中分配給單獨的物理線程。并發結構在設計的早期使用,以確定管理與并發執行相關的問題的需求。
              • 共享數據或存儲庫。   該結構由創建、存儲和訪問持久數據的組件和連接器組成。如果實際上是系統是根據一個或多個共享數據存儲庫構建的,那么,該結構就適于進行說明。它展示了運行軟件元素如何產生數據和使用數據,可以使用該結構確保良好的性能和數據完整性。
              • 客戶機-服務器。如果系統被構建為一組彼此協作的客戶機和服務器,那么,這就是一個很好的進行說明的組件--連接器結構。組件是客戶機和服務器,連接器是協議以及它們共享來執行系統工作的消息。這對于關注點分離(支持可修改性)、物理分布和負載平衡(支持運行時性能)都是有用的。

              分配。分配結構包括如下內容

              • 部署。部署結構展示了如何將軟件分給硬件處理和通信元素。元素是軟件(從組件-連接器的觀點看通常是進程)、硬件實體(處理器)和通信路徑。關系是“分配給”和“移植到”,前者展示了軟件元素所駐留的物理單元,后者的條件是分配和動態的。該視圖能夠使工程設計人員對性能、數據完整性、可用性和安全性進行推斷。在分布式或并行系統中,我們尤其對部署結構感興趣。
              • 實現。該結構展示了軟件元素(通常是模塊)是如何映射刀系統開發、集成或配置控制環境中的文件結構上。這對于開發活動和構建過程的管理非常關鍵。
              • 工作分配。該結構將實現和集成模塊的責任分配給適當的開發小組。擁有作為構架一部分的工作分配結構,可以使關于誰做工作的決策具有管理上的和構架上的兩層含義變得清晰。設計師應該知道對每個小組的技術要求。同樣,在大規模的多源分布式開發項目上,工作分配結構是調出功能公共的單元并把它們分配給某個小組的手段,而非讓需要它們的每個人去實現。

                    表2.1對軟件結構進行了總結。該表列出了每個結構中的元素及其關系的含義,并說明了每種結構可能會用于什么情況。    盡管我們通常從功能的角度理解某個系統的結構,但除了功能外,還有必須在構架層次上考慮的系統屬性,如物理分布、進程通信和同步。每種結構都提供了一個對某些相關質量屬性進行推斷的方法。進程結構設計用于消除死鎖并減少瓶頸。模塊分解結構設計用于產生可修改的系統,等等。每種結構都為設計師提供了一個考察系統的不同的角度,并為設計權衡提供了不同的支點。

              將結構彼此關聯在一起       盡管這些結構提供了不同的考察系統的視角,但它們不是獨立的。一個結構的元素與其他結構的元素相關,我們需要對這些關系進行推斷。  單個項目有時會把一種結構作為主要結構,并在可能的情況下,根據該結構考慮和運用其他結構。主要結構通常是模塊分解,但并不總是如此。這是有充足理由的:它容易與組織的項目結構吻合。    并不是所有的系統都需要在構架上采用多種結構。系統越大,這些結構之間的差別就越大;然而對于較小的系統,有少數幾個結構通常即可滿足要求。在有幾個組件--連接器結構時,我們不是把每個結構都用上,一個即可滿足要求。如果只有一個進程,那么,在設計中顯然沒必要考慮進程結構。如果沒有分布式的特征(也就是說,僅有一個處理器),那么,部署結構就沒有什么價值,不需要做進一步考慮。

                     結構代表了構架的主要工程設計平衡點。單個結構賦予了它們處理一個或多個質量屬性的能力。它們代表了一個用于創建構架的強大的關注點分離方法。

              選擇哪些結構      設計師應該使用哪些結構?設計師應該把哪些結構編成文檔?當然,肯定不是使用所有結構并把所有的結構編成文檔。   這方面有很多建議。1995年,Philippe Kruchten發表了一篇很有影響力的論文【Kruchten95】。在這篇論文中,他描述了由單獨的結構組成的構架的概念,并建議把重點放在4種結構上。為了驗證這些結構彼此并不沖突,在實際應用中能夠相互協作,他描述了一個滿足其需求的系統。Kruchten95建議使用關鍵的用力進行檢查。這一所謂的“4+1”方法變得非常流行,現在已經成為Rational統一過程的概念基礎。

              • 邏輯的。元素為“關鍵的抽象”,在面向對象中表示為對象或對象類。這是一個模塊視圖。
              • 進程。該視圖解決了功能的并發和分布問題。這是一個組件--連接器視圖。
              • 開發。該視圖展示了軟件模塊、庫、子系統和開發單元的組織。它是一個分配視圖,將軟件映射到了開發環境中。
              • 物理的。該視圖將其他元素映射到了處理和通信節點上,它是一個分配視圖(有些人把它叫做部署視圖)。

              幾乎在Kruchten發表論文的同一時間,Soni , Nord 和 Hofmeister 共同發表了一篇非常有影響力的論文。在這篇論文中,它們報告了其所在的組織中的軟件設計師在許多項目中使用的結構。它們的視圖是概念上的模塊互連、執行和代碼。這些視圖再一次清晰地映射刀模塊、組件-連接器以及分配模型上。     設計師的職責之一就是理解各種結構如何幫助實現質量屬性,然后選擇能夠最佳地提供這些質量屬性的結構。

            小結      本章給出了軟件構架的定義,并介紹了參考模型、參考構架和構架模式的相關概念。本章也從早期研究對系統的認識、構架對各涉眾相互溝通的影響以及作為一種可重用資產的價值等方面,解釋了構架在軟件工程領域的重要意義。



                                                                                                                 --    學海無涯
                  

          主站蜘蛛池模板: 崇义县| 汝阳县| 扎兰屯市| 肃宁县| 宁城县| 南阳市| 昌乐县| 屯门区| 小金县| 襄汾县| 大荔县| 湘阴县| 盖州市| 崇左市| 洛浦县| 永年县| 开封县| 田林县| 拉萨市| 宁晋县| 青浦区| 修水县| 武功县| 临夏县| 玛沁县| 墨江| 弥勒县| 达州市| 驻马店市| 安图县| 海晏县| 茶陵县| 伊春市| 扎赉特旗| 焉耆| 康乐县| 靖江市| 彩票| 日土县| 罗源县| 仁怀市|