所在位置:首頁 -- 軟件設計 -- 正文

實現軟件架構質量屬性的戰術


發布時間:2013-10-4  來源:admin

架構設計則為滿足架構需求的質量屬性尋找適當的戰術。對如何實現特定的質量屬性感興趣。質量需求指定了軟件的響應,以實現業務目標。我們感興趣的是設計使用設計模式、架構模式或架構策略創建設計的“戰術”。

是什么使一個設計具有了可移植性,一個設計具有了高性能,而另一個設計具備了可集成性?實現這些質量屬性依賴于基本的設計策略。我們將對這些稱之為“戰術”的設計決策進行分析。戰術就是影響質量屬性響應控制的設計決策。戰術集合稱為“架構策略”。架構模式以某種方式將戰術打包在一起。

系統設計是由決策集合組成。對設計師來說,每個戰術都是一個設計選擇。例如,其中一個戰術引入了冗余,以提高系統的可用性。這是提高可用性的一個選擇但是不是唯一選擇。

我們將每個系統質量屬性的戰術組織為層次形式,但是每個層次只是為了說明一些戰術,而且任何戰術列表都肯定是不完成的。

1. 可用性戰術

恢復和修復是可用性的重要方面,為了阻止錯誤發展成故障,至少能夠把錯誤限制在一定的范圍內,從而使修復成為可能。維持可用性的所有方法包括某種類型的冗余,用來檢測故障的某種類型的健康監視,以及當檢測到故障時某種類型的恢復。有些情況下,監視或恢復是自動進行的,有時需要手動。

我們事項考慮錯誤檢測,然后分析錯誤恢復,最后討論錯誤預防。

1> 錯誤檢測

用于識別錯誤的3個戰術是命令/響應、心跳和異常

⑴命令/響應。一個組件發出一個命令,并希望在預定義的時間內收到一個來自審查組件的響應。可以把該戰術用在共同負責某項任務的一組組件內。客戶機也可以使用這種戰術,以確保服務器對象和到服務器的通信路徑在期望的性能邊界內操作。可以用一種層級形式組織“命令/響應”錯誤探測器,其中最底層的探測器對與其共享一個處理器的軟件進程發出命令,較高層的錯誤探測器對較低層的探測器發出命令。與所有進程發出命令的遠程錯誤探測器相比,這種戰術所使用的通信帶寬更少。

⑵心跳。一個組件定期發出一個心跳消息,另一個組件接收聽該信息。如果心跳失敗,則假定最初的組件失敗,并通知錯誤糾正組件。心跳還可以傳遞數據。例如,自動柜員機定期向服務器發送一次交易日志。該消息不僅起到心跳的作用,而且傳送了要處理的數據。

⑶異常。識別錯誤的一個方法就是遇到了異常。

命令/響應和心跳戰術在不同的進程中操作,異常戰術在一個進程中操作。異常處理程序通常將錯誤在語義上轉換為可以被處理的形式。

2> 錯誤恢復

錯誤恢復由準備恢復和修復系統兩部分組成。

⑴表決。運行在冗余處理器上的每個進程都具有相同的輸入,它們計算發送給表決者的一個簡單的輸出值。如果表決者檢測到單處理器的異常行為,那么就中止這一行為。表決算法可以是“多數規則”或“首選組件“或其他算法。該方法用于糾正算法的錯誤操作或者處理器的故障,通常用在控制系統。每個冗余組件的軟件可以由不同的小組開發,并且在不同平臺上執行。稍微好一點情況是在不同平臺上開發一個軟件組件,但是這樣的開發和維護費用非常昂貴。

⑵主動冗余(熱重啟)。所有的冗余組件都以并行的方式對事件做出響應。因此他們都處在相同的狀態。僅使用一個組件的響應,丟棄其他組件的響應。錯誤發生時,使用該戰術的系統停機時間通常是幾毫秒,因為備份是最新的,所以恢復所需要的時間就是切換時間。

⑶被動冗余(暖重啟/雙冗余/三冗余)

一個組件(主要的)對事件做出響應,并通知其他組件(備用的)必須進行狀態更新。當錯誤發生時,在繼續提供服務前,系統必須首先確保備用狀態是最新的。該方法也用在控制系統中,通常情況是在輸入信息通過通信通道或傳感器到來時,如果出現故障必須從主組件切換到備用組件時使用。

⑷備件

備用件是計算平臺配置用于更換各種不同的故障組件。出現故障時,必須將其重新啟動為適當的軟件配置,并對其狀態進行初始化。定期設置持久設備的系統狀態的檢查點,并記錄持久設備的所有狀態變化能夠使備件設置為適當的狀態。這通常用作備用客戶機工作站,出現故障時,用戶可以離開。該戰術的停機時間通常是幾分鐘。

⑸Shadow操作。以前出現故障的組件可以在短時間內以“shadow模式”運行,以確保在恢復該組件前,模仿工作組件行為。

⑹狀態再同步。主動和被動冗余戰術要求恢復的組件在重新提供服務前更新其狀態。更新的方法取決于可以承受的停機時間、更新的規模以及更新所要求的消息的數量。

⑺檢查點/回滾。檢查點就是記錄所創建的一致狀態,或者是定期進行,或者是對具體事件做出響應。有時系統會以一種不同尋常的方式出現故障,可檢測到其狀態不一致。在這種情況下,應該使用上一個一致狀態檢查點和拍了快照后所發生的事務日志來恢復系統。

3> 錯誤預防

⑴從服務中刪除。該戰術從操作中刪除了系統的一個組件,以執行某些活動來防止預期發生的故障。一個示例就是重新啟動組件,以防止內存泄露導致故障的發生。如果從服務中刪除是自動的,則可以設計架構策略來支持它。如果是人工進行的,則必須對系統進行設計以對其提供支持。

⑵事務。事務就是綁定幾個有序的步驟,以能夠立刻撤銷整個綁定。如果進程中的一個步驟失敗的話,可以使用事務來防止任何數據受到影響,還可以使用事務來防止訪問相同數據的幾個同時線程之間發生沖突。
⑶進程監視器。一旦檢測到進程中存在著錯誤,監視進程就可以刪除非執行進行,并為該進程創建一個新的實例,就像在備件戰術中一樣,初始化為某個適當的狀態。

總結了上面討論的戰術。

2. 可修改性戰術

可修改戰術的目標是控制實現、測試和部署變更的時間和成本。把可修改性戰術根據其目標進行分組。一組可修改性戰術目標是減少由某個變更直接影響的數量。這組稱為“局部化修改”。另一組可修改戰術的目標是限制對局部化的模塊的修改。這組稱為“防止連鎖反應”。兩組之間的差別是有直接受變更影響的模塊(那些調整其責任來完成變更的模塊)間接受變更影響的模塊(那些責任保持不變,但必須改變其實現來適應直接受影響的模塊)。第三組戰術的目標是控制部署時間和成本。我們把這組戰術叫做“延遲綁定時間”。

1> 局部化修改。

目標是在設計期間為模塊分配責任,以把預期的變更限制在一定范圍內。其戰術有:維持語義的一致性、預期期望的變更、泛化該模塊、限制可能的選擇。

⑴維持語義的一致性。語義的一致性是在模塊中責任之間的關系。目標是確保所有這些責任都能夠協同工作,不需要過多地依賴其他模塊。該目標是通過選擇具有語義一致性的責任來實現的。耦合和內聚指標是度量語義一致性的嘗試,但它們遺漏了變更的上下文。相反根據一組預期的變更來度量語義一致性。其中一個子戰術就是“抽象通用服務”。通過專門的模塊提供通用服務通常被視為支持重用。但是抽象通用服務也支持可修改性。如果已經抽象出了通用服務,那么對這些通用服務的修改只需要進行一次,而不需要在使用這些服務的每個模塊中都進行修改。此外,對使用這些服務的模塊的修改不會影響到其他用戶。不僅支持局部化修改,而且還能夠防止連鎖反應。抽象通用服務的示例就是應用框架的使用和其他中間件軟件的使用。

⑵預期期望的變更。考慮所預想的變更的集合提供了一個評估特定的責任分配的方法。基本的問題是“對于每次變更,所建議的分解是否限定了為完成變更所需要修改的模塊的集合?”一個相關的問題是“根本不同的變更會影響相同模塊嗎?”這與語義一致性有什么不同呢?根據語義一致性分配責任,假定期望的變更在語義上是一致的。預測期望變更的戰術不關心模塊責任的一致性,它所關心的是使變更的影響最小。在實際中很難單獨使用該戰術,因為不可能預期所有變更。基于此原因,我們通常結合語義一致性來使用該戰術。

⑶泛化該模塊。使一個模塊更通用能夠使它根據輸入計算更廣泛的功能。可以該輸入看作是為該模塊定義了一種語言,這可能會如同使常數成為輸入參數一樣簡單;也可能如同把該模塊實現為解釋程序,并使輸入參數成為解釋程序的語言中的程序一樣復雜。模塊越通用,越有可能通過調整語言而非修改模塊來進行請求變更。

⑷限制可能的選擇。修改(尤其是在產品線中的修改)的范圍可能非常大,因此可能會影響很多模塊。限制可能的選擇將會降低這些修改所造成的影響。例如,產品線的某個變化點可能允許處理器的變化。將處理器變更限制為相同家族的成員就限制了可能的選擇。

2> 防止連鎖反應。

修改所產生的一個連鎖反應就是需要改變該修改并沒有直接影響到的模塊。例如,改變了模塊A以完成某個特定的修改,那么必須改變模塊B,這僅僅是因為改變了A,在某種意義上來說,是因為它依賴于模塊A。
確定的8中類型的依賴。

① 語法。

1.數據。要使B正確編譯或執行,由A產生并由B使用的數據類型或格式必須與B所假定的數據的類型或格式一致。

2.服務。要使B正確編譯和執行,由A提供并且由B調用的服務的簽名必須與B的假定一致。

② 語義。

1.數據。要使B正確執行,由A產生并由B使用的數據語義必須與B所假定的數據的語義一致。

2.服務。要使B正確執行,由A提供并且由B調用的服務的語義必須與B的假定一致。

③ 順序。

1.數據。要使B正確執行,它必須以一個固定的順序接收由A產生的數據。

2.控制。要使B正確執行,A必須在一定的時間限制內執行。

④ A的一個接口身份。A可以有多個接口。要使B正確編譯和執行,該接口的身份(名稱或句柄)必須與B的假定一致。

⑤ A的位置(運行時)。要是B正確執行,A運行的位置必須與B的假定一致。

⑥ A提供的服務/數據的質量。要是B正確執行,設計A所提供的數據或服務的質量的一些屬性必須與B的假定一致。例如,某個特定的傳感器所提供的數據必須有一定的準確性,以使B的算法能夠正常運行。

⑦ A的存在。要是B正常執行,A必須存在。例如,如果B請求對象A提供服務,而A不存在并且不能動態創建,那么B就不能正常執行。

⑧ A的資源行為。要使B正常執行,A的資源行為必須與B的假定一致。這可以是A的資源使用(A使用與B相同的內存)或資源擁有(B保留了A認為屬于它的資源)。

沒有任何一個戰術一定能夠防止語義變更的連鎖反應。首先討論與特定模塊的接口相關的那些戰術——信息隱藏和維持現有的接口——然后討論一個違反了依賴鏈的戰術——仲裁者的使用。

⑴信息隱藏。信息隱藏就是把某個實體(一個系統或系統的某個分解)的責任分解為更小的部分,并選擇使哪些信息成為公有的,哪些信息成為私有的。可以通過指定的接口獲得公有責任。信息隱藏的目的是將變更隔離在一個模塊內,防止變更擴散到其他模塊。這是防止變更擴散的最早的技術。它與“預期期望的變更有很大關系”,因為它使用那些變更作為分解的基礎。

⑵維持現有的接口。如果B依賴于A的一個接口的名字和簽名,則維持該接口及其語法能夠使B保持不變。當然如果B對A有語義依賴性,那么該戰術不一定會起作用,因為很難屏蔽對數據和服務的含義的改變。此外,也很難屏蔽對服務質量、數量質量、資源使用和資源擁有的依賴性。還可以通過將接口與實現分離來實現該接口的穩定性。這使得能夠創建屏蔽變化的抽象接口。變化可以包含在現有的責任中,或者可以通過用模塊的一個實現代替另一個實現來包含變化。

實現該戰術的模式包括:

1.添加接口。大多數編程語言允許多個接口。可以通過新接口提供最新的可見的服務或者數據,從而使得現有的接口保持不變并提供相同的簽名。

2.添加適配器。給A添加一個適配器,該適配器把A包裝起來,并提供原始A的簽名。

3.提供一個占位程序A。如果修改要求刪除A,且B僅依賴于A的簽名,那么為A提供一個占位程序能夠使B保持不變。

⑶限制通信路徑。限制與一個給定的模塊共享數據的模塊。也就是說,減少使用由該給定模塊所產生的數據的模塊的數量,以及產生由該模塊所使用的數據的模塊的數量。這會減少連鎖反應,因為數據產生/使用引入了導致連鎖反應的依賴。

⑷仲裁者的使用。如果B對A具有非語義的任何類型的依賴,那么,在A和B之間插入一個仲裁者是有可能的,以管理與該依賴相關的活動。所有這些仲裁者都有不同的名字,但我們將根據列舉的依賴類型對每個仲裁者進行討論。如前所述,在最糟糕的情況下,仲裁者不能補償語義變化。仲裁者是:

1.數據(語法)。存儲庫充當數據的生產者和使用者之前的仲裁者。存儲庫可以把A產生的語法轉換為符合B的語法。一些發布/訂閱模式(那些具有通過中央組件的數據流的模式)也可以把該語法轉換為符合B的語法。MVC和PAC模式把一種形式的數據(輸入輸出設備)轉換為另一種形式的數據(由MVC和PAC中的抽象所使用的形式)。

2.服務(語法)。正面、橋、調停者、策略、代理和工廠模式都提供了把服務的語法從一種形式轉換為另一種形式的仲裁者。因此,可以使用他們防止A的變化擴散到B。

1. A的接口的身份。可以使用經紀人模式屏蔽一個接口的身份中的變化。如果B依賴于A的一個接口的身份并且該身份發生了變化,通過向經紀人添加該身份,并使該經紀人與A的新身份進行連接,B可以保持不變。

2. A的位置(運行時)。名稱服務器能夠使A的位置發生變化,且不影響B。A負責在名稱服務器中注冊其當前的位置,B從名稱服務器中檢索該位置。

3. A的資源行為或由A控制的資源(運行時)。資源管理器是一個負責進行資源非配的仲裁者。某些資源管理器(例如那些基于實時系統中速率單調性分析的管理器)可以保證滿足在某些限制條件中的所有請求。當然,A必須把對該資源的控制轉讓給資源管理器。

4. A的存在。工廠模式能夠根據需要創建實例,因此B對A的存在的依賴性由該工廠的操作來滿足。

3>推遲綁定時間。

可修改性場景包括通過減少需要修改的的數量不能滿足的兩個元素—部署時間以及允許非開發人員進行修改。推遲綁定時間支持這兩個場景,但需要提供額外的基礎結構來支持后期綁定。

可以把各個時間決策綁定到執行系統中。我們討論一下那些影響部署時間的決策。系統的部署由某個過程來規定。當修改由開發人員進行時,通常會有一個測試和分布過程,該過程確定進行改變和該改變對最終用戶可用之間的時間延遲。在運行時綁定意味著系統已經為該綁定做好了準備,并且完成了所有的測試和分配步驟。推遲綁定時間還能夠使最終用戶或系統管理員進行設置,或提供影響行為的輸入。

許多戰術的目的是在載入時或運行時產生的影響,如下所示:

1. 運行時注冊支持即插即用操作,但需要管理注冊額外開銷。例如,發布/訂閱注冊可以在運行時或載入時實現。

2.配置文件的目的是在啟動時設置參數。

3. 多態允許方法調用的后期綁定。

4.組件更換允許載入時間綁定。

5.遵守已定義的協議允許獨立進程的運行時綁定。

3. 性能戰術

性能戰術的目標就是對在一定的時間限制內到達系統的事件生成一個響應。事件到達后系統或者對該事件進行處理,或者由于某些原因處理被阻塞。下面是產生響應時間的兩個基本因素:資源消耗和閉鎖時間

資源消耗:包括CPU、數據存儲、網絡通信帶寬和內存,但它也可以包括由設計中的特定系統所定義的實體。例如必須對緩沖器進行管理,并且對關鍵部分的訪問必須是按順序進行的。事件可以是各種類型的,每種類型的事件都經過了一個處理序列。

閉鎖時間:可能會由于資源爭用、資源不可用或者計算依賴于另外一個還不能得到的計算結果而導致計算不能使用某個資源,從而阻止了計算的進行。

1.資源爭用。這些事件可能是單個流,也可能是多個流。爭用同一個資源的多個流或相同流中爭用同一個資源的不同事件會增加等待時間。

2.資源的可用性。即使沒有爭用,如果資源不可用,計算也無法進行下去。資源離線、組件故障、或其他原因都會導致資源不可用。在任何情況下,設計師都必須確定資源不可用可能會導致急劇增加等待時間的位置。

3.對其他計算的依賴性。計算可能必須等待,因為它必須與一個計算的結果同步,或者是因為它在等待它所啟動的一個計算的結果。例如,它可能會從兩個不同的源讀取信息,如果這兩個源是按順序讀取的話,等待時間將會比并行讀取高。

1> 資源需求。

事件流是資源需求的源。需求的兩個特征是:資源流中的事件之間的時間(在事件流中多長時間進行一次請求);每個請求所消耗的資源是多少。

減少等待時間的一個戰術就是減少處理一個事件流所需要的資源。方法如下:

1. 提高計算效率。處理事件或消息中的一個步驟就是應用某個算法。改進在關鍵的地方所使用的算法將減少等待時間。有時可以用一種資源換取另一種資源。例如,可以把仲裁者數據保存在存儲庫中,也可以重新生成,這取決于時間和空間資源的可用性。該戰術通常用在處理器上,但用在其他資源上也是有效的,如磁盤。

2. 減少計算開銷。如果沒有資源請求,就可以減少處理需求。

減少等待時間的另外一個戰術就是減少所處理事件的數量。可以用一下方式進行:

1.管理事件率。如果可以降低監視環境變量處的取樣頻率,就可以減少需求。如果系統進行了超量設計的話,這樣做是不可行的,其他時候使用不必要的高采樣率來建立多個流之間的和諧周期。也就說,某個流或事件被過采樣,以使他們可以被同步化。

2.控制采樣頻率。如果沒有對外部生成的事件的到達進行控制,則可以用一個較低的頻率對排隊的請求進行采樣,這樣可能會導致請求的丟失。

用于減少或管理需求的其他戰術包括控制資源的使用。

3.限制執行時間。限制用多少執行時間對事件做出響應。有時這樣做有意義,有時沒有意義。對于迭代、依賴于數據的算法,限制迭代的數量就是限制執行時間的一個方法。

4.限制隊列的大小。這控制了排成隊列到達事件的最大數量,因此控制了用來處理到達事件的資源。

2> 資源管理

盡管不能控制對資源的需求,但對這些資源的管理會影響響應時間。下面是一些資源管理的戰術。

1.引入并發。如果可以并行處理,就可以減少閉鎖時間。可以通過在不同的線程上處理不同的事件流或者創建額外的線程來處理不同的活動集來引入并發。引入并發后,適當地把線程分配給資源(負載均衡)非常重要,以盡可能利用并發。

2.維持數據或計算的多個副本。客戶機—服務器模式中的客戶機是計算的副本。使用副本的目的是減少在中央服務器上進行所有的計算時出現的爭用。高速緩存的數據通常是現有數據的一個副本,因此使用副本一致和同步就變成了系統必須承擔的責任。

3.增加可用資源。速度更快的處理器、額外的處理器、額外的內存以及速度更快的網絡都可以減少等待時間。在選擇資源時,通常會考慮成本,但增加資源絕對也是一個減少等待時間的戰術。

3> 資源仲裁

當存在資源爭用時,必須對資源進行調度。我們需要對處理器、緩沖器和網絡進行調度安排。設計師的目標是理解每個資源使用的特性,并選擇之一致的調度策略。

從概念上講調度策略都有兩部分:優先級分配和分派。所有的調度策略都分配優先級。一些常見的調度策略為:

1.先進先出。FIFO隊列同等看待對資源的所有請求,并依次對其進行處理。在FIFO隊列中,一個請求可能被另一個需要很長時間來生成響應的請求阻止。只有所有請求優先級都是相同的,這就不是一個問題;但如果一些請求的優先級高于其他請求的優先級,就存在這個問題。

--固定優先級調度。

固定優先級調度為每個請求資源的源分配一個特定的優先級,并按該優先級順序分配資源。該策略能夠保證為優先級較高的請求提供更好的服務,但是,對一些優先級較低的請求來說,肯能要等待很長的時間才能得到服務,因為它前面有很多優先級較高的請求。3個常見的優先級策略為:

⑴語義重要性。每個流都根據生成它的任務的某個與領域特性被靜態地分配一個優先級。這種調度在大型機系統中,其中領域特性是任務啟動的時間。

⑵時限時間單調。時限時間單調是一種靜態優先級分配,它將較高的優先級分配給具有較短時限時間的流。在調度的不同優先級流具有實時時限時間時,使用該調度策略。

⑶速率單調。速率單調是周期流的一種靜態優先級分配,它將較高的優先級分配給具有較短周期的流。該調度策略是時限時間單調的一種特殊情況,但它更為我們所熟知,操作系統對此提供支持的可能性較大。

--動態優先級調度

⑴輪轉。輪轉是一種調度策略,它對請求進行排序,然后在允許的時候,把資源分配給該排序中的下一個請求。輪轉的一個特殊形式就是循環執行,在循環執行中,資源分配是每隔一個固定的時間進行的。

⑵時限時間最早優先。時限時間最早優先根據具有最早的視線時間的掛起請求來分配優先級。

--靜態調度。循環執行調度是一種調度策略,在該策略中,離線確定先占點和資源分配順序。

4. 安全性戰術

安全性戰術分為:與抵抗攻擊有關的戰術、與檢測攻擊有關的戰術以及從攻擊中恢復有關的戰術。給門裝鎖就是在抵抗攻擊,在房子中放一個運動傳感器就是在檢測攻擊,給房子上保險就是從攻擊總恢復。

1> 抵抗攻擊。

我們把認可、機密性、完整性和保證確定為目標。可以組合使用下面的戰術來實現這些目標。

1.對用戶身份驗證。身份驗證能夠保證進行訪問的用戶或遠程計算機確實是它所聲稱的用戶或計算機。密碼、一次性密碼、數字證書以及生物識別均提供身份驗證。

2.對用戶進行授權。授權能夠保證經過了身份驗證的用戶有權訪問和修改數據或服務。這通常通過在系統中提供一些訪問控制模式進行管理。可以對單個用戶進行訪問控制,也可以對某一類用戶進行訪問控制。也可以根據用戶分組、用戶角色或個人列表定義用戶類。

3.維護數據的機密性。應該對數據進行保護,以防止未經授權的訪問。一般通過對數據和通訊鏈路進行某種形式的加密來實現機密性。另一方面,通信鏈路一般不具有授權控制,對于通過公共可訪問的通信鏈路傳數據來說,加密是唯一的保護措施。對基于web的鏈路,可以通過VPN或者SSL來實現該鏈路。

4.維護完整性。應該如期提供數據,數據中可能有冗余信息、如校驗或哈希值,他們可以與原始數據一起進行加密,也可以單獨加密。

5.限制暴露的信息。攻擊者通常會利用暴露的某個弱點來攻擊主機上的所有數據和服務。設計師可以設計服務在主機上的分配,以使只能在每個主機上獲得有限的服務。

6.限制訪問。防火墻根據消息源或目的地端口來限制訪問。來自未知源的消息可能是某種形式的攻擊。限制對已知源的訪問并不總是可行的,例如,一個公共網站上可能會有來自未知源的請求。這種情況中使用一個配置就是所謂的解除管制區。

2> 檢測攻擊。

檢測攻擊通常通過“入侵檢測”系統進行。

3> 從攻擊中恢復。

可以把從攻擊中恢復的戰術分為恢復狀態相關的戰術和與識別攻擊者相關的戰術。在將系統或數據恢復到正確狀態時所使用的戰術與用于可用性的戰術發生了重疊,因此他們都是從不一致的狀態恢復到一致狀態。差別就是要特別注意維護系統管理數據的冗余副本,如密碼、訪問控制列表、域名服務和用戶資料數據。

用于識別攻擊者的戰術就是“維持審計追蹤”。審計追蹤就是應用到系統中的數據的所有事務和識別信息的一個副本。可以使用審計信息開追蹤攻擊者的操作。支持認可并支持系統恢復。

5. 可測試性戰術

可測試性戰術目標是允許在完成一個軟件開發的增量后,輕松地對軟件進行測試。我們對兩類用于測試的戰術進行討論:提供輸入并捕獲輸出;內部監視。

1> 輸入/輸出

1.記錄回放。記錄回放是指捕獲跨接口的信息,并將其作為測試專用軟件的輸入。在正常操作中操作中跨一個接口的信息保存在某個存儲庫中,它代表來自一個組件的輸出和傳到一個組件的輸入。記錄該信息使得能夠生成對其中一個組件的測試輸入,并保存用于以后比較測試輸出。

2.將接口與實現分離。將接口與實現分離允許實現的代替,以支持各種測試目的。占位實現允許在缺少被占用的組件時,對系統的剩余部分進行測試。用一個組件代替某個專門的組件能夠使被代替的組件充當系統剩余部分的測試工具。

3.特化訪問路線/接口。具有特化的測試接口允許通過測試工具并獨立于其正常操作,來捕獲或指定組件的變量值。例如,可以通過允許特化的接口提供原數據,測試工具利用該接口推動其活動。

2> 內部監視

內置監視器。組件可以維持狀態、性能負載、容量、安全性或其他可通過接口訪問的信息。此接口可以是該組件的一個永久接口,也可以是通過instrumentation技巧臨時引入的接口,如面向方面編程或預處理程序宏。一個常見的技巧就是當監視狀態被激活時記錄事件。監視狀態實際上會增加測試工作,因為隨著監視的關閉,可能必須重復測試。盡管額外測試需要一定的開銷,但這卻使組件活動的可見性得以提高,這樣做是值得的。

6. 易用性戰術

易用性與用戶完成期望任務的難易程度以及系統為用戶提供的支持種類有關。有兩種類型的戰術支持易用性,每種戰術所針對的是兩種類別的“用戶”。第一類是運行時,包括那些在系統運行期間支持用戶的戰術。第二類基于用戶接口設計的迭代特性,它在設計時支持接口開發人員。

1> 運行時戰術。

一旦系統執行,就可以通過為用戶提供關于系統正在做什么的反饋,以及用于提供發出基于易用性命令的能力來增強易用性。例如,在糾錯或更高效的操作中,“取消”、“撤銷”、“聚合”和“顯示多個視圖”均為用戶提供支持。

1.維持任務的一個模型。這種情況下,所維持的模型是關于任務的信息。任務模型用于確定上下文,以使該系統了解用戶試圖做什么,并提供各種協助。例如,知道句子通常以大寫字母開頭能夠使應用程序糾正該位置的小寫字母。

2.維持用戶的一個模型。維持的模型是關于用戶的信息。它確定了用戶對該系統的了解,用戶在期望的響應時間方面的行為,以及特定于某個用戶或某類用戶的其他方面。例如,維持用戶模型能夠使系統以用戶可以閱讀月面的速度滾動頁面。

3.維持系統的一個模型。所維持的模型就是關于系統的信息。它確定了期望的系統行為,以便為用戶提供適當的反饋。系統模型反饋預測了諸如完成當前活動所需要時間的項目。

2> 設計時戰術。

在測試過程中,通常會頻繁修改用戶接口。也就是說,易用性工程師將為開發人員提供對當前接口設計的修改,開發人員將實現這些修改。這導致了對語義一致的可修改性的求精。

將用戶接口與應用的其余部分分離開來。局部化所期望的變更是語義一致的一個基本原理。因為在開發中和部署后,我們預計用戶接口頻繁發生變化,因此單獨維護用戶接口代碼將會變更局部化在某個地方。開發用于實現該戰術并支持用戶接口修改的軟件架構模式為:

模型——視圖——控制器

表示——抽象——控制

Seeheim

Arch/Slinky

7. 戰術與架構模式的關系

Active Objcet設計模式將方法執行從方法調用中分離出來,以增強并發,并簡化對駐留在其自身控制線程中的對象的同步訪問。

該模式由6個元素組成:代理,它提供了允許客戶對主動對象調用公共訪問方法的接口;方法請求,它定義了用于執行主動對象的方法的一個接口;激活接口,它維持了掛起方法請求的一個緩沖器;調度程序,它決定接下來執行什么方法請求;附屬,他定義可建模為主動對象的行為和狀態;將來,它允許客戶獲得方法調用的結果。

該模式的動機就是增強并發性——這是一個性能目標。因此其主要目的就是實現“引入并發“性能戰術。然而,還要注意該模式包含的其他戰術。

信息隱藏(可修改性)。每個元素都選擇了它將實現的責任,并將其實現隱藏在接口后面。

仲裁者(可修改性)。該代理充當著把變化緩沖到方法調用中的仲裁者。

綁定時間(可修改性)。主動對象模式假定對該對象的請求在運行時到達該對象。然而,并沒有確定客戶機與代理的綁定時間。

調度策略(性能)。調度程序實現一些調度策略。

對設計師來說,分析過程包括理解嵌入在實現中的所有戰術;設計過程包括在關于哪些戰術最和將實現系統期望的目標方面,做出一個明智的選擇。

8. 架構模式和樣式

軟件中架構模式與建筑物中的架構樣式類似,它由幾個將他們組合起來以維持架構完整性的關鍵特性和規則組成。架構模式由以下幾個因素確定:

一組元素類型(如數據存儲庫或計算數學函數的組件)

指出其相互關系的元素的拓撲布局。

一組語義限制(如管道——過濾器樣式中的過濾器是純數據轉化器——他們以增量形式將其輸入流轉換為輸出流,但并不控制上游流或下游元素)。

一組交互機制(如子例程調用、事件——調閱者、黑板)、他們確定元素將如何通過允許的拓撲進行協調。
架構模式和戰術之間是什么關系呢?正如已經說明的那樣,我們把戰術看作是設計的基本“構建塊”,并根據該戰術創建架構模式和策略。

中国比特币暴涨 老时时结果 河北时时开奖结果走势图 vr赛游戏啥感觉 重庆快乐十分有官方吗 山西快乐十分钟助手 内蒙古时时走势图 大乐透开奖 广东时时11选五结果查询今天 118图库 青海快三计划 吉林省快三彩票开奖结果查询 一肖中特期期准中网 打开app是什么意思 黑龙江十一选五走势图表 重庆时时走势图基本 四川快乐十二福彩开奖034期