质量属性战术
某某征集系統在設計時所實現的質量屬性戰術以及原因
一、 可用性戰術(恢復和修復是可用性的重要方面,為了阻止錯誤發展成故障,至少能夠把錯誤限制在一定的范圍內,從而使修復成為可能)
????? 大家都知道,系統故障是不可避免的,比如系統不能啟動、顯示黑屏或藍屏、桌面凝固不動、鍵盤不能輸入、光標不能移動、軟件運行非正常中斷,再比如應用軟件與操作系統不完全兼容,它們之間有沖突或者與硬件固有特性發生沖突等故障。所以對于某某征集系統,在可用性設計時運用了事務的戰術,這是因為事務就是綁定幾個有序的步驟,以能夠立刻撤銷整個綁定。如果進程中的一個步驟失敗的話,可以使用事務來防止任何數據受到影響,還可以使用事務來防止訪問相同數據的幾個同時線程之間發生沖突。事務,就是一組操作數據庫的動作集合。如果一組處理步驟或者全部發生或者一步也不執行,我們稱該組處理步驟為一個事務。當所有的步驟像一個操作一樣被完整地執行,我們稱該事務被提交。由于其中的一部分或多步執行失敗,導致沒有步驟被提交,則事務必須回滾到最初的系統狀態。
????? 在某某征集系統中,采用了Spring事務策略,也就是spring事務管理的實現方式。它有一個統一的抽象,是由實現下面這個接口完成的。???????? org.springframework.transaction.PlatformTransactionManager接口的內容如下:
Public interface PlatformTransactionManager()
{ ?
TransactionStatue getTransaction(TransactionDefinition definition) throws TransactionException; ?
Void commit(TransactionStatus status) throws TransactionException; ?
Void rollback(TransactionStatus status) throws TransactionException; ?
}?
?????? 不管是聲明式的還是編程式的事務管理都需要此抽象來完成,getTransaction() 根據類型為TransactionDefinition的參數返回一個TransactionStatus對象。返回的 TransactionStatus對象可能代表一個新的或已經存在的事務(如果在當前調用堆棧有一個符合條件的事務)。如同J2EE事務上下文,一個 TransactionStatus也是和執行的線程關聯的。同時,在框架中還存在TransactionDefinition接口,即上邊的參數類型。此接口指定了事務隔離程度、事務傳播、事務超時、只讀狀態。另外,還有TransactionStatus接口。這個接口為處理事務提供簡單的控制事務執行和查詢事務狀態的方法。
spring提供了幾個關于事務處理的類:?
TransactionDefinition //事務屬性定義
TranscationStatus //代表了當前的事務,可以提交,回滾。
PlatformTransactionManager是spring提供的用于管理事務的基礎接口,其下有一個實現的抽象類 AbstractPlatformTransactionManager,我使用的事務管理類例如 DataSourceTransactionManager等都是這個類的子類。
?二、可修改性戰術(可修改戰術的目標是控制實現、測試和部署變更的時間和成本)
???? 對于某某征集系統的在線填報模塊,我采用了信息隱藏的戰術。信息隱藏就是把該功能模塊的責任分解為更小的部分,并選擇使那些基本不變的基礎信息成為公有的,那些重要的技術信息成為私有的,可以通過指定的接口獲得公有責任。信息隱藏的目的是將變更隔離在一個模塊內,防止變更擴散到其他模塊。它與“預期期望的變更有很大關系”,因為它使用那些變更作為分解的基礎。
三、性能戰術(性能戰術的目標就是對在一定的時間限制內到達系統的事件生成一個響應)
???? 針對于某某征集系統的性能戰術,我采用了固定優先級的調度策略,為每個企業的提交請求分配一個特定的優先級,并按該優先級順序對提交的表單進行審核。該策略能夠保證為企業優先級較高的請求提供更好的服務,但是,對一些優先級較低的請求來說,可能要等待很長的時間才能得到服務,因為它前面有很多優先級較高的請求。所有我設計的優先級策略是輪轉調度策略,它對請求進行排序,然后在允許的時候,把資源分配給該排序中的下一個請求。輪轉的一個特殊形式就是循環執行,在循環執行中,資源分配是每隔一個固定的時間進行的。
四、 安全性戰術(安全性戰術分為:與抵抗攻擊有關的戰術、與檢測攻擊有關的戰術以及從攻擊中恢復有關的戰術)
????? 對于某某征集系統來說,安全性要求是非常高的,因為這涉及到某個省份的發展,所以在設計某某征集系統時,安全性問題是至關重要的。首先,我采用了MD5加密, MD5加密算法主要用在用戶注冊用戶名和密碼的加密,對于普通強度的口令加密。但是簡單的MD5加密是沒有辦法達到絕對的安全的,因為普通的MD5加密有多種暴力破解方式,因此如果想要保證該征集系統的安全,還需要采用其他的安全性戰術。該征集系統開啟以后很多地方要用到數據庫里的字典數據,比如部門表,歸口管理表,這些數據是可變的,但是變化頻率很小,所有每次用到的時候都去數據庫取數據很明顯的是對資源的浪費,所以想按照以前的方法把數據從數據庫里讀取出來,放到內存,每次用到的時候直接去內存找就可以了。想法應該是沒有問題的,可是這個學期需要用到SSH框架,所以另配一個listener和Spring同時啟動的做法是不可取的。因為listener的啟動機制是線程,并不是按順序一個一個啟動,所有直接在spring的配置文件里,注冊bean文件,讓 bean文件來執行取數據的工作,但是這個bean顯然是不能使用DAO的類,因為DAO層的東西無法注入進來,所以用到的是BeanPostProcessor接口,用類PBSTrackManagerPostProcessor實現它其中的一個方法 postProcessAfterInitialization,這個方法里可以引入一個類GetDictionaryInfo,實現類的方法 getAllInfo(),當getAllInfo去調用DAO層的數據時就可以了。
五、 可測試性戰術(可測試性戰術目標是允許在完成一個軟件開發的增量后,輕松地對軟件進行測試)
????? 對于某某征集系統,我用Spring整合了JUnit框架進行單元測試代碼, AbstractTransactionalSpringContextTests類是?AbstractDependencyInjectionSpringContextTests的直接子類,這個類一般應用在事務相關的測試中,一旦完成每個測試它就會正常地回滾事務,不會真正更新數據庫,若要手動設置事務相關操作,可以重載onSetUpInTransaction和?onTearDownInTransaction方法,以便手工開始并提交事務,或者調用setComplete()方法。這個類也可以在沒有事務的情況下使用。AbstractTransactionalDataSourceSpringContextTests也是?AbstractTransactionalSpringContextTests的直接子類,它使用了Spring的基于JDBC 的?jdbcTemplate工具類,支持數據庫級別的事務。關于在TestCase?Class里取得spring?context,TestCase?Class必須繼承四個AbstractXXXSpringContextTests中的其中一個,那么就必須實現?protected?abstract?String[]?getConfigLocations();方法來取得spring?context。需要注意要加載的context?xml?file的路徑問題:我的代碼是基于classpath,因此applicationContext.xml和hibernate-?context.xml必須放在classpath里,也就是把xml?files放到WEB-INF/classes目錄下,或者是在project?properties里把xml?files的路徑加到classpath里。
六、易用性戰術(易用性與用戶完成期望任務的難易程度以及系統為用戶提供的支持種類有關)
????? 在測試過程中,通常會頻繁修改用戶接口。也就是說,易用性要求開發人員實現對當前接口設計的修改,所以必須對語義一致的可修改性的求精。將用戶接口與應用的其余部分分離開來。局部化所期望的變更是語義一致的一個基本原理。因為在開發中和部署后,我們預計用戶接口頻繁發生變化,因此單獨維護用戶接口代碼將會變更局部化在某個地方。開發用于實現該戰術并支持用戶接口修改的軟件架構模式為:模型——視圖——控制器。MVC是一種設計模式,它強制性的把應用程序的輸入、處理和輸出分開。MVC把應用程序分為三個核心模塊:模型、視圖和控制器,它們分別負擔不同的任務:(1)視圖是用戶看到并與之交互的界面。視圖向用戶顯示相關的數據,并能夠接受用戶的輸入數據,但是它并不進行任何實際的業務處理。視圖可以向模型查詢業務狀態,但不能改變模型,視圖還能接受模型發出的數據更新事件,從而對用戶界面進行同步更新。(2)模型是應用程序的主要部分。模型表示業務數據和業務邏輯。一個模型能為多個視圖提供數據,由于同一個模型可以被多個視圖重用,所以提高了應用的可重用性。(3)控制器接受用戶的輸入并調用模型和視圖去完成用戶的需求。當Web用戶單擊Web頁面中的提交按鈕來發送HTML表單時,控制器接受請求并調用相應的模型去處理請求,然后調用相應的視圖來顯示模型返回的數據。MVC處理過程,首先控制器接受用戶的請求,并決定應調用哪個模型來進行處理;然后模型根據用戶請求進行相應的業務邏輯處理,并返回數據;最后控制器調用相應的視圖來格式化模型返回的數據,并通過視圖呈現給用戶。
????? 對于某某征集系統,我用JSP頁面生成表示層的內容,讓Servlet完成深層次的處理任務,在這里,Servlet充當控制器的角色,負責處理用戶請求,創建JSP頁面需要使用的JavaBean對象,根據用戶請求選擇合適的JSP頁面返回給用戶。在JSP頁內沒處理邏輯,它僅負責檢索原先由Servlet創建的JavaBean對象,從Servlet中提取動態內容插入到靜態模板。這是一種有突破性的軟件設計方法,它清晰地分離了表達和內容,明確了角色定義以及開發與網頁設計的分工。
轉載于:https://www.cnblogs.com/niujunyan/p/6637901.html
總結
- 上一篇: 黄金期货有哪些交易规则,一手黄金期货要多
- 下一篇: 完整的境外、港澳台、电信、移动、联通、教