軟件構造 第一章
一、課程簡介
1.軟件構造課程的目標
①程序設計與實現能力
②系統設計與實現能力
③系統分析與評價能力
④利用現代軟件構造工具的能力
2.傳統軟件設計步驟
①討論需要寫的軟件並實現②測試代碼並改錯③重復②。圖示如下
3.更好的軟件設計
①未雨綢繆②考慮非功能質量屬性③考慮多種設計選擇④把設計決策明確寫下來
4.設計的目標、原則和模式
設計目標:編程的視野
設計原則:編程的標尺
設計模式:編程的經驗
二、軟件構造多維視圖
1.什麽是軟件
(1)構成:
·程序Program:UI, Algorithms, Utilities, APIs, test cases, etc
·數據Data:files, databases, etc
·文檔Documents:SRS需求規格說明, SDD設計規格說明, user manuals, etc
(2)考慮因素
·用戶:誰來使用
·商業目標:為何有用
·社會環境:應遵循何種法則
·技術環境:如何實施
·硬件/網絡:在何處運行
2.軟件構造的多維視圖
(1)Build-time Views
概述:Build-time:idea->requirement->design->code->installable/executable package (軟件構造的核心過程和環節)
Code-level view:源代碼:在邏輯上源代碼是如何由基本程序塊(比如函數,類,方法,接口等等)構成的
Component-level view:組件:源代碼是如何通過文件,目錄,包,庫之間的依賴關鍵進行物理上的組織
Moment view:時刻:在某一時刻,源代碼和組件的情況
Period view:時期:程序如何隨時間改善
①Build-time,moment,and code-level view
三種內部相互關聯的形式:面向此法的源代碼、面向語法的程序結構(AST(抽象語法樹))、面向語義的程序結構(Class Diagram)
②Build-time,period,and code-level view
代碼隨著時間變化:添加,修改或者刪除文件,使其從一個版本到另一個版本
③Build-time, moment, and component-level view
源代碼物理地組織成文件,其進一步按目錄組織
文件被封裝成包、組件和子系統
可復用模塊形成類庫
庫:庫存儲在自己的磁盤文件中,收集一組代碼函數,可以在各種程序中重用。
來源:OS預裝,語言自帶,第三方,自行開發
與庫鏈接:步驟:用到的類庫列表->復制類庫到可執行程序中
靜態鏈接:庫是單個目標文件的集合,在編譯過程中,將類庫文件復制到可執行文件中,稱為可執行文件的一部分
UML圖
④Build-time, period, and component-level view
文件,包,組件和庫如何隨著時間變化
軟件配置項(SCI)
版本控制系統(VCS)
版本控制是給計算機軟件的不同 狀態分配唯一的名字或者編號的過程
軟件演化是指軟件產生之 後,由於不同的原因對其進行持續地升級過程。
(2)Runtime Views
Code-level : 可執行程序的內存狀態,程序之間的互動、調用
Component-level:軟件包部署到物理環境(OS、network、硬件等),及其互動
Moment view:特定時刻的程序行為
Period view:隨著時間的行為
可執行程序:CPU執行的機器可讀指令序列以及相關的數據值
庫:可以由不同程序重用的常用對象代碼的集合,大多數系統包含一系列庫,不能直接在目標機器上加載和執行,必須首先與一個可執行程序鏈接。
本地機器代碼:
源代碼被加載入內存進行解釋執行,轉化為CPU能識別的機器碼
程序被編譯成字節碼形式(如 java的class文件) ,運行時需要由解析器轉換成機器碼或者解釋執行
解釋字節碼:在執行時編譯為字節碼解釋執行
動態鏈接:
不將目標文件復制到可執行程序 中,而是會標註用到的類庫
在運行時,加載用到的庫到內存中,然後同主程序鏈接
部署時需要將用到的類庫同程序一起部署
優點:類庫 變化時,不需要重新生成可自行程序 、多個運行中程序可共享同一類 庫,優化內存使用
⑤ Run-time, moment, and code-level view
快照圖:刻畫內存中某時刻變量的狀態
內存轉儲:包含進程內存副本的硬盤上的文件,當進程被某些內部錯誤或信號中止時生成
⑥Run-time, period and code-level view
UML:程序單元之間的交互
⑦Run-time, moment, and component-level view
uml中的部署:
⑧Run-time, period, and component-level view
事件記錄 | 軟件追蹤 |
由系統管理員使用 | 開發人員使用 |
記錄高級信息 | 記錄低級信息 |
不包含太多重復事件或者無用信息 | 可以包含重復事件或者無用信息 |
需要標準的輸出格式 | 輸出格式沒有限制 |
事件日誌需要本地化 | 很少考慮本地化 |
對於添加新類型的事件或消息不靈活 | 對於添加新的追蹤消息必須靈活 |
三、軟件構造的質量目標
外部質量:外部質量是用戶能夠感受到的,影響用戶的使用
內部質量:影響使用代碼的相關人員,影響軟件本身和開發者
1.外部質量
1)正確性(主要質量):正確性是軟件產品執行其規範所定義的確切任務的能力。每層都要確保自己是正確的,同時假定其調用的低層也是正確的。
檢查和調試、防守編程、標準化編程
2)健壯性:健壯性是軟件系統對異常情況作出適當反應的能力。
健壯性同異常情況相關,異常或非異常取決於程序的規 格說明
判斷是否是異常的標準,不取決於客觀的正確標準,而取決於程序的規格說明
3)可擴展性:可擴展性是指軟件易於調整以適應變化的能力。
提升可擴展性的兩個原則:簡約主義設計,分離主義設計
4)復用性:可重用性是軟件元素用於構建許多不同應用程序的能力。
軟件經常遇到相似的模式,利用共性,避 免重復實現。
難點:不同軟件 有不同的設定/規定
5)兼容性:不同軟件系統之間相互可容的集成
難點:不同軟件 有不同的設定/規定
標準化是解決兼容性的關鍵:標準化文件格式,標準化數據結構,標準化用戶接口
通過協議來實現更通用的兼容性
6)效率:效率是軟件系統對硬件資源盡可能 少的需求的能力
正確性是效率的前提
7)可移植性:可移植性是指便於將軟件產品 轉移到各種硬件和軟件環境。
8)易用性:用戶可以輕松掌握軟件的使用,也包括安 裝、運行和監控的容易度
結構清晰、 理解用 戶,換位思考,站在用戶的角度設計軟件
9)功能性:系統提供的可能性範圍
過多的新功能容易帶來一 致性的缺失,影響易用性
更難的問題是避免如此專註於功能而忘記其他品質
在質量提升技術的幫助下,可以在整個項目中保持質量水平不變,而不僅僅 是功能性。
10)及時性:及時性是軟件系統在用戶需要時或之前發布的能力。
11)其他品質:
可驗證性:是否易於驗證
完整性:軟件系統保護其各種組件(程序和數據)免受未經授權的 訪問和修改的能力。
可修復性:可修復性是促進缺陷修復的能力。
經濟性:同及時性相伴,是系統能 夠按照其分配的預算或低於預算完成的能力。
2.內部品質
代碼:LOC(圈復雜度, 用來衡量一個模塊判定結構的復雜程度 )
結構:耦合度,內聚度,設計中追求高內聚和低耦合
可讀性、可理解性、大小,復雜性,整潔性
內部質量因素通常用作外部質量因素的部分度量
3.質量屬性間的權衡
完整性和易用性
經濟性和功能性、可重用性
效率與可移植性、可重用性
及時性和可拓展性
正確性放在首要地位
4.軟件構建的關鍵問題
系統的軟件構建方法
形式化的軟件規格說明
在開發過程中自動檢查
更好的語言機制
一致性檢查工具
5.軟件構造的五個關鍵目標
1.可理解性:
代碼的可理解性(變量/子程序/ 語句的命名與構 造標準、代碼布 局與風格、註釋、 復雜度)
構建-組件-時刻:構件/項目的可理解 性(包的組織、文 件的組織、命名空 間)
·構建-代碼-周期:重構
·運行-代碼-時刻:日誌跟蹤
2.可復用性
構建-代碼:ADT/OOP; 接口與實現分離; 重載; 繼承/重載/重寫; 組合/代理; 多態; 子類型與泛型編 程; OO設計模式
構建-組件:API設計,庫,可重用的框架
3.可維護性和適應性:
構建-代碼:模塊化設計; 聚合度/耦合度; SOLID; OO設計模式;格式化、規範化、語法化編程
構建-組件:SOLID GRASP、軟件版本控制
4.健壯性
·構建-代碼:異常處理、防禦編程、先驗程序
·構建-組件:單元測試、集成測試
·構建-周期:回歸測試
運行-時刻:調試轉儲
運行-周期:日誌跟蹤
5.性能
構建-代碼:設計模式
運行-代碼:空間復雜性(內 存管理); 時間復雜性(算 法性能); 代碼調優
運行-組件:分布式系統
運行-代碼-時期:性能分析和調整、
運行-組件-時期:並行/多線程程序
軟件構造 第一章