軟體建構的多元視圖
- 前記
- 構成軟體系統的三個次元
- 軟體構造的八個多元視圖
- 視圖之間的轉變
- 總結
前記
這篇部落格是軟體構造系列學習筆記的第一篇,也是我部落格的第一篇。開通部落客要也是因為教授軟體構造課程(使用語言為Java)老師的要求,用來記錄學習MIT的這門課我覺得也是很不錯的方法。由于筆者不太善于表達同時能力水準有限,故部落格難免有錯誤之處,敬請指正,但我會盡我所能地記錄下學習這門課的點滴感悟。
構成軟體系統的三個次元
構成軟體系統主要有三個次元:
- By phases: build- and run-time views
- By dynamics: moment and period views
- By levels: code and component views
以上是英文的定義。在三個次元中每個次元都包含兩個views(視圖)。下面對這些視圖進行介紹。
build- and run-time views
Build-time views 簡單翻譯為構造階段視圖,從想法到使用者需求到産品設計到代碼編寫再到可安裝/可執行的程式包,其實都屬于構造階段。
idea => requirement => design => code => installable / executable package
從code-level來看,build-time views意味着代碼的邏輯組織,源代碼是如何通過例如functions, classes, methods, interfaces等基本的代碼塊有邏輯的組織起來,以及互相之間的依賴關系。
從component-level來看,build-time views意味着代碼的實體組織,源代碼是如何通過 files, directories, packages, libraries組織起來,以及互相之間的依賴關系。
從moment-view來看,build-time views意味着特定時刻的軟體形态。
從period-view來看,build-time views意味着軟體形态随時間的變化。
Run-time views 簡單翻譯為運作階段視圖,當你的程式在目标機器中運作時表現如何,以及在運作時目标機器要将哪些磁盤檔案存入記憶體等等,這些問題都是run-time views所關注的。
從code-level來看,run-time views意味着一個可執行程式在記憶體中的狀态以及程式内部各個單元間(例如Objects和functions等)如何互相調用。
從component-level來看,run-time views意味着軟體包是如何部署到具體的實體環境中(例如作業系統,網絡,硬體等),以及他們之間如何互相作用。
從moment-view來看,run-time views意味着一個程式在特定時刻的表現。
從period-view來看,run-time views意味着程式随時間變化的一系清單現,包括過程調用圖(Procedure Call Graph),消息圖(序列圖)( Message Graph (Sequence Diagram)),并行和多線程/程序(Parallel and multithreads/processes),分布式程序(Distributed processes)等。
Moment and Period views
Moment views簡單翻譯為特定時刻視圖,Period views簡單翻譯為階段視圖,從moment和period這兩個英文單詞就可看出這兩個視圖之間的差異,前一個着眼于軟體在某一特定時刻的表現或者組織結構,後一個着眼于軟體在某個階段一系列的表現變化或者組織結構的變化。
Code and Component views
Code views簡單翻譯為代碼視圖,Component簡單翻譯為元件視圖。這兩個視圖的差異主要在于前一個着眼于程式本身,包括程式自身的邏輯組織以及程式在記憶體中的狀态。後一個着眼于程式的外部實體環境,包括程式的實體組織以及程式是如何部署到不同的實體環境中的。
軟體構造的八個多元視圖
在前面軟體構造的三個次元中介紹了六個視圖,其實在這六個視圖中互相之間是有聯系的,在介紹build-time view 和 run-time view的時候也已經涉及到了,在這一節中,我會詳細介紹不同次元的不同視圖三個三個組成的多元視圖,共有八個多元視圖。
(1)Build-time, moment, and code-level view
在這個多元視圖中,有三個互相關聯的形式:
- 詞彙層面
- 文法層面
- 語義層面
詞彙層面指的是基于詞彙的半結構化源代碼(Lexical-based semi-structured source code),半結構化是指近乎自然語言的風格+遵循特定的程式設計文法,前者友善程式員,後者友善編譯器。
文法層面指的是面向文法的程式結構(Syntax-oriented program structure),具體例子有抽象文法樹(AST)。
AST:徹底結構化,将源代碼變為一棵樹,對樹做各種操作等于對源代碼的修改。
在Java中有專門的類可将源代碼轉換為AST,并對AST做各種操作,具體過程可參考下圖。
![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiI0NXYFhGd192UvwVe0lmdhJ3ZvwFM38CXlZHbvN3cpR2Lc1TPB10QGtWUCpEMJ9CXsxWam9CXwADNvwVZ6l2c052bm9CXUJDT1wkNhVzLcRnbvZ2LcBTNXpFdGdkW1ZlbaZXUYpVd1kmYr50MZV3YyI2cKJDT29GRjBjUIF2LcRHelR3LcJzLctmch1mclRXY39jMwQDN1ADN5EjNwMDM4EDMy8CX0Vmbu4GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.jpg)
語義層面指的是面向語義的程式結構(Semantics-oriented program structure),語義是指源代碼具體想實作什麼目标。具體例子有使用類圖Class Diagram(UML)來描述 interfaces, classes, attributes, methods以及它們之間的關系。下圖既是一張Class Diagram。
(2)Build-time, period, and code-level view
這個多元視圖描述了代碼随時間的變化(Code churn),包括代碼行的增加,删除和修改。
Code churn is defined as lines added, modified or deleted to a file from one version to another.
用過github的人應該很熟悉這張圖,這張圖就展現了Code churn,圖中綠色部分代表新增加的代碼,紅色部分代表删除的代碼。
(3)Build-time, moment, and component-level view
這個多元視圖着眼于源代碼被實體地組織成檔案(file),這些檔案進一步由目錄組織。檔案被封裝成包(package),并在邏輯上封裝元件和子系統。可重用子產品以庫(library)的形式存在,具體例子見下圖。
在程式設計時和build時,需告訴IDE和JVM在哪裡尋找某些庫 ,将庫整合到可執行程式中有兩種不同方法,靜态連結和動态連結,靜态連結發生在build-time階段。
(4)Build-time, moment, and component-level view
這個多元視圖着眼于各項軟體實體(例如files/packages/components/libraries)随時間如何變化,Software Configuration Item (SCI,軟體配置項) 以及版本(Version)的演變。
Software versioning is the process of assigning either unique version names or unique version numbers to unique states of computer software.
對于每個軟體,都會有一個初始版本,并在此版本的基礎上逐漸發展,在發展的過程中,不斷釋出新的版本,直到Final Version。在此過程中,我們通常使用Version Control System (VCS)即版本控制系統來對軟體的版本進行管理,現在流行的VCS主要是git,下圖展示了軟體版本的不斷發展。
(5) Run-time, moment, and code-level view
這個多元視圖着眼于程式運作時在某個特定時刻的代碼層面的狀态,主要工具有快照圖(Snapshot diagram)和記憶體資訊轉儲(Memory dump )。
快照圖描述了程式運作時記憶體裡變量層面的狀态,記憶體資訊轉儲是指硬碟上的一個檔案,它是當程序因特定類型的内部錯誤或信号而中止時産生的,其中包含程序記憶體的副本。
(6) Run-time, period and code-level view
這個多元視圖着眼于程式運作階段在某一段時間内在代碼層面的視圖,以下面UML中的Sequence diagram為例,圖中展現了程式各個單元間的互動。
在這一視圖中主要涉及到執行跟蹤(Execution tracing),即用日志方式記錄程式執行的調用次序,這通常由程式員用于調試目的,并根據跟蹤日志中包含的資訊的類型和詳細資訊,由有經驗的管理者或技術支援人員以及軟體監視工具來診斷軟體的常見問題 。
(7) Run-time, moment, and component-level view
這一多元視圖着眼于程式運作階段在某一特定時刻在元件層面的視圖,以下面UML中的部署圖為例,圖中展示了各個元件的互相聯系。
(8) Run-time, period, and component-level view
這一多元視圖着眼于程式在運作階段在某一階段的元件層面視圖,這一視圖主要涉及到事件日志(Event logging),事件日志為系統管理者提供了對診斷和審計有用的資訊。每一類事件都被賦予一個唯一的“代碼”來格式化并輸出一條人類可讀的消息。這有利于本地化,并允許系統管理者更輕松地獲得有關發生問題的資訊。
下圖展示了事件日志和執行追蹤的差別
視圖之間的轉變
以下圖來總結各個視圖之間的轉變。