第二章第二節 軟件構造的過程、系統和工具
本節主要講述軟件從從零到一遵循的子過程,在考試中不會作重點考察html
Outline
- 廣義的軟件構造過程
- 編程
- 靜態代碼分析
- 動態代碼分析
- 調試與測試
- 重構
- 狹義的軟件構造過程
- 構造系統:經典BUILD場景
- 構造系統的組件
- 構造過程和構造描述
- Java編譯工具
- 子目標和結構變體
- 構造工具
Notes
## 廣義的軟件構造過程

【編程(Coding)】程序員
- 開發語言:如Java、C、Python
- 使用IDE(集成開發工具)的優點(組成)
- 方便編寫代碼和管理文件(有代碼編輯器,代碼重構工具、文件和庫(Library)管理工具)
- 可以編譯、構建(有編譯器、解釋器、自動構建工具)
- 結構清晰(有面向對象的類層次結構圖和類瀏覽器)
- 有GUI界面
- 支持第三方擴展工具
- 建模語言:UML(Unified Modeling Language,統一建模語言)
- UML是用來對軟件系統進行可視化建模的一種語言;
- UML的結構由一組一致的規則定義;
- 建模的目的:
- 有助於按照需求對系統進行可視化分析
- 可以理解系統的結構或行爲
- 給出了構造系統的模板
- 對作出的決策進行文檔化
- 更多關於UML,參考 jiuqiyuliang的博客專欄
- 配置語言:鍵值文件(.ini;.properties;.rc);XML,YAML,JSON
- 配置語言用於配置程序的參數和初始設置
- 目的:
- 部署環境設置
- 應用程序功能的變體
- 組件之間鏈接的變體
【靜態代碼分析】編程
- 定義:靜態代碼分析是指不運行被測程序自己,僅經過分析或檢查源程序的語法、結構、過程、接口等來檢查程序的正確性。
- 注:該過程提供了對代碼結構的理解,有助於確保代碼符合行業標準
- 注:自動化的工具能夠幫助程序員和開發人員進行靜態代碼分析
【動態代碼分析】小程序
- 定義:動態測試方法是指經過運行被測程序,檢查運行結果與預期結果的差別,並分析運行效率、正確性和健壯性等性能。
- 注:必須執行足夠的測試輸入,使用諸如代碼覆蓋率之類的軟件測試措施有助於確保已經觀察到程序的一組可能行爲的足夠部分。
- 注:配置文件(「程序配置文件」,「軟件配置文件」)是一種動態程序分析形式,用於度量程序的空間(內存)或時間複雜度,特定指令的使用狀況,函數調用的頻率和持續時間。
【調試與測試】瀏覽器
- 測試(Test)
- 狹義:程序是否正常運行、可否知足全部需求
- 廣義:

- 調試(Debug):識別錯誤的根本緣由並對其進行糾正的過程。
【重構】服務器
- 重構它不會改變代碼的外部行爲,但會改進其內部結構。
- 投入短時間時間/工做成本以得到長期收益,並對系統的總體質量進行長期投資。
- 重構須要保持代碼正常工做,只須要用一些小步驟保留語義
- 須要進行單元測試來證實代碼正常工做
## 狹義的軟件構造過程
【構造系統:經典的BUILD場景】框架
Build場景綜述:maven
- 用傳統編譯語言(如C、C++、Java)編寫軟件(compilation)
- 用解釋型語言(如Perl、Python)編寫軟件的打包和測試(packaging and testing)
- 用基於Web的應用程序進行編譯和打包
- 使用靜態HTML頁面
- 使用Java或C# 編寫的源代碼
- 使用JSP,ASP或PHP語法編寫的混合文件以及多種類型的配置文件
- 執行單元測試代碼的其他部分對軟件進行隔離驗證。
- 執行靜態分析工具來是被程序源代碼中的錯誤
- 生成PDF或HTML文檔
傳統編譯語言:C、C++、Java等:編輯器
- 源文件被編譯成目標文件,鏈接到代碼庫或可執行程序中
- 生成的文件被收集到可安裝在目標機器上的發行包中
- 版本控制工具
- 源樹和對象樹:特定開發人員使用的源文件和編譯對象文件集。
- 構建機器:執行編譯工具的計算設備。
- 發佈打包和目標機器:打包軟件,分發給最終用戶,而後安裝到目標機器上的方法。
解釋型語言:Perl、Python等:函數
- 解釋的源代碼不會編譯到目標代碼中,不須要對象樹,解釋源文件自己被收集到一個發行包中被安排在目標機器上;
- 編譯工具專一於轉換源文件並將它們存儲在發行包中;
- 不在程序構建時編譯成機器碼
基於Web應用程序的構建系統:編譯代碼,解釋代碼和配置或數據文件的混合。
- 靜態HTML文件,只包含標記數據顯示在Web瀏覽器中,直接複製到發行包。
- 包含代碼的JavaScript文件將由最終用戶瀏覽器解釋,直接複製到發行包。
- JSP,ASP或PHP頁面,包含HTML和程序代碼的混合,由Web應用程序服務器而不是構建系統編譯和執行,複製到發佈包,準備安裝到Web服務器上。
- 構建系統在編譯打包Java類文件以前執行轉換。Java類在Web應用程序服務器上或瀏覽器內執行(使用小程序)。
【構建系統的組件】(該部分不做爲考試內容,內容轉自 長安蒹葭的博客 以保持課程內容完整性)
- 源樹:程序的源代碼被存儲爲多個磁盤文件,將這些文件安排到不一樣的地方稱爲源樹,其結構一般反映了軟件的體系結構。
- 對象樹:一個單獨的樹層次結構,用於存儲由構建過程構建的任何對象文件或可執行程序。
- 編譯工具:將可讀的源文件轉換爲機器可讀的可執行程序文件的程序。
- 編譯器:源文件 -> 對象文件
- 連接器:多個相關的目標文件 -> 可執行的程序映像
- 基於UML的代碼生成器:模型 -> 源代碼文件
- 文件生成器:腳本 -> 文件
- 發佈打包和目標機器:生成能夠實際安裝在用戶機器上的東西。
- 從源和目標樹中提取相關文件並將它們存儲在發行包中。
- 發行包應該是單個磁盤文件,而且應該進行壓縮以減小下載所需的時間。
- 任何不重要的調試信息都應該被刪除,以避免它使軟件的安裝變得混亂。
- 包裝類型:
- 檔案文件:zip和解壓縮
- 軟件包管理工具:UNIX風格,例如.rpm和.deb
- 定製的GUI安裝工具:Windows風格
【構造過程與構造描述】

- 如何構建系統
- 開發人員構建:開發人員已檢出VCS的源代碼並正在專用工做區中構建軟件,結果發佈包將用於開發人員的私人開發。
- 發佈版本:爲測試組提供一個完整的軟件包供驗證,軟件的質量足夠高時爲客戶提供相同的軟件包。用於發佈版本的源代碼樹只編譯一次,永不修改。
- Sanity構建:與發佈版本相似,但並不是針對客戶,能夠天天發生屢次,而且趨向於徹底自動化。
【子目標和構建變體】(該部分不做爲考試內容,內容轉自 長安蒹葭的博客 以保持課程內容完整性)
- 三種不一樣的構建方法
- 構建子目標:僅重建開發人員正在處理的樹的部分。
- 構建不一樣版本的軟件:定製輸出以改變軟件的行爲。
- 構建不一樣的目標體系結構:爲各類不一樣的CPU類型和操做系統編譯相同的源文件集,包括x86,MIPS和PowerPC等CPU以及Linux,Windows和Mac OS X等操做系統。
- 構建子目標
- 任何大型軟件均可以分紅許多子組件,一般採用靜態或動態庫的形式。
- 避免耗費時間,最好限制構建子組件的數量。
【構建工具】
- Java構造工具:Make、Ant、Maven、Gradle、Eclipse
- Maven將項目的生命週期大體分爲9個,分別爲:clean、validate、compile、test、package、verify、install、site、deploy
- 使用maven自動構建的方法:如mvn compile
- validate - 驗證項目是否正確,並提供全部必要的信息
- compile - 編譯項目的源代碼
- test - 使用單元測試框架測試已編譯的源代碼。這些測試不該該要求打包或部署代碼
- package - 獲取已編譯的代碼並將其打包爲可分發的格式,例如JAR。
- verify - 對集成測試結果進行任何檢查,以確保符合質量標準
- install - 將軟件包安裝到本地存儲庫中,做爲本地其餘項目的依賴項
- deploy - 在構建環境中完成,將最終包複製到遠程存儲庫,以便與其餘開發人員和項目共享。
- 更多參考 u011991249的專欄