本節書摘來自異步社群《軟體工程(第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可能替換執行一組特定功能的軟體。系統逐漸地從舊的軟體和硬體中脫離開,直到它展現出新系統的設計。
是以,系統開發可以首先在實際系統中實作一組變化,然後增加一系列變化以生成完整的設計方案,而不是從目前一步一下跳到将來。使用這種方法,我們必須同時從兩個不同的方面看待系統:靜态地和動态地。靜态視圖告訴我們系統如今如何運作,而動态視圖展示系統如何演變成最終的系統。缺少任何一方面都是不完整的。
本文僅用于學習和交流目的,不代表異步社群觀點。非商業轉載請注明作譯者、出處,并保留本文的原始連結。