1. 程式人生 > >軟件構造 第一章

軟件構造 第一章

sign 靈活 多態 復制 防禦 整潔 oop 可重用性 執行文件

一、課程簡介

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.性能

構建-代碼:設計模式

運行-代碼:空間復雜性(內 存管理); 時間復雜性(算 法性能); 代碼調優

運行-組件:分布式系統

運行-代碼-時期:性能分析和調整、

運行-組件-時期:並行/多線程程序

軟件構造 第一章