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