本節書摘來自異步社區《軟件工程(第4版?修訂版)》一書中的第1章1.5節 系統的方法,作者【美】Shari Lawrence Pfleeger , 【加】Joanne M.Atlee,更多章節內容可以訪問云棲社區“異步社區”公眾號查看。
1.5 系統的方法
軟件工程(第4版?修訂版)
我們開發的項目并不存在于真空中。通常,我們裝配在一起的硬件和軟件,必須與用戶、其他軟件任務、其他部分的硬件、現有數據庫(即仔細定義的數據集合和數據關系)甚至其他的計算機系統進行交互。因此,為任何項目提供一個背景是非常重要的,該背景就是項目的邊界(boundary):項目中包含什么,不包含什么。例如,假設主管讓你編寫一段程序為辦公室的人員打印工資單。你必須知道你的程序是否只是簡單地從另一個系統中讀入工作時間并且打印結果,還是必須同時計算工資信息。類似地,你必須知道程序是否需要計算稅率、養老金以及津貼,或者是否要隨每份工資單提供這些項目的報告單。實際上,你真正要問的問題是:項目從哪里開始,到哪里結束?同樣的問題可以應用于任何系統。一個系統是對象和活動的集合,再加上對象和活動之間關系的描述。就每個活動而言,典型的系統定義包括需要的輸入列表、采取的動作以及產生的輸出。因此,要開始一個項目,必須知道系統包含哪些對象或活動。
1.5.1 系統的要素
我們通過命名系統的組成部分并標識這些組成部分是如何與另一個系統相互聯系的,來描述這個系統。這種標識是分析擺在我們面前的問題的第一步。
1.活動和對象
首先,我們對活動和對象加以區分。活動(activity)是發生在系統中的某些事情,通常描述為由某個觸發器引發的事件,活動通過改變某一特性將一個事物轉變成另一個事物。這種轉變可能意味著數據元素從一個位置移到另一個位置,從某個值轉變為另一個值,或者與其他的數據相結合為另一個活動提供輸入。例如,一個數據項可以從一個文件移到另外一個文件。這種情況下,改變的特性是位置。或者,數據項的值可能增加。最后,數據項的地址可以與若干其他數據項的地址一起包含在參數列表中,以便可以調用另外的例程一次性處理所有數據。
活動中涉及的要素稱為對象(object)或實體(entity)。通常,這些對象以某種方式相互聯系。例如,對象能夠排列在表格或矩陣中。對象常常組成記錄,其中,每一條記錄按規定的格式排列。例如,一個雇員的歷史記錄中可能包含如下對象(也稱字段):
名 郵政編碼
教名 每小時的工資
姓 每小時的津貼
街道地址 累計休假
城市 累計病假
州
記錄中不僅定義了每個字段,而且定義了每個字段的大小以及字段之間的關系。因此,記錄描述規定了每一個字段的數據類型、記錄中的開始位置和字段的長度。依次地,因為每個雇員都有一條記錄,所有的記錄組合在一起就構成了文件,并且要指明文件特性(如最大的記錄數等)。
有時,對象定義得稍有不同。不是將每一項考慮為一個大記錄中的字段,而是將對象看作是獨立存在的。對象的描述包括每個對象的特性列表,以及所有使用對象或影響對象的動作的列表。例如,考慮“多邊形”對象。一個對象描述可以是,這個對象具有諸如邊數以及每條邊的長度等特性。動作可能包括計算面積和周長。甚至可能還可以有一個屬性稱為“多邊形類型”。這樣,可以標識每個“多邊形”的實例,例如是“菱形”還是“長方形”等。類型本身也可能有對象描述。例如“長方形”可以由“正方形”和“非正方形”組成。當我們在第4章研究需求分析的時候,將會探討這些概念,并在第6章討論面向對象開發的時候進行深入探討。
2.關系和系統邊界
一旦定義了實體和活動,就要把實體和它們的活動進行匹配。實體和活動之間的關系應該要清晰、仔細地予以定義。實體的定義包括實體起源于何處的描述。有些項駐留于已經存在的文件中,有些項在活動的過程中被創建。實體的目的地也是非常重要的。有些項僅僅被一個活動所使用,而有些項會被指定為其他系統的輸入。也就是說,系統的某些項會被當前系統范圍之外的活動所使用。因此,可以認為我們正在考慮的系統是有邊界的。有些項跨越邊界進入我們的系統,而另一些是我們系統的產品并為其他系統所使用。
使用這些概念,我們能夠把系統(system)定義成一組事物的集合:一組實體、一組活動、實體和活動之間關系的描述以及系統邊界的定義。系統的這個定義不僅適用于計算機系統,而且適用于其他任何事物(其中,對象以某種方式與其他對象交互)。
3.系統舉例
要了解系統定義是如何進行的,考慮一個呼吸系統的例子:身體吸進氧氣排出二氧化碳和水。我們可以很容易地定義它的邊界:如果指出身體的一個具體器官,就能說出它是不是呼吸系統的一部分。氧氣和二氧化碳分子都是實體或對象,它們按照可以明確定義的方式進出呼吸系統。我們也可以根據實體間的交互來描述系統中的活動。如果必要的話,可以通過什么進入以及什么離開來描述這個系統,也可以用一個表格來描述其中涉及的所有實體和活動。圖1-8說明了一個呼吸系統。請注意每個活動都涉及實體,并且可以通過描述哪些實體是輸入,它們如何被處理,以及輸出的結果來進行定義。
我們還必須清晰地描述計算機系統,與預期的用戶一起定義系統的邊界:我們的工作從什么地方開始以及在什么地方結束?另外,我們必須知道什么處于系統的邊界上,從而可以確定輸入的開始和輸出的目的地。例如,在打印工資單的系統中,支付信息可能來自公司的計算機,系統輸出可能是發送到郵箱的工資單的集合,送到適當的接收者手中。在圖1-9所示的系統中,我們可以了解邊界并且理解實體、活動和它們之間的關系。
圖1-9 工資單產品的系統定義
1.5.2 相互聯系的系統
邊界的概念之所以重要,是因為幾乎不存在與其他系統無關的系統。例如,呼吸系統必須與消化系統、循環系統、神經系統以及其他系統交互。呼吸系統沒有神經系統就不能發揮作用,循環系統沒有呼吸系統也不能正常工作。這種相互依賴可能是非常復雜的(實際上,由于我們不能認清生態系統的復雜性,已經引起并加劇了許多環境問題)。但是,一旦描述了系統的邊界,就很容易了解什么在系統內部、什么不在以及什么超出了邊界。
此外,一個系統存在于另外一個系統的內部也是可能的。描述一個計算機系統的時候,通常是集中于實際系統的一小部分。這種集中使得我們能夠定義和構建一個比包裹它的系統簡單得多的系統。如果仔細記錄那些影響系統的系統之間的交互,即使集中于更大系統中的較小部分,也不會有任何損失。
我們來討論一個例子,看一看是如何做到這一點的。假定要開發一個水系監控系統,該系統在整條河流經過的很多地點采集數據。在數據采集點完成若干計算,其結果被傳送到中心站點進行匯總報告。這樣一個系統的實現方式可能是:有一個中心站點的計算機,它與數十個在遠程站點的小型計算機進行通信。其中,必須考慮很多系統活動,包括收集水質數據的方式、在遠程站點進行的計算、與中心站點的信息通信、通信數據在數據庫或共享數據文件中的存儲以及根據數據創建報告。可以把這個系統看成是一些系統的集合,其中每個系統都有特定的目的。尤其是,我們可以只考慮較大的系統的通信方面,并且開發一個通信系統將數據從遠程站點傳送到中心站點。如果我們仔細地定義通信系統和大系統之間的邊界,通信系統的設計和開發就可以獨立于大系統來完成。
整個水系監控系統的復雜性要比通信系統大得多,因此,通過對分開的、較小的部分進行處理可以簡化我們的工作。如果邊界定義詳細、正確,那么根據較小的部分構建較大的系統是相對容易的。通過以分層的方式來考慮較大的系統,可以按圖1-10所示那樣描述系統的構造過程(以水系監控系統為例)。一個層次本身就是一個系統,但是,每一層及其包含的那些層次也構成一個系統,圖1-10中的圓圈表示它所代表的系統的邊界,所有圓圈的集合構成了水系監控系統。
一個系統可能包含另外一個系統,這一點很重要,因為它反映了這樣一個事實:一個系統中的對象或活動是外層所代表的每一個系統的一部分。因為每一層都會引入更多的復雜性,所以隨著每一層系統的加入,要理解任何一個對象或活動就會更加困難。因此,首先集中于最小的系統是最簡單的方法,這樣便于更好地理解隨后的系統。
我們使用這種思想來構建一個替換舊版本的新系統(無論是手工方式還是自動方式)。我們希望盡可能多地理解新、舊系統是如何運行的。通常情況下,兩個系統之間的差別越大,設計和開發就越困難。之所以出現這樣的困難,不僅是因為人們傾向于拒絕改變,而且這種差別使得系統難以學習。在構造或合成大系統的時候,把新系統的構造作為一系列遞增的中間系統是極其有用的。不是從A系統直接構建B系統,而是從A到A,再到A,然后到B。例如,假定A是一個包含3個主要功能的手工系統,B是A的自動化版本。我們可以將A系統定義為一個新的系統,它只有功能1是自動化的,而功能2和功能3仍是手工的。然后,A有自動化的功能1和功能2,但其功能3仍是手工的。最后,B具有3個自動化的功能。通過將A到B的“距離”分成三段,我們就得到了一系列小的問題,這比整個問題要更容易處理。
在我們的例子中,兩個系統非常相似。它們的功能是相同的,但是實現的方式不同。但是,目標系統常常與現有系統存在著巨大差別。尤其是,通常希望目標系統不受現有硬件和軟件所強加的約束的限制。增量開發(incremental development)方法可以包含一系列階段,其中每一個階段都使前面的系統不受當前系統約束的限制。例如,階段1可能增加一個新硬件,階段2可能替換執行一組特定功能的軟件。系統逐漸地從舊的軟件和硬件中脫離開,直到它體現出新系統的設計。
因此,系統開發可以首先在實際系統中實現一組變化,然后增加一系列變化以生成完整的設計方案,而不是從當前一步一下跳到將來。使用這種方法,我們必須同時從兩個不同的方面看待系統:靜態地和動態地。靜態視圖告訴我們系統如今如何運行,而動態視圖展示系統如何演變成最終的系統。缺少任何一方面都是不完整的。
本文僅用于學習和交流目的,不代表異步社區觀點。非商業轉載請注明作譯者、出處,并保留本文的原始鏈接。