版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1.1軟件的基本概念1.2軟件工程1.3軟件生存周期1.4結(jié)構(gòu)化的軟件開發(fā)方法1.5面向?qū)ο蟮能浖_發(fā)方法習(xí)題11.1.1軟件的特征
要理解軟件的含義,首先要了解軟件的特征。軟件是邏輯的而不是物理的產(chǎn)品,因此,軟件具有與硬件完全不同的特征。
(1)軟件的開發(fā)不是傳統(tǒng)意義上的生產(chǎn)制造。
軟件開發(fā)與硬件制造之間有一些相似之處,但卻有著本質(zhì)的區(qū)別。軟件產(chǎn)品的生產(chǎn)主要是腦力勞動(dòng)、手工開發(fā)方式,大部分產(chǎn)品是“定做”的。
1.1軟件的基本概念
(2)軟件不會(huì)“磨損”。
硬件在其生命初期有較高的故障率(這些故障主要是設(shè)計(jì)或制造的缺陷),這些缺陷修正之后,故障率在一段時(shí)間內(nèi)會(huì)降到一個(gè)很低的水平;隨著時(shí)間的推移,故障率又將提升。硬件故障率的變化曲線如圖1.1所示。圖1.1硬件故障率的變化曲線軟件并不受引起硬件磨損的環(huán)境因素的影響。因此,理論上講,軟件的故障率曲線呈現(xiàn)出如圖1.2所示的形式。軟件在其生命初期具有較高的故障率,但在這些錯(cuò)誤改正之后(我們假設(shè)理想情況下改正過程中并不引入其他錯(cuò)誤),曲線就會(huì)趨于平穩(wěn)。軟件不會(huì)被磨損,不過它會(huì)退化,這一點(diǎn)可以通過圖1.2來解釋清楚。在其生命期中,軟件會(huì)經(jīng)歷修改(維護(hù)),隨著這些修改有可能會(huì)引入新的錯(cuò)誤,使得故障率曲線呈現(xiàn)為圖1.2所示的鋸齒形。圖1.2軟件故障率的理想曲線與實(shí)際曲線硬件和軟件之間的不同還表現(xiàn)在當(dāng)一個(gè)硬件構(gòu)件磨損時(shí),可以用另外一個(gè)備用零件替換它,但對(duì)于軟件就沒有備用零件可以替換了。每一個(gè)軟件故障都表明了設(shè)計(jì)或是將設(shè)計(jì)轉(zhuǎn)換成機(jī)器可執(zhí)行代碼的過程中存在錯(cuò)誤。因此,軟件維護(hù)要比硬件維護(hù)復(fù)雜得多。
(3)軟件的可復(fù)用性差,不能通過已有的構(gòu)件組裝而成。
我們先來看一下一個(gè)基于微處理器的控制硬件是如何設(shè)計(jì)和建造出來的。設(shè)計(jì)工程師畫一個(gè)簡(jiǎn)單的數(shù)字電路圖,做一些基本的分析以保證可以實(shí)現(xiàn)預(yù)定的功能,然后查閱所需的元器件的目錄,每一個(gè)集成電路(通常稱為“IC”或“芯片”)都有一個(gè)零件編號(hào)、固定的功能、定義好的接口和一組標(biāo)準(zhǔn)的集成指南,每一個(gè)選定的零件都可以買到,由此可以很方便地組裝起一個(gè)基于微處理器的控制硬件。
在軟件開發(fā)中,采用一些已有的構(gòu)件組建一個(gè)軟件的方法,僅僅在小范圍內(nèi)得到應(yīng)用。多數(shù)軟件的設(shè)計(jì)開發(fā)還必須完全從零開始。1.1.2軟件的分類
軟件種類繁多,概括起來可分為兩類:系統(tǒng)軟件和應(yīng)用軟件。
1.系統(tǒng)軟件
系統(tǒng)軟件是指操作系統(tǒng)及與之相關(guān)的各種軟件的總稱。系統(tǒng)軟件是一組為其他程序服務(wù)的程序。一類系統(tǒng)軟件(如編譯器、編輯器和文件管理程序)所處理的信息結(jié)構(gòu)是復(fù)雜的,但又是確定的;還有一類系統(tǒng)軟件(如操作系統(tǒng)、驅(qū)動(dòng)程序和通信進(jìn)程等)則處理大量的非確定的信息。系統(tǒng)軟件具有以下特點(diǎn):●與計(jì)算機(jī)硬件頻繁交互;
●支持多用戶;
●需要精細(xì)調(diào)度、資源共享及靈活的進(jìn)程管理的并發(fā)操作;
●復(fù)雜的數(shù)據(jù)結(jié)構(gòu);
●多外部接口;
●具有可移植性,例如嵌入式系統(tǒng)中的實(shí)時(shí)操作系統(tǒng)。
常見的操作系統(tǒng)有DOS、UNIX、Linux以及Windows。
2.應(yīng)用軟件
應(yīng)用軟件是指為用戶的特殊應(yīng)用目的而開發(fā)的軟件。例如財(cái)務(wù)管理軟件、人力資源管理軟件。1.1.3軟件的發(fā)展
今天,軟件擔(dān)任著雙重角色,它是一種產(chǎn)品,同時(shí)又是開發(fā)和運(yùn)行產(chǎn)品的載體。作為一種產(chǎn)品,它擴(kuò)充了計(jì)算機(jī)硬件的功能;作為開發(fā)和運(yùn)行產(chǎn)品的載體,它是計(jì)算機(jī)控制
(操作系統(tǒng))的基礎(chǔ)、信息通信(網(wǎng)絡(luò))的基礎(chǔ),也是創(chuàng)建和控制其他程序(軟件工具和環(huán)境)的基礎(chǔ)。
計(jì)算機(jī)硬件的發(fā)展經(jīng)歷了四個(gè)時(shí)代,同樣,計(jì)算機(jī)軟件的發(fā)展也大致經(jīng)歷了四個(gè)階段。
(1)?20世紀(jì)60年代中期以前,是計(jì)算機(jī)系統(tǒng)發(fā)展的早期階段。
在計(jì)算機(jī)發(fā)展的早期階段,大多數(shù)人把軟件開發(fā)看成是不需預(yù)先計(jì)劃的事情。計(jì)算機(jī)編程很簡(jiǎn)單,沒有什么系統(tǒng)化的方法。軟件的開發(fā)沒有任何管理,一旦進(jìn)度拖后了或者成本提高了,程序員才開始手忙腳亂地彌補(bǔ)。由于那個(gè)時(shí)期的軟件很簡(jiǎn)單,因而他們的努力在一般情況下往往也會(huì)見效。當(dāng)通用的硬件已經(jīng)非常普遍的時(shí)候,軟件卻相反,對(duì)每一類應(yīng)用均需自行設(shè)計(jì),應(yīng)用范圍很有限。此時(shí),軟件產(chǎn)品還處在嬰兒階段,大多數(shù)軟件均是由使用它們的人員或組織自行開發(fā)的,軟件在使用過程中出現(xiàn)了問題,編寫軟件的人員必須負(fù)責(zé)修改。在這種個(gè)人化的軟件開發(fā)環(huán)境中,設(shè)計(jì)往往僅是人們頭腦中的一種模糊想法,而軟件文檔根本就不存在。在早期,我們了解了很多關(guān)于計(jì)算機(jī)系統(tǒng)的實(shí)現(xiàn),但對(duì)于計(jì)算機(jī)系統(tǒng)工程卻幾乎一無所知。
(2)從20世紀(jì)60年代中期到70年代中期,是計(jì)算機(jī)系統(tǒng)發(fā)展的第二階段。
計(jì)算機(jī)系統(tǒng)發(fā)展的第二階段跨越了從20世紀(jì)60年代中期到70年代中期的十余年。其主要特征是:多道程序設(shè)計(jì)、多用戶系統(tǒng)引入了人機(jī)交互的新概念;交互技術(shù)打開了計(jì)算機(jī)應(yīng)用的新世界及硬件和軟件配合的新層次;實(shí)時(shí)系統(tǒng)能夠從多個(gè)源收集、分析和轉(zhuǎn)換數(shù)據(jù),使得進(jìn)程的控制和輸出的產(chǎn)生以毫秒而不是分鐘來進(jìn)行;在線存儲(chǔ)的發(fā)展導(dǎo)致了第一代數(shù)據(jù)庫(kù)管理系統(tǒng)的出現(xiàn)。
第二階段的一個(gè)特點(diǎn)就是軟件產(chǎn)品的使用和“軟件作坊”的出現(xiàn)。隨著計(jì)算機(jī)應(yīng)用領(lǐng)域的擴(kuò)大,來自工業(yè)界、政府和學(xué)術(shù)界的人們紛紛開始開發(fā)各類軟件包,并取得了巨大的經(jīng)濟(jì)利益。
隨著計(jì)算機(jī)系統(tǒng)的增多,新的問題出現(xiàn)了,當(dāng)發(fā)現(xiàn)軟件存在錯(cuò)誤或缺陷時(shí),需要糾正部分代碼甚至全部代碼;當(dāng)用戶需求發(fā)生變化時(shí),需要對(duì)軟件進(jìn)行修改;當(dāng)硬件環(huán)境更新時(shí),需要修改軟件以適應(yīng)硬件的變化。這些活動(dòng)統(tǒng)稱為軟件維護(hù)。在軟件維護(hù)上所花費(fèi)的精力開始以驚人的速度消耗資源。更糟糕的是,許多程序的個(gè)人化特性使得它們根本不能維護(hù)。這就是所謂的“軟件危機(jī)”。
(3)計(jì)算機(jī)系統(tǒng)發(fā)展的第三個(gè)階段從20世紀(jì)70年代中期開始,并且跨越了整整10年。
在分布式系統(tǒng)中,多臺(tái)計(jì)算機(jī)之間的分布式處理和通信極大地提高了計(jì)算機(jī)系統(tǒng)的復(fù)雜性。廣域網(wǎng)和局域網(wǎng)、高帶寬數(shù)字通信以及對(duì)“即時(shí)”數(shù)據(jù)訪問需求的增加都對(duì)軟件開發(fā)者提出了更高的要求。然而,軟件仍然繼續(xù)應(yīng)用于工業(yè)界和學(xué)術(shù)界,個(gè)人應(yīng)用很少。第三階段的另外一個(gè)特點(diǎn)是微處理器的出現(xiàn)和廣泛應(yīng)用,微處理器的出現(xiàn)使得一系列智能產(chǎn)品紛紛面世,大到汽車,小到微型醫(yī)療設(shè)備等,使計(jì)算機(jī)的應(yīng)用真正成為大眾化的應(yīng)用。
(4)計(jì)算機(jī)系統(tǒng)發(fā)展的第四個(gè)階段已經(jīng)不再著重于單臺(tái)計(jì)算機(jī)和計(jì)算機(jī)程序,而是面向計(jì)算機(jī)和軟件的綜合影響。
20世紀(jì)70年代后由復(fù)雜的操作系統(tǒng)控制的功能強(qiáng)大的計(jì)算機(jī)、廣域網(wǎng)和局域網(wǎng),配以先進(jìn)的應(yīng)用軟件已成為標(biāo)準(zhǔn)。計(jì)算機(jī)體系結(jié)構(gòu)迅速?gòu)募械闹鳈C(jī)環(huán)境轉(zhuǎn)變?yōu)榉植嫉目蛻魴C(jī)/服務(wù)器環(huán)境。世界范圍的信息網(wǎng)提供了一個(gè)基本結(jié)構(gòu),使得“信息高速公路”和“網(wǎng)際空間連通”成為可能。事實(shí)上,Internet可以看做是能夠被單個(gè)用戶訪問的“軟件”。軟件產(chǎn)業(yè)在世界經(jīng)濟(jì)中不再是無足輕重的,由產(chǎn)業(yè)巨子(如微軟)所做的一個(gè)決定可能會(huì)帶來成百上千億美元的風(fēng)險(xiǎn)。隨著第四階段的進(jìn)展,一些新技術(shù)開始涌現(xiàn)。面向?qū)ο蠹夹g(shù)在許多領(lǐng)域中迅速取代了傳統(tǒng)軟件開發(fā)方法。雖然關(guān)于“第五代”計(jì)算機(jī)的預(yù)言仍是一個(gè)未知數(shù),但是軟件開發(fā)的“第四代技術(shù)”確實(shí)改變了軟件界開發(fā)計(jì)算機(jī)程序的方式。專家系統(tǒng)和人工智能軟件終于從實(shí)驗(yàn)室里走了出來,進(jìn)入了實(shí)際應(yīng)用,解決了現(xiàn)實(shí)世界中的大量問題。結(jié)合模糊邏輯應(yīng)用的人工神經(jīng)網(wǎng)絡(luò)軟件揭示了模式識(shí)別和類似人的信息處理能力的可能性。虛擬現(xiàn)實(shí)和多媒體系統(tǒng)使得與最終用戶的通信可以采用完全不同的方法?!斑z傳算法”則提供了可以駐留于大型并行生物計(jì)算機(jī)上的軟件的潛在可能性。
1.1.4軟件危機(jī)
1.軟件危機(jī)的概念
軟件危機(jī)是指在計(jì)算機(jī)軟件的開發(fā)和維護(hù)過程中所遇到的一系列嚴(yán)重問題。這些問題不僅僅是不能正常運(yùn)行的軟件才具有的,實(shí)際上,幾乎所有軟件都不同程度地存在這些問題,如開發(fā)周期延長(zhǎng),成本增加,可靠性降低等。
具體來說,軟件危機(jī)主要有以下一些典型表現(xiàn):
(1)對(duì)軟件開發(fā)成本和進(jìn)度的估計(jì)常常很不準(zhǔn)確。
(2)用戶對(duì)“已完成的”軟件系統(tǒng)不滿意。
(3)軟件產(chǎn)品的質(zhì)量不可靠。
(4)軟件常常是不可維護(hù)的。
(5)軟件通常沒有適當(dāng)?shù)奈臋n資料。
(6)軟件成本在計(jì)算機(jī)系統(tǒng)總成本中所占的比例逐年上升。
(7)軟件開發(fā)生產(chǎn)率提高的速度,既跟不上硬件的發(fā)展速度,也遠(yuǎn)遠(yuǎn)跟不上計(jì)算機(jī)應(yīng)用迅速普及、深入的趨勢(shì)。
以上列舉的僅僅是軟件危機(jī)的一些明顯表現(xiàn),與軟件開發(fā)和維護(hù)有關(guān)的問題遠(yuǎn)遠(yuǎn)不止這些。
在軟件產(chǎn)業(yè)中,“危機(jī)”已經(jīng)伴隨我們走過了30多年的歷程。面向?qū)ο蠓椒?OO)就是在這種背景下誕生的,它使業(yè)界看到了成功的希望,同時(shí)也促使OO方法和技術(shù)的研究得以迅速發(fā)展。
2.產(chǎn)生軟件危機(jī)的原因
在軟件開發(fā)和維護(hù)的過程中之所以存在這么多問題,一方面與軟件本身的特點(diǎn)有關(guān),另一方面也和軟件開發(fā)與維護(hù)的方法不正確有關(guān)。
與軟件開發(fā)和維護(hù)有關(guān)的許多錯(cuò)誤認(rèn)識(shí)和做法的形成,可以歸因于在計(jì)算機(jī)系統(tǒng)發(fā)展的早期階段軟件開發(fā)的個(gè)體化特點(diǎn)。錯(cuò)誤的認(rèn)識(shí)和做法主要表現(xiàn)為忽視軟件需求分析的重要性,認(rèn)為軟件開發(fā)就是寫程序并設(shè)法使之運(yùn)行,輕視軟件維護(hù)等。
了解產(chǎn)生軟件危機(jī)的原因,澄清錯(cuò)誤認(rèn)識(shí),建立起關(guān)于軟件開發(fā)和維護(hù)的正確概念,僅僅是解決軟件危機(jī)的開始,全面解決軟件危機(jī)需要一系列綜合措施。
3.消除軟件危機(jī)的途徑
為了消除軟件危機(jī),首先應(yīng)該對(duì)計(jì)算機(jī)軟件有一個(gè)正確的認(rèn)識(shí),應(yīng)該推廣使用在實(shí)踐中總結(jié)出來的開發(fā)軟件的成功的技術(shù)和方法,并且研究探索更好、更有效的技術(shù)和方法,盡快消除在計(jì)算機(jī)系統(tǒng)早期發(fā)展階段形成的一些錯(cuò)誤概念和做法,應(yīng)該開發(fā)和使用更好的軟件工具。
總之,為了消除軟件危機(jī),既要有技術(shù)措施(方法和工具),又要有必要的組織管理措施。軟件工程正是從管理和技術(shù)兩方面研究如何更好地開發(fā)和維護(hù)計(jì)算機(jī)軟件的一門新興
學(xué)科。1.2.1軟件工程的基本概念
概括地說,軟件工程是指導(dǎo)計(jì)算機(jī)軟件開發(fā)和維護(hù)的工程學(xué)科。采用工程的概念、原理、技術(shù)和方法來開發(fā)與維護(hù)軟件,把經(jīng)過時(shí)間考驗(yàn)而證明正確的管理技術(shù)和方法與當(dāng)前能夠得到的最好的技術(shù)和方法相結(jié)合,經(jīng)濟(jì)地開發(fā)出高質(zhì)量的軟件并有效地維護(hù)它,這就是軟件工程。
下面我們給出軟件工程的基本原理,以期對(duì)軟件工程的概念有更深刻的理解。1.2軟件工程
(1)用分階段的生命周期計(jì)劃嚴(yán)格管理。
(2)堅(jiān)持進(jìn)行階段評(píng)審。
(3)實(shí)行嚴(yán)格的產(chǎn)品控制。
(4)采用現(xiàn)代程序設(shè)計(jì)技術(shù)。
(5)結(jié)果應(yīng)能清楚地審查。
(6)開發(fā)小組的人員應(yīng)該少而精。
(7)承認(rèn)不斷改進(jìn)軟件工程實(shí)踐的必要性。1.2.2軟件工程方法學(xué)
通常把在軟件生命周期全過程中使用的一整套技術(shù)的集合稱為軟件工程方法學(xué)。
軟件工程方法學(xué)包括三個(gè)要素:方法、工具和過程。其中,方法是完成軟件開發(fā)的各項(xiàng)任務(wù)的技術(shù)方法,回答“如何做”的問題;工具是為方法的運(yùn)用提供自動(dòng)的或半自動(dòng)的軟件支撐環(huán)境;過程是為了獲得高質(zhì)量的軟件所需要完成的一系列任務(wù)的框架,它規(guī)定了完成各項(xiàng)任務(wù)的工作步驟。
軟件工程方法學(xué)分為結(jié)構(gòu)化方法、Jackson方法、維也納方法(VDM)、面向?qū)ο蠓椒āD壳笆褂米顝V泛的軟件工程方法學(xué)是傳統(tǒng)方法學(xué)和面向?qū)ο蠓椒▽W(xué)。1.2.3軟件工程的目標(biāo)
軟件工程的目標(biāo)是提高軟件的質(zhì)量與生產(chǎn)率,最終實(shí)現(xiàn)軟件的工業(yè)化生產(chǎn)。質(zhì)量是軟件需求方最關(guān)心的問題。生產(chǎn)率是軟件供應(yīng)方最關(guān)心的問題,老板和員工都想用更少的時(shí)間掙更多的錢。質(zhì)量與生產(chǎn)率之間有著內(nèi)在的聯(lián)系,高生產(chǎn)率必須以質(zhì)量合格為前提。從短期效益看,追求高質(zhì)量會(huì)延長(zhǎng)軟件開發(fā)時(shí)間并且增大費(fèi)用,似乎降低了生產(chǎn)率。從長(zhǎng)期效益看,高質(zhì)量將保證軟件開發(fā)的全過程更加規(guī)范流暢,大大降低了軟件的維護(hù)代價(jià),提高了生產(chǎn)率,同時(shí)可獲得很好的信譽(yù)。質(zhì)量與生產(chǎn)率之間不存在根本的對(duì)立,好的軟件工程方法可以同時(shí)提高質(zhì)量與生產(chǎn)率。質(zhì)量與生產(chǎn)率的提高就是開發(fā)人員與項(xiàng)目經(jīng)理共同努力的結(jié)果。對(duì)開發(fā)人員而言,如果非得在質(zhì)量與生產(chǎn)率之間分個(gè)主次不可,那么應(yīng)該是質(zhì)量第一,生產(chǎn)率第二。這是因?yàn)椋?/p>
(1)質(zhì)量直接體現(xiàn)在軟件的每段程序中,高質(zhì)量自然是開發(fā)人員的技術(shù)追求,也是職業(yè)道德的要求。
(2)高質(zhì)量對(duì)所有的用戶都有價(jià)值,而高生產(chǎn)率只對(duì)開發(fā)方有意義。
(3)如果一開始就追求高生產(chǎn)率,則容易留下隱患。寧可進(jìn)度慢些,也要保證每個(gè)環(huán)節(jié)的質(zhì)量,以圖長(zhǎng)遠(yuǎn)利益。軟件的質(zhì)量因素很多,如正確性、性能、可靠性、容錯(cuò)性、易用性、靈活性、可擴(kuò)充性、可理解性、可維護(hù)性等。有些因素相互重疊,有些因素則相互抵觸,要提高質(zhì)量是非常不容易的。
軟件工程的主要環(huán)節(jié)有人員管理、項(xiàng)目管理,其中包括可行性與需求分析、系統(tǒng)設(shè)計(jì)、程序設(shè)計(jì)、測(cè)試、維護(hù)等,如圖1.3所示。圖1.3軟件工程的主要環(huán)節(jié)1.3軟件生存周期1.3.1生存周期的劃分及各階段的主要任務(wù)概括地說,軟件生存周期由軟件定義、軟件開發(fā)和運(yùn)行維護(hù)三個(gè)時(shí)期組成,每個(gè)時(shí)期又可進(jìn)一步劃分成若干個(gè)階段。下面簡(jiǎn)要介紹上述各個(gè)階段應(yīng)該完成的基本任務(wù)。
(1)問題定義:?jiǎn)栴}定義階段必須回答的關(guān)鍵問題是“要解決的問題是什么”。
(2)可行性研究:這個(gè)階段要回答的關(guān)鍵問題是“上一個(gè)階段所確定的問題是否有行得通的解決辦法”。
(3)需求分析:這個(gè)階段的任務(wù)仍然不是具體地解決客戶的問題,而是準(zhǔn)確地回答“目標(biāo)系統(tǒng)必須做什么”這個(gè)問題。這個(gè)階段的另外一項(xiàng)重要任務(wù)是用正式文檔準(zhǔn)確地記錄對(duì)目標(biāo)系統(tǒng)的需求,這份文檔通常稱為需求說明(specification)。
(4)概要設(shè)計(jì):這個(gè)階段的基本任務(wù)是概括地回答“怎樣實(shí)現(xiàn)目標(biāo)系統(tǒng)”這個(gè)問題。概要設(shè)計(jì)又稱為初步設(shè)計(jì)、邏輯設(shè)計(jì)、高層設(shè)計(jì)或總體設(shè)計(jì)。首先,應(yīng)該設(shè)計(jì)出實(shí)現(xiàn)目標(biāo)系統(tǒng)的幾種可能的方案。概要設(shè)計(jì)的另一項(xiàng)主要任務(wù)就是設(shè)計(jì)程序的體系結(jié)構(gòu),也就是確定程序由哪些模塊組成以及模塊間的關(guān)系。
(5)詳細(xì)設(shè)計(jì):概要設(shè)計(jì)階段以抽象概括的方式提出了解決問題的辦法。詳細(xì)設(shè)計(jì)階段的任務(wù)就是把解法具體化,也就是回答“應(yīng)該怎樣具體地實(shí)現(xiàn)這個(gè)系統(tǒng)”這個(gè)關(guān)鍵問題。這個(gè)階段的任務(wù)還不是編寫程序,而是設(shè)計(jì)出程序的詳細(xì)規(guī)格說明。
(6)編碼:這個(gè)階段的關(guān)鍵任務(wù)是寫出正確的容易理解、容易維護(hù)的程序模塊。
(7)測(cè)試:這個(gè)階段的關(guān)鍵任務(wù)是通過各種類型的測(cè)試(及相應(yīng)的調(diào)試)使軟件達(dá)到預(yù)定的要求。
(8)軟件維護(hù):維護(hù)階段的關(guān)鍵任務(wù)是,通過各種必要的維護(hù)活動(dòng)使系統(tǒng)持久地滿足用戶的需要。通常有四類維護(hù)活動(dòng):改正性維護(hù),也就是診斷和改正在使用過程中發(fā)現(xiàn)的軟件錯(cuò)誤;適應(yīng)性維護(hù),即修改軟件以適應(yīng)環(huán)境的變化;完善性維護(hù),即根據(jù)用戶的要求改進(jìn)或擴(kuò)充軟件,使它更完善;預(yù)防性維護(hù),即修改軟件,為將來的維護(hù)活動(dòng)做準(zhǔn)備。
在實(shí)際從事軟件開發(fā)工作時(shí),軟件規(guī)模、種類、開發(fā)環(huán)境及開發(fā)時(shí)使用的技術(shù)方法等因素會(huì)影響階段的劃分。
生命周期模型規(guī)定了把生命周期劃分成哪些階段及各個(gè)階段的執(zhí)行順序,因此,也稱為過程模型。1.3.2軟件生存周期模型
軟件開發(fā)方法是指在規(guī)定的投資規(guī)模和時(shí)間限制內(nèi),為實(shí)現(xiàn)符合用戶需求的高質(zhì)量軟件所制定的開發(fā)策略。人們提出了多種軟件開發(fā)策略,常見的軟件設(shè)計(jì)模型有瀑布模型(WaterfallModel)、增量模型(也叫漸進(jìn)模型)(IncreamentalModel)、快速原型模型(RapidPrototypeModel)、演化模型(EvolutionaryModel)、螺旋模型(SpiralModel)、噴泉模型(FountainModel)、智能模型(IntelligentModel)等。這里介紹其中主要的幾種模型。
1.瀑布模型
瀑布模型于1970年由W.Royce提出,其開發(fā)過程依照固定順序進(jìn)行,各階段的任務(wù)與工作結(jié)果如圖1.4所示。該模型嚴(yán)格規(guī)定各階段的任務(wù),上一階段任務(wù)的輸出作為下一階段工作的輸入。此模型適合于用戶需求明確、開發(fā)技術(shù)比較成熟、工程管理嚴(yán)格的場(chǎng)合使用。其缺點(diǎn)是,由于任務(wù)順序固定,軟件研制周期長(zhǎng),前一階段工作中造成的差錯(cuò)越到后期越大,而且糾正前期錯(cuò)誤的代價(jià)高。
在20世紀(jì)80年代之前,瀑布模型一直是唯一被廣泛采用的生命周期模型,現(xiàn)在它仍是軟件工程中應(yīng)用最廣泛的過程模型。圖1.4傳統(tǒng)的瀑布模型按照傳統(tǒng)的瀑布模型來開發(fā)軟件,有如下幾個(gè)特點(diǎn):
(1)階段間具有順序性和依賴性。
(2)推遲實(shí)現(xiàn)的觀點(diǎn):清楚地區(qū)分邏輯設(shè)計(jì)與物理設(shè)計(jì),盡可能推遲程序的物理實(shí)現(xiàn),是按照瀑布模型開發(fā)軟件的一條重要的指導(dǎo)思想。
(3)質(zhì)量保證的觀點(diǎn):每個(gè)階段都必須完成規(guī)定的文檔,沒有交出合格的文檔就是沒有完成該階段的任務(wù);每個(gè)階段結(jié)束前都要對(duì)本階段所完成的文檔進(jìn)行評(píng)審,以便盡早發(fā)現(xiàn)問題,改正錯(cuò)誤。
瀑布模型的開發(fā)過程如表1.2所示。實(shí)際的瀑布模型是帶“反饋環(huán)”的,如圖1.5所示(圖中實(shí)線箭頭表示開發(fā)過程,虛線箭頭表示維護(hù)過程)。當(dāng)在后面階段發(fā)現(xiàn)前面階段的錯(cuò)誤時(shí),需要沿圖中左側(cè)的反饋線返回前面的階段,在修正前面階段的錯(cuò)誤之后,再回來繼續(xù)完成后面階段的任務(wù)。圖1.5實(shí)際的瀑布模型下面我們對(duì)瀑布模型的優(yōu)缺點(diǎn)作一總結(jié)。
瀑布模型具有順序性和依賴性,即后一階段的工作必須在前一階段的工作完成后才能開始。把邏輯設(shè)計(jì)與物理設(shè)計(jì)清楚地劃分開,是瀑布模型的重要指導(dǎo)思想。瀑布模型強(qiáng)調(diào)的是優(yōu)質(zhì),即每一步都循序漸進(jìn),及早消除隱患,從而保證軟件質(zhì)量。它的致命缺點(diǎn)在于只有做出精確的需求分析,才能取得預(yù)期的結(jié)果。由于各種客觀、主觀的原因,需求分析往往不很精確,常常給日后的開發(fā)帶來隱患。
2.快速原型模型
原型是指模擬某種產(chǎn)品的原始模型,在其它產(chǎn)業(yè)中經(jīng)常使用模型。例如,在建造一座樓房之前,先按一定的比例建造一個(gè)縮小的樓房模型,通過模型的外觀、形狀和顏色等可以對(duì)所要建造的樓房有一個(gè)直觀的理解和認(rèn)識(shí)。
軟件開發(fā)中的原型不同于最終的系統(tǒng),兩者在功能范圍上的區(qū)別在于最終系統(tǒng)要實(shí)現(xiàn)軟件需求的全部功能,而原型只實(shí)現(xiàn)所選擇的部分功能。最終系統(tǒng)對(duì)所有的軟件需求都必須詳細(xì)實(shí)現(xiàn),而原型僅僅是為了試驗(yàn)和演示用的,部分功能需求可以忽略或者模擬實(shí)現(xiàn)??焖僭湍P偷谋硎救鐖D1.6所示。圖1.6(a)是原型本身的表示,圖1.6(b)說明了原型的開發(fā)步驟??梢钥闯?,采用快速原型模型開發(fā)軟件經(jīng)歷了快速分析、構(gòu)造原型、運(yùn)行原型、評(píng)價(jià)原型、根據(jù)評(píng)價(jià)的結(jié)果進(jìn)行修改這樣一個(gè)過程。圖1.6快速原型模型采用快速原型模型開發(fā)軟件時(shí),在開發(fā)的整體上仍然采用瀑布模型。按照引入原型的階段不同,快速原型分為以下三種類型:
(1)探索型:在需求分析階段引入原型,即用原型過程代替需求分析。把原型作為需求說明的補(bǔ)充形式,運(yùn)用原型盡可能使需求說明完整、準(zhǔn)確、一致、無二義性。
(2)實(shí)驗(yàn)型:用原型過程代替設(shè)計(jì)階段,即在總體設(shè)計(jì)階段使用原型。快速分析實(shí)現(xiàn)軟件系統(tǒng)的方案,并構(gòu)造出原型,然后通過運(yùn)行考察設(shè)計(jì)方案的可行性與合理性。
(3)演化型:用原型過程代替軟件開發(fā)的全部階段,通過原型過程的反復(fù)循環(huán)演化,直至得到軟件系統(tǒng)。在開發(fā)過程中并不強(qiáng)調(diào)嚴(yán)格的階段性和高質(zhì)量的階段性文檔,不追求理想的開發(fā)模型。
3.增量模型
增量模型也稱為漸增模型,如圖1.7所示。使用增量模型開發(fā)軟件時(shí),把軟件產(chǎn)品作為一系列的增量構(gòu)件來設(shè)計(jì)、編碼、集成和測(cè)試。每個(gè)構(gòu)件由多個(gè)相互作用的模塊構(gòu)成,并且能夠完成特定的功能。使用增量模型時(shí),第一個(gè)增量構(gòu)件往往實(shí)現(xiàn)軟件的基本需求,提供最核心的功能。圖1.7增量模型增量模型在各個(gè)階段并不交付一個(gè)可運(yùn)行的完整產(chǎn)品,而是交付滿足客戶需求的可運(yùn)行產(chǎn)品的一個(gè)子集。整個(gè)產(chǎn)品被分解成若干個(gè)構(gòu)件,開發(fā)人員逐個(gè)構(gòu)件地交付產(chǎn)品。這樣做的好處是軟件開發(fā)可以較好地適應(yīng)變化,客戶可以不斷地看到所開發(fā)的軟件,從而降低開發(fā)風(fēng)險(xiǎn)。但是,增量模型也存在以下缺陷:
(1)由于各個(gè)構(gòu)件是逐漸并入已有的軟件體系結(jié)構(gòu)中的,所以加入的構(gòu)件不應(yīng)當(dāng)破壞已構(gòu)造好的系統(tǒng)部分,這需要軟件具備開放式的體系結(jié)構(gòu)。
(2)在開發(fā)過程中,需求的變化是不可避免的。增量模型的靈活性可以使其適應(yīng)這種變化,這一點(diǎn)大大優(yōu)于瀑布模型和快速原型模型,但也很容易退化為“邊做邊改”的模型,從而使軟件過程的控制失去整體性。
4.螺旋模型
軟件開發(fā)幾乎總要冒一定的風(fēng)險(xiǎn),因此,在軟件開發(fā)過程中必須及時(shí)識(shí)別和分析風(fēng)險(xiǎn),并且采取適當(dāng)措施以消除或減少風(fēng)險(xiǎn)的危害。1988年,BarryBoehm正式發(fā)表了軟件系統(tǒng)開發(fā)的螺旋模型。
螺旋模型的基本思想是將瀑布模型和快速原型模型結(jié)合起來,強(qiáng)調(diào)了其他模型所忽視的風(fēng)險(xiǎn)分析,以盡量降低風(fēng)險(xiǎn),其特別適合于大型復(fù)雜的系統(tǒng)。
5.噴泉模型(面向?qū)ο蟮纳嫫谀P?OO模型)
迭代是軟件開發(fā)過程中普遍存在的一種內(nèi)在屬性。經(jīng)驗(yàn)表明,軟件過程是各個(gè)階段之間的迭代或一個(gè)階段內(nèi)各個(gè)工作步驟之間的迭代。噴泉模型是一種以用戶需求為動(dòng)力,以對(duì)象作為驅(qū)動(dòng)的模型,這種模型在面向?qū)ο蠓缎椭斜仍诮Y(jié)構(gòu)化范型中更常見。圖1.8所示的噴泉模型是典型的面向?qū)ο笊芷谀P汀!皣娙边@個(gè)詞體現(xiàn)了面向?qū)ο筌浖_發(fā)過程中迭代和無縫的特性。圖1.8噴泉模型
噴泉模型的固有特征是:①迭代,指多次重復(fù)、演進(jìn)的過程;②無間隙,指各階段間無明顯的界限,支持分析和設(shè)計(jì)結(jié)果的自然復(fù)用。圖1.8噴泉模型噴泉模型與傳統(tǒng)的結(jié)構(gòu)化生存期比較,具有更多的增量和迭代性質(zhì),生存期的各個(gè)階段可以相互重疊和多次反復(fù),而且在項(xiàng)目的整個(gè)生存期中還可以嵌入子生存期,就像水噴上去又可以落下來,可以落在中間,也可以落在最底部。為避免在使用噴泉模型開發(fā)軟件時(shí)開發(fā)過程過分無序,應(yīng)該把一個(gè)線性過程(例如,快速原型模型)作為總目標(biāo)。但是,同時(shí)也應(yīng)該記住,面向?qū)ο蠓缎捅旧硪蠼?jīng)常對(duì)開發(fā)活動(dòng)進(jìn)行迭代或求精。
6.各種模型的比較
每個(gè)軟件開發(fā)組織應(yīng)該選擇適合于該組織的軟件開發(fā)模型,并且應(yīng)該隨著當(dāng)前正在開發(fā)的特定產(chǎn)品的特性而變化,以減小所選模型的缺點(diǎn),充分利用其優(yōu)點(diǎn)。表1.3列出了幾種常見模型的優(yōu)缺點(diǎn)。軟件過程是為了獲得高質(zhì)量軟件產(chǎn)品所需要完成的一系列任務(wù)的框架,它規(guī)定了完成各項(xiàng)任務(wù)的工作步驟。軟件過程必須科學(xué)、合理,才能開發(fā)出高質(zhì)量的軟件產(chǎn)品。
按照在軟件生命周期全過程中應(yīng)完成的任務(wù)的性質(zhì),在概念上可以把軟件生命周期劃分成問題定義、可行性研究、需求分析、概要設(shè)計(jì)、詳細(xì)設(shè)計(jì)、編碼和單元測(cè)試、綜合測(cè)試以及維護(hù)等八個(gè)階段。實(shí)際上,從事軟件開發(fā)工作時(shí),軟件規(guī)模、種類、開發(fā)環(huán)境及使用的技術(shù)方法等因素,都影響階段的劃分。因此,一個(gè)科學(xué)、有效的軟件過程應(yīng)該定義一組適合于所承擔(dān)的項(xiàng)目特點(diǎn)的任務(wù)集合。生命周期模型(即軟件過程模型)規(guī)定了把生命周期劃分成的階段及各個(gè)階段的執(zhí)行順序。本章介紹了五類典型的軟件生命周期模型。
瀑布模型歷史悠久、廣為人知,它的優(yōu)勢(shì)在于它是規(guī)范的、文檔驅(qū)動(dòng)的方法;這種模型的問題是,最終交付的產(chǎn)品可能不是用戶真正需要的。
快速原型模型正是為了克服瀑布模型的缺點(diǎn)而提出來的。它通過快速構(gòu)建起一個(gè)可運(yùn)行的原型系統(tǒng),讓用戶試用原型并收集用戶反饋意見的辦法,來獲取用戶的真實(shí)需求。但是,需要軟件法開發(fā)技術(shù)和工具支持,需要用戶參與開發(fā)過程,參與原型的運(yùn)行和評(píng)價(jià)。
增量模型具有能在軟件開發(fā)的早期使投資獲得明顯回報(bào)和易于維護(hù)的優(yōu)點(diǎn)。但是,要求軟件具有開放結(jié)構(gòu)是使用這種模型時(shí)固有的困難。
風(fēng)險(xiǎn)驅(qū)動(dòng)的螺旋模型適用于大規(guī)模的內(nèi)部開發(fā)項(xiàng)目。但是,只有在開發(fā)人員具有風(fēng)險(xiǎn)分析和排除風(fēng)險(xiǎn)的經(jīng)驗(yàn)及專門知識(shí)時(shí),使用這種模型才會(huì)獲得成功。
當(dāng)使用面向?qū)ο蠓缎烷_發(fā)軟件時(shí),軟件生命周期必須是循環(huán)的,也就是說,軟件過程必須支持反饋和迭代。噴泉模型是一種典型的適合于面向?qū)ο蠓缎偷倪^程模型。
每個(gè)軟件開發(fā)組織都應(yīng)該選擇適合于本組織及所要開發(fā)的軟件特點(diǎn)的軟件生命周期模型。這樣的模型應(yīng)該把各種生命周期模型的合適特性有機(jī)地結(jié)合起來,以便盡量減少它們的缺點(diǎn),充分利用它們的優(yōu)點(diǎn)。1.4.1系統(tǒng)分析與定義
為了開發(fā)出真正滿足用戶需求的軟件產(chǎn)品,首先必須知道用戶的需求。對(duì)軟件需求的深入理解是軟件開發(fā)工作獲得成功的前提和關(guān)鍵。不論我們把設(shè)計(jì)和編碼工作做得如何出色,不能真正滿足用戶需求的軟件只會(huì)給用戶帶來失望,給開發(fā)者帶來煩惱。
傳統(tǒng)的軟件工程方法學(xué)采用結(jié)構(gòu)化分析(StructuredAnalysis,SA)技術(shù)來完成需求分析工作。1.4結(jié)構(gòu)化的軟件開發(fā)方法
1.需求分析的任務(wù)
需求分析是發(fā)現(xiàn)、求精、建模、規(guī)格說明和復(fù)審的過程。為了發(fā)現(xiàn)用戶的真正需求,首先應(yīng)該從宏觀角度調(diào)查、分析用戶所面臨的問題,也就是說,需求分析的第一步是盡可能準(zhǔn)確地了解用戶當(dāng)前的情況和需要解決的問題。
分析員對(duì)用戶提出的初步要求應(yīng)該反復(fù)求精、多次細(xì)化,才能充分理解用戶的需求,得出對(duì)目標(biāo)系統(tǒng)的完整、準(zhǔn)確和具體的要求。為了更好地理解問題,人們常常采用建立模型的方法。所謂模型,就是為了理解事物而對(duì)事物做出的一種抽象,是對(duì)事物的一種無歧義的書面描述。通常,模型由一組圖形符號(hào)和組織這些符號(hào)的規(guī)則構(gòu)成。結(jié)構(gòu)化分析就是一種建立模型的活動(dòng),通常建立數(shù)據(jù)模型、功能模型和行為模型等三種模型。
除了用分析模型表示軟件需求之外,還要寫出準(zhǔn)確的軟件需求規(guī)格說明。模型既是軟件設(shè)計(jì)的基礎(chǔ),也是編寫軟件規(guī)格說明的基礎(chǔ)。
在分析軟件需求和編寫軟件規(guī)格說明的過程中,軟件開發(fā)者和軟件用戶都起著關(guān)鍵的、必不可少的作用。用戶與開發(fā)者之間需要通信、溝通的內(nèi)容非常多,在雙方交流信息的過程中很容易出現(xiàn)誤解或遺漏,也可能存在二義性。因此,不僅在整個(gè)需求分析過程中應(yīng)該采用行之有效的通信技術(shù),集中精力縝密工作,而且對(duì)需求分析的結(jié)果(分析模型和規(guī)格說明)必須嚴(yán)格審查。
盡管目前存在許多不同的結(jié)構(gòu)化分析方法,但是,所有這些分析方法都遵守下述準(zhǔn)則:
●必須理解和表示問題的信息域,根據(jù)這條準(zhǔn)則應(yīng)該建立數(shù)據(jù)模型。
●必須定義軟件應(yīng)完成的功能,這條準(zhǔn)則要求建立功能模型。
●必須表示作為外部事件結(jié)果的軟件行為,這條準(zhǔn)則要求建立行為模型。
●必須對(duì)描述信息、功能和行為的模型進(jìn)行分解,用層次的方式展示細(xì)節(jié)。
●分析過程應(yīng)該從要素信息移向?qū)崿F(xiàn)細(xì)節(jié)。
2.需求分析的方法
軟件需求分析是與用戶通信的過程,總是從兩方或多方之間的通信開始的。用戶面臨的問題需要用基于計(jì)算機(jī)的方案來解決;開發(fā)者應(yīng)該對(duì)用戶的需求作出反應(yīng),給用戶提供幫助,這樣就產(chǎn)生了相互通信的需求。
1)訪談
訪談(或稱為會(huì)談)是最早開始運(yùn)用的獲取用戶需求的技術(shù),也是迄今為止仍然廣泛使用的主要的需求分析技術(shù)。訪談?dòng)袃煞N基本形式,分別是正式的和非正式的訪談。在正式的訪談中,系統(tǒng)分析員將提出一些事先準(zhǔn)備好的具體問題,例如,詢問客戶公司銷售的商品種類、雇用的銷售人員數(shù)目以及信息反饋時(shí)間的長(zhǎng)短等。在非正式的訪談中,將提出一些可以自由回答的開放性問題,以鼓勵(lì)被訪問的人員表達(dá)自己的想法,例如,詢問用戶為什么對(duì)目前正在使用的系統(tǒng)感到不滿意。當(dāng)需要調(diào)查大量人員的意見時(shí),向被調(diào)查的人員分發(fā)調(diào)查表是一個(gè)十分有效的做法。
在對(duì)用戶進(jìn)行訪談的過程中,使用情景分析技術(shù)往往非常有效。所謂情景分析,就是對(duì)用戶運(yùn)用目標(biāo)系統(tǒng)解決某個(gè)具體問題的方法和結(jié)果進(jìn)行分析。
2)簡(jiǎn)易的應(yīng)用規(guī)格說明技術(shù)
這種方法提倡用戶與開發(fā)者密切合作,共同標(biāo)識(shí)問題,提出解決方案的要素,商討不同的方法并指定基本的需求。現(xiàn)在,簡(jiǎn)易的應(yīng)用規(guī)格說明技術(shù)已經(jīng)成為信息系統(tǒng)界使用的主流技術(shù)。盡管存在許多不同的簡(jiǎn)易應(yīng)用規(guī)格說明方法,但是它們遵循的基本準(zhǔn)則是相同的。
●在中立地點(diǎn)舉行由開發(fā)者和用戶雙方出席的會(huì)議。
●制定準(zhǔn)備會(huì)議和參加會(huì)議的規(guī)則。●提出一個(gè)議事日程,這個(gè)日程應(yīng)該足夠正式,以便能夠涵蓋所有要點(diǎn);同時(shí),這個(gè)日程又應(yīng)該足夠非正式,以便鼓勵(lì)自由思維。
●由一個(gè)“協(xié)調(diào)人”來主持會(huì)議,他既可以是用戶,也可以是開發(fā)者,還可以是從外面請(qǐng)來的人。
●使用一種“定義機(jī)制”(例如,工作表、圖表等)。
●目標(biāo)是標(biāo)識(shí)問題、提出解決方案的要素,商討不同的方案并制定初步的需求。
3)構(gòu)建軟件原型
構(gòu)建原型的要點(diǎn)是,應(yīng)該實(shí)現(xiàn)用戶看得見的功能(例如屏幕顯示或打印報(bào)表),省略目標(biāo)系統(tǒng)的“隱含”功能(例如修改文件)。
快速原型應(yīng)該具備的第一個(gè)特性是“快速”??焖僭偷哪康氖潜M快向用戶提供一個(gè)可在計(jì)算機(jī)上運(yùn)行的目標(biāo)系統(tǒng)的模型,以便使用戶和開發(fā)者在目標(biāo)系統(tǒng)應(yīng)該“做什么”這個(gè)問題上盡可能快地達(dá)成共識(shí)。快速原型應(yīng)該具備的第二個(gè)特性是“容易修改”。如果原型的第一版不是用戶所需要的,就必須根據(jù)用戶的意見迅速地修改它,構(gòu)建出原型的第二版,以更好地滿足用戶的需求。在實(shí)際開發(fā)軟件產(chǎn)品時(shí),“修改—試用—反饋”的過程可能要重復(fù)多遍,如果修改耗時(shí)過多,則勢(shì)必延誤軟件開發(fā)時(shí)間。
3.分析建模和軟件需求規(guī)格說明
結(jié)構(gòu)化分析實(shí)質(zhì)上是一種創(chuàng)建模型的活動(dòng)。通過需求分析而建立的模型必須達(dá)到下述三個(gè)基本目標(biāo):描述用戶的需求;為軟件設(shè)計(jì)工作奠定基礎(chǔ);定義一組需求,一旦開發(fā)出軟件產(chǎn)品之后,就可以用這組需求作為標(biāo)準(zhǔn)來驗(yàn)收該產(chǎn)品。為了達(dá)到上述目標(biāo),在結(jié)構(gòu)化分析過程中導(dǎo)出的分析模型的形式如圖1.9所示。
通過需求分析除了創(chuàng)建分析模型之外,還應(yīng)該寫出軟件需求規(guī)格說明,它是分析階段的最終成果。圖1.9分析模型的結(jié)構(gòu)
4.實(shí)體—關(guān)系圖
數(shù)據(jù)模型包含三種相互關(guān)聯(lián)的信息:數(shù)據(jù)對(duì)象、描述數(shù)據(jù)對(duì)象的屬性及數(shù)據(jù)對(duì)象彼此間相互連接的關(guān)系。
數(shù)據(jù)對(duì)象:是對(duì)軟件必須理解的復(fù)合信息的表示。所謂復(fù)合信息,是指具有一系列不同性質(zhì)或?qū)傩缘氖挛?,因此,僅有單個(gè)值的事物(例如寬度)不是數(shù)據(jù)對(duì)象。
屬性:定義了數(shù)據(jù)對(duì)象的性質(zhì),應(yīng)根據(jù)對(duì)所要解決的問題的理解,來確定特定數(shù)據(jù)對(duì)象的一組合適的屬性。關(guān)系:數(shù)據(jù)對(duì)象彼此之間相互連接的方式稱為關(guān)系,也稱為聯(lián)系。關(guān)系分為一對(duì)一聯(lián)系(1∶1),一對(duì)多聯(lián)系(1∶N),多對(duì)多聯(lián)系(M∶N)。其中多對(duì)多聯(lián)系也具有屬性。
用實(shí)體—關(guān)系圖(EntityRelationshipDiagram)建立的數(shù)據(jù)模型簡(jiǎn)稱為E-R圖。相應(yīng)地,用E-R圖描繪的數(shù)據(jù)模型也可以稱為E-R模型。
E-R圖中包含了實(shí)體(即數(shù)據(jù)對(duì)象)、關(guān)系和屬性等三種基本成分。通常用矩形框代表實(shí)體,用連接相關(guān)實(shí)體的菱形框表示關(guān)系,用橢圓形或圓角矩形表示實(shí)體(或關(guān)系)的屬性,并用無向邊把實(shí)體(或關(guān)系)與其屬性連接起來。例如,圖1.10是某學(xué)校教學(xué)管理的E-R圖。圖1.10某學(xué)校教學(xué)管理的E-R圖
5.?dāng)?shù)據(jù)流圖
當(dāng)數(shù)據(jù)在軟件中移動(dòng)時(shí),它將被一系列“變換”所修改。數(shù)據(jù)流圖(DFD)是一種圖形化技術(shù),它描繪信息流和數(shù)據(jù)從輸入移動(dòng)到輸出的過程中所經(jīng)受的變換。
如圖1.11所示,數(shù)據(jù)流圖有四種基本符號(hào):正方形(或立方體)表示數(shù)據(jù)的源點(diǎn)或終點(diǎn),是系統(tǒng)之外的人員或組織;圓形(或圓角矩形)代表變換數(shù)據(jù)的處理;兩條平行橫線(或矩形)代表數(shù)據(jù)存儲(chǔ);箭頭表示數(shù)據(jù)流,即特定數(shù)據(jù)的流動(dòng)方向。源點(diǎn)/終點(diǎn)與處理、處理與處理之間的數(shù)據(jù)流應(yīng)當(dāng)具有名稱,與數(shù)據(jù)存儲(chǔ)有關(guān)的數(shù)據(jù)流的名稱可以省略,因?yàn)橛脭?shù)據(jù)存儲(chǔ)的名稱就可以清楚表示了。圖1.11數(shù)據(jù)流圖的基本符號(hào)下面通過一個(gè)簡(jiǎn)單例子來具體說明怎樣畫數(shù)據(jù)流圖。
【例1.1】假設(shè)一家工廠的采購(gòu)部每天需要一張訂貨報(bào)表,報(bào)表按零件編號(hào)排序,表中列出所有需要再次訂貨的零件。對(duì)于每個(gè)需要再次訂貨的零件,應(yīng)該列出下述數(shù)據(jù):零件編號(hào)、零件名稱、定貨數(shù)量、目前價(jià)格、主要供應(yīng)者和次要供應(yīng)者。零件入庫(kù)或出庫(kù)稱為事務(wù),通過放在倉(cāng)庫(kù)中的CRT終端把事務(wù)報(bào)告給訂貨系統(tǒng)。當(dāng)某種零件的庫(kù)存數(shù)量少于庫(kù)存量臨界值時(shí),就應(yīng)該再次訂貨。
數(shù)據(jù)流圖有四種成分:源點(diǎn)或終點(diǎn)、處理、數(shù)據(jù)存儲(chǔ)和數(shù)據(jù)流。因此,可采用以下步驟畫出訂貨系統(tǒng)的數(shù)據(jù)流圖。首先要從問題描述中提取數(shù)據(jù)流圖的四種成分,接下來考慮數(shù)據(jù)的處理與加工,最后考慮數(shù)據(jù)存儲(chǔ)和數(shù)據(jù)流。一旦把數(shù)據(jù)流圖的四種成分都分離出來以后,就可以著手畫數(shù)據(jù)流圖了。任何系統(tǒng)的基本模型都是由若干個(gè)數(shù)據(jù)源點(diǎn)/終點(diǎn)以及一個(gè)處理組成的,這個(gè)處理就代表了系統(tǒng)對(duì)數(shù)據(jù)加工變換的基本功能。對(duì)于上述的訂貨系統(tǒng)可以畫出如圖1.12所示的頂層數(shù)據(jù)流圖來表示基本系統(tǒng)模型,在頂層和數(shù)據(jù)流圖中突出表明了數(shù)據(jù)的源點(diǎn)、終點(diǎn)和系統(tǒng)的輸入、輸出。圖1.12訂貨系統(tǒng)的基本系統(tǒng)模型——頂層數(shù)據(jù)流圖下一步應(yīng)該把基本系統(tǒng)模型細(xì)化,得到描繪系統(tǒng)的主要功能的0層數(shù)據(jù)流圖。圖1.13是系統(tǒng)的0層數(shù)據(jù)流圖,系統(tǒng)中含有處理事務(wù)和產(chǎn)生報(bào)表兩個(gè)子系統(tǒng),所給出的處理和數(shù)據(jù)存儲(chǔ)都加了編號(hào),這樣做的目的是便于引用和追蹤。
接下來應(yīng)該對(duì)功能級(jí)數(shù)據(jù)流圖中描繪的系統(tǒng)主要功能進(jìn)一步細(xì)化,對(duì)0層數(shù)據(jù)流圖中的每個(gè)子系統(tǒng)進(jìn)一步分解,得到1層數(shù)據(jù)流圖。圖1.14是將事務(wù)處理子系統(tǒng)進(jìn)一步分解的訂貨系統(tǒng)的1層數(shù)據(jù)流圖。圖1.13訂貨系統(tǒng)的功能級(jí)數(shù)據(jù)流圖——0層數(shù)據(jù)流圖圖1.14將事務(wù)處理子系統(tǒng)進(jìn)一步細(xì)化的數(shù)據(jù)流圖——1層數(shù)據(jù)流圖在對(duì)數(shù)據(jù)流圖分層細(xì)化時(shí),必須保持信息的連續(xù)性,也就是說,當(dāng)把一個(gè)處理分解為一系列處理時(shí),分解前和分解后的輸入/輸出數(shù)據(jù)流必須相同。
數(shù)據(jù)流圖中每個(gè)成分的命名是否恰當(dāng),直接影響數(shù)據(jù)流圖的可理解性,因此,給這些成分起名字時(shí)應(yīng)該仔細(xì)推敲。命名時(shí)應(yīng)注意以下問題:為數(shù)據(jù)流(或數(shù)據(jù)存儲(chǔ))命名時(shí),名字應(yīng)代表整個(gè)數(shù)據(jù)流(或數(shù)據(jù)存儲(chǔ))的內(nèi)容,而不是僅僅反映它的某些成分;不要使用空洞的、缺乏具體含義的名字(如“數(shù)據(jù)”、“信息”、“輸入”之類);如果在為某個(gè)數(shù)據(jù)流(或數(shù)據(jù)存儲(chǔ))起名字時(shí)遇到了困難,則很可能是對(duì)數(shù)據(jù)流圖分解不恰當(dāng)而造成的,應(yīng)該試試重新分解,看是否能克服這個(gè)困難。通常先為數(shù)據(jù)流命名,然后為與之相關(guān)聯(lián)的處理命名,這樣命名比較容易,而且體現(xiàn)了人們習(xí)慣的“由表及里”的思考過程。名字應(yīng)該反映整個(gè)處理的功能,而不是它的一部分功能;名字最好由一個(gè)具體的及物動(dòng)詞,加上一個(gè)具體的賓語(yǔ)組成;應(yīng)該盡量避免使用“加工”、“處理”等空洞籠統(tǒng)的動(dòng)詞作名字;通常名字中僅包括一個(gè)動(dòng)詞,如果必須用兩個(gè)動(dòng)詞才能描述整個(gè)處理的功能,則把這個(gè)處理再分解成兩個(gè)處理可能更恰當(dāng)些;如果在為某個(gè)處理命名時(shí)遇到了困難,則很可能是發(fā)現(xiàn)了分解不當(dāng)?shù)嫩E象,應(yīng)考慮重新分解。
6.?dāng)?shù)據(jù)字典
數(shù)據(jù)字典是為了描述在結(jié)構(gòu)化分析過程中定義的對(duì)象的內(nèi)容,而使用的一種半形式化的工具。
數(shù)據(jù)字典中的每個(gè)條目是對(duì)數(shù)據(jù)流圖中所出現(xiàn)的每個(gè)成分的精確、嚴(yán)格的定義,從而使得用戶和系統(tǒng)分析員雙方對(duì)構(gòu)成輸入、輸出、數(shù)據(jù)存儲(chǔ)的數(shù)據(jù)項(xiàng),以及加工處理邏輯有共同的理解。雖然可以使用自然語(yǔ)言描述數(shù)據(jù)流和數(shù)據(jù)存儲(chǔ)的條目,但是為了更加清晰簡(jiǎn)潔起見,建議采用下列符號(hào):
=?——等價(jià)于(或定義為)。
+?——和(即連接兩個(gè)分量)。例如:X=a+b,表示X由數(shù)據(jù)項(xiàng)a和b組成。
[…|…]——或(即從方括號(hào)內(nèi)列出的若干個(gè)分量中選擇一個(gè)),通常用“|”號(hào)分開供選擇的分量。例如:X=[a?|?b],表示X由數(shù)據(jù)項(xiàng)a或b組成。
{…}——重復(fù)(即重復(fù)花括號(hào)內(nèi)的分量),常常使用上限和下限進(jìn)一步注釋表示重復(fù)的花括號(hào)。一種注釋方法是在花括號(hào)的右邊用上角標(biāo)和下角標(biāo)分別表明重復(fù)的上限和下限;另一種注釋方法是在括號(hào)左側(cè)標(biāo)明重復(fù)的下限,在括號(hào)的右側(cè)標(biāo)明重復(fù)的上限。例如:X={a},表示X由若干個(gè)數(shù)據(jù)項(xiàng)a組成。X=或X=,表示X中最少出現(xiàn)2次a,最多出現(xiàn)5次a。5和2分別為重復(fù)次數(shù)的上、下界。
(…)——可選(即圓括號(hào)里的數(shù)據(jù)項(xiàng)可有可無)。例如:X=(a),表示數(shù)據(jù)項(xiàng)a可在X中出現(xiàn),也可不出現(xiàn)。
“…”——基本數(shù)據(jù)項(xiàng)。例如:X=“a”,表示X可取的數(shù)據(jù)項(xiàng)為字符a。
..——連接符。例如:X=1..9,表示X可取1到9中任意一個(gè)值。
(1)數(shù)據(jù)流條目的主要內(nèi)容舉例如下:
數(shù)據(jù)流名稱:訂貨報(bào)表
別名:無
簡(jiǎn)述:提供給采購(gòu)員的訂貨項(xiàng)目
來源:加工2“產(chǎn)生報(bào)表”
去向:外部實(shí)體“采購(gòu)員”
數(shù)據(jù)流量:100份/周
組成:編號(hào)+訂貨日期+銀行賬號(hào)+貨物名稱+規(guī)格+數(shù)量
其中,數(shù)據(jù)流量指單位時(shí)間內(nèi)(每小時(shí)、每天、每周、每月)的傳輸次數(shù)。
(2)數(shù)據(jù)存儲(chǔ)條目的主要內(nèi)容舉例如下:
數(shù)據(jù)存儲(chǔ)名稱:庫(kù)存清單
別名:無
簡(jiǎn)述:存放庫(kù)存所有可供貨物的信息
組成:編號(hào)+貨物名稱+規(guī)格+數(shù)量+單價(jià)
組織方式:索引文件,以貨物編號(hào)為關(guān)鍵字
查詢要求:按關(guān)鍵字查詢或模糊查詢
(3)數(shù)據(jù)項(xiàng)是不可再分解的數(shù)據(jù)單位,條目主要內(nèi)容舉例如下:
數(shù)據(jù)項(xiàng)名稱:貨物編號(hào)
別名:G-No,G-Num,Goods-No
簡(jiǎn)述:本公司所有貨物的編號(hào)
類型:字符串
長(zhǎng)度:10
取值范圍及含義:第1位:進(jìn)口/國(guó)產(chǎn)
第2~4位:類別
第5~7位:規(guī)格
第8~10位:品名編號(hào)
(4)加工條目主要描述基本加工的處理邏輯,其內(nèi)容舉例如下:
加工名稱:產(chǎn)生報(bào)表
編號(hào):2
激發(fā)條件:定時(shí)檢測(cè)訂貨信息
優(yōu)先級(jí):普通
輸入:訂貨信息
輸出:訂貨報(bào)表
加工邏輯:根據(jù)庫(kù)存清單加工邏輯主要描述該加工“做什么”,即實(shí)現(xiàn)加工的策略,而不是實(shí)現(xiàn)加工的細(xì)節(jié),只是描述如何將輸入數(shù)據(jù)流變換為輸出數(shù)據(jù)流的規(guī)則。為了使加工邏輯直觀,易于理解,可以采用上面所采用的結(jié)構(gòu)化形式語(yǔ)言,也可以采用判定表或判定樹。
7.結(jié)構(gòu)化語(yǔ)言
結(jié)構(gòu)化語(yǔ)言是介于自然語(yǔ)言和形式語(yǔ)言之間的一種半形式化語(yǔ)言。它是在自然語(yǔ)言的基礎(chǔ)上加了一些限定,使用有限的詞匯和有限的語(yǔ)句來描述加工邏輯,它的結(jié)構(gòu)可分為外層和內(nèi)層兩層。
(1)外層用來描述控制結(jié)構(gòu),采用順序、選擇、重復(fù)三種基本結(jié)構(gòu)。
①順序結(jié)構(gòu):是一組祈使語(yǔ)句、選擇語(yǔ)句、重復(fù)語(yǔ)句的順序排列。
②選擇結(jié)構(gòu):一般用IF-THEN-ELSE-ENDIF,CASE-OF-ENDCASE等關(guān)鍵字。
③重復(fù)結(jié)構(gòu):一般用DO-WHILE-ENDDO,REPEAT-UNTIL等關(guān)鍵字。
(2)內(nèi)層一般采用祈使語(yǔ)句,使用數(shù)據(jù)字典中的名詞和有限的自定義詞,啟動(dòng)詞含義要具體,盡量不用形容詞和復(fù)詞來修飾。還可以使用一些簡(jiǎn)單的算術(shù)運(yùn)算和邏輯運(yùn)算符號(hào)。
例如某工廠對(duì)部分職工重新分配工作的政策是:年齡在20歲以下者,初中文化程度脫產(chǎn)學(xué)習(xí),高中文化程度當(dāng)電工;年齡在20歲至40歲之間者,中學(xué)文化程度男性當(dāng)鉗工,女性當(dāng)車工,大學(xué)文化程度當(dāng)技術(shù)員;年齡在40歲以上者,中學(xué)文化程度當(dāng)材料員,大學(xué)文化程度當(dāng)技術(shù)員。
IF年齡<20THEN
IF文化程度=初中THEN脫產(chǎn)學(xué)習(xí)
ELSE工作為電工
ENDIF
ELSEIF年齡≤40THEN
IF文化程度=大學(xué)THEN工作為技術(shù)員
ELSEIF性別=男THEN工作為鉗工
ELSE工作為車工
ENDIF
ENDIF
ELSEIF文化程度=大學(xué)THEN工作為技術(shù)員
ELSE工作為材料員
ENDIF
ENDIF
ENDIF
8.判定表
在有些情況下,數(shù)據(jù)流圖中的每個(gè)加工的一組動(dòng)作依賴于多個(gè)邏輯條件的取值。用判定表能夠清晰、嚴(yán)謹(jǐn)?shù)乇硎緩?fù)雜的條件組合與應(yīng)做的動(dòng)作之間的對(duì)應(yīng)關(guān)系。
一張判定表由四部分組成,左上部列出所有條件,左下部是所有可能做的動(dòng)作,右上部是表示各種條件組合的一個(gè)矩陣,右下部是與每種條件組合相對(duì)應(yīng)的動(dòng)作。判定表右半部的每一列實(shí)質(zhì)上是一條規(guī)則,規(guī)定了與特定的條件組合相對(duì)應(yīng)的動(dòng)作。我們用判定表來描述上述例子。為了使判定表清晰,可以先給出條件取值表,如表1.4所示。在條件取值表的基礎(chǔ)上再給出判定表,如表1.5所示。
9.判定樹
判定樹是判定表的變形,一般情況下它比判定表更直觀,且易于理解和使用。
上述例子用判定樹描述如下:1.4.2系統(tǒng)設(shè)計(jì)
傳統(tǒng)的軟件工程方法學(xué)采用結(jié)構(gòu)化設(shè)計(jì)(StructuredDesign,SD)技術(shù),完成軟件設(shè)計(jì)工作,通常把軟件設(shè)計(jì)工作劃分為概要設(shè)計(jì)和詳細(xì)設(shè)計(jì)兩個(gè)階段。概要設(shè)計(jì)的主要任務(wù)是,通過仔細(xì)分析軟件規(guī)格說明,適當(dāng)?shù)貙?duì)軟件進(jìn)行功能分解,從而把軟件劃分為模塊,并且設(shè)計(jì)出完成預(yù)定功能的模塊結(jié)構(gòu)。詳細(xì)設(shè)計(jì)的主要任務(wù)是對(duì)每個(gè)模塊的內(nèi)部進(jìn)行設(shè)計(jì),確定完成每個(gè)模塊功能所需要的算法和數(shù)據(jù)結(jié)構(gòu)。
1.結(jié)構(gòu)化設(shè)計(jì)與結(jié)構(gòu)化分析的關(guān)系
軟件設(shè)計(jì)必須依據(jù)對(duì)軟件的需求來進(jìn)行,結(jié)構(gòu)化分析的結(jié)果為結(jié)構(gòu)化設(shè)計(jì)提供了最基本的輸入信息。
分析模型的每個(gè)元素都提供了創(chuàng)建設(shè)計(jì)模型時(shí)所需要的信息。圖1.15描繪了軟件設(shè)計(jì)過程中的信息流,由數(shù)據(jù)模型、功能模型和行為模型清楚地表示的軟件需求并傳送給軟件設(shè)計(jì)者,由他們使用適當(dāng)?shù)脑O(shè)計(jì)方法來完成數(shù)據(jù)設(shè)計(jì)、體系結(jié)構(gòu)設(shè)計(jì)、接口設(shè)計(jì)和過程設(shè)計(jì)。
在軟件設(shè)計(jì)期間做出的決策將最終決定軟件開發(fā)能否成功,更重要的是,這些設(shè)計(jì)決策將決定軟件維護(hù)的難易程度。圖1.15軟件設(shè)計(jì)過程中的信息流
2.軟件設(shè)計(jì)的概念和原理
軟件設(shè)計(jì)中最重要的一個(gè)問題就是軟件質(zhì)量問題。通過下面幾個(gè)概念和原理,有助于我們對(duì)衡量軟件質(zhì)量的標(biāo)準(zhǔn)有一個(gè)比較清楚的理解。
1)模塊化
模塊是由邊界元素限定的相鄰的程序元素(例如,數(shù)據(jù)說明,可執(zhí)行的語(yǔ)句)的序列,而且有一個(gè)總體標(biāo)識(shí)符來代表它。像Pascal語(yǔ)言中的Begin…end對(duì),或者C、C++和Java語(yǔ)言中的{…}對(duì),都是邊界元素的例子。因此,過程、函數(shù)、子程序和宏等都可作為模塊。面向?qū)ο蠓缎椭械膶?duì)象是模塊,對(duì)象內(nèi)的方法也是模塊。模塊是構(gòu)成程序的基本構(gòu)件。圖1.16展示出了軟件中模塊的數(shù)量與軟件成本之間的關(guān)系。圖1.16模塊的數(shù)量和軟件成本之間的關(guān)系模塊化就是把程序劃分成獨(dú)立命名且可獨(dú)立訪問的模塊,每個(gè)模塊完成一個(gè)子功能,把這些模塊集成起來構(gòu)成一個(gè)整體,可以完成整個(gè)系統(tǒng)的功能,從而滿足用戶的需求。
通常按照以下五條標(biāo)準(zhǔn)來評(píng)價(jià)軟件的結(jié)構(gòu)設(shè)計(jì):
(1)模塊可分解性:如果一種設(shè)計(jì)方法提供了把問題分解為子問題的系統(tǒng)化機(jī)制,那么,它就能降低整個(gè)問題的復(fù)雜性,從而可以實(shí)現(xiàn)一種有效的模塊化解決方案。
(2)模塊可組裝性:如果一種設(shè)計(jì)方法能把現(xiàn)有的(可重用的)設(shè)計(jì)構(gòu)件組裝成新系統(tǒng),那么,它就能提供一種并非一切都從頭開始做的模塊化解決方案。
(4)模塊連續(xù)性:如果對(duì)系統(tǒng)需求的微小修改只導(dǎo)致對(duì)個(gè)別模塊而不是對(duì)整個(gè)系統(tǒng)的修改,那么,修改所引起的副作用將最小。
(5)模塊保護(hù)性:如果在一個(gè)模塊內(nèi)出現(xiàn)異常情況時(shí),其影響局限在該模塊內(nèi)部,那么,由錯(cuò)誤引起的副作用將最小。采用模塊化原理可以使軟件結(jié)構(gòu)清晰,不僅容易設(shè)計(jì),也容易閱讀和理解。因?yàn)槌绦蝈e(cuò)誤通常局限在有關(guān)的模塊及它們之間的接口中,所以模塊化使軟件容易測(cè)試和調(diào)試,從而有助于提高軟件的可靠性。因?yàn)樽儎?dòng)往往只涉及少數(shù)幾個(gè)模塊,所以模塊化能夠提高軟件的可修改性。模塊化也有助于軟件開發(fā)工程的組織管理,一個(gè)復(fù)雜的大型程序可以由許多程序員分工編寫不同的模塊,并且可以進(jìn)一步分配技術(shù)熟練的程序員編寫困難的模塊。
2)抽象
人類在認(rèn)識(shí)復(fù)雜現(xiàn)象的過程中使用的最強(qiáng)有力的思維工具是抽象。人們?cè)趯?shí)踐中認(rèn)識(shí)到,在現(xiàn)實(shí)世界中一些事物、狀態(tài)或過程之間總存在著某些相似的方面(共性),把這些相似的方面集中和概括起來,暫時(shí)忽略它們之間的差異,這就是抽象?;蛘哒f,抽象就是抽出事物的本質(zhì)特性而暫時(shí)不考慮它們的細(xì)節(jié)。
3)逐步求精
逐步求精是人類解決復(fù)雜問題時(shí)采用的基本技術(shù),也是許多軟件工程技術(shù)(例如,規(guī)格說明技術(shù),設(shè)計(jì)和實(shí)現(xiàn)技術(shù),測(cè)試和集成技術(shù))的基礎(chǔ)。逐步求精就是“為了能集中精力解決主要問題而盡量推遲對(duì)問題細(xì)節(jié)的考慮”。
求精實(shí)際上是細(xì)化過程。我們從高抽象級(jí)別定義的功能陳述(或信息描述)開始,也就是說,該陳述僅僅概念性地描述了功能或信息,但是并沒有提供功能的內(nèi)部工作情況或信息的內(nèi)部結(jié)構(gòu)。求精要求設(shè)計(jì)者細(xì)化原始陳述,隨著每個(gè)后續(xù)求精(細(xì)化)步驟的完成而提供越來越多的細(xì)節(jié)。抽象與求精是一對(duì)互補(bǔ)的概念。抽象使得設(shè)計(jì)者能夠說明過程和數(shù)據(jù),同時(shí)卻忽略低層細(xì)節(jié);求精則是在設(shè)計(jì)過程中揭示出低層細(xì)節(jié)。這兩個(gè)概念都有助于設(shè)計(jì)者在設(shè)計(jì)演化過程中創(chuàng)造出完整的設(shè)計(jì)模型。
4)信息隱藏
應(yīng)用模塊化原理時(shí),自然會(huì)產(chǎn)生的一個(gè)問題是:“為了得到最好的一組模塊,應(yīng)該怎樣分解軟件”。信息隱藏原理指出:應(yīng)該這樣設(shè)計(jì)和確定模塊,使得一個(gè)模塊內(nèi)部所包含的信息(內(nèi)部邏輯和內(nèi)部數(shù)據(jù))對(duì)于不需要這些信息的模塊來說,是不能訪問的。
5)模塊獨(dú)立
“模塊獨(dú)立”概念是模塊化、抽象、逐步求精和信息隱藏等概念的直接結(jié)果,也是完成有效的模塊設(shè)計(jì)的基本標(biāo)準(zhǔn)。模塊的獨(dú)立程度可以由兩個(gè)定性標(biāo)準(zhǔn)來度量,這兩個(gè)標(biāo)準(zhǔn)分別稱為耦合和內(nèi)聚。耦合衡量不同模塊彼此間互相依賴(連接)的緊密程度;內(nèi)聚衡量一個(gè)模塊內(nèi)部各個(gè)元素彼此結(jié)合的緊密程度。
(1)耦合。耦合是對(duì)一個(gè)軟件結(jié)構(gòu)內(nèi)不同模塊之間互連程度的度量。耦合的強(qiáng)弱取決于模塊間接口的復(fù)雜程度,進(jìn)入或訪問一個(gè)模塊的點(diǎn),以及通過接口的數(shù)據(jù)。
在軟件設(shè)計(jì)中應(yīng)該追求盡可能松散耦合的系統(tǒng)。在這樣的系統(tǒng)中,可以研究、測(cè)試或維護(hù)任何一個(gè)模塊,而不需要對(duì)系統(tǒng)的其他模塊有很多了解。此外,由于模塊間聯(lián)系簡(jiǎn)單,發(fā)生在一處的錯(cuò)誤傳播到整個(gè)系統(tǒng)的可能性就很小。因此,模塊間的耦合程度強(qiáng)烈影響系統(tǒng)的可理解性、可測(cè)試性、可靠性和可維護(hù)性。耦合性有六種類型,耦合度由大到小分別是:
①內(nèi)容型:一個(gè)模塊直接引用另一個(gè)模塊內(nèi)部的信息,或通過非正常入口而轉(zhuǎn)入另一個(gè)模塊內(nèi)部。
②公共型:兩個(gè)模塊引用共同的全程數(shù)據(jù)區(qū)(如全局變量或數(shù)據(jù)結(jié)構(gòu)、共享的通信區(qū)、外存儲(chǔ)器上的文件和物理設(shè)備等)。
③控制型:一個(gè)模塊傳送給另一個(gè)模塊的信息是用于控制該模塊內(nèi)部邏輯的控制信號(hào)(如傳遞的是開關(guān)、標(biāo)志等控制變量)。④復(fù)合型:一個(gè)模塊傳送給另一個(gè)模塊的參數(shù)是一個(gè)復(fù)合的數(shù)據(jù)結(jié)構(gòu)(如參數(shù)是結(jié)構(gòu)體、數(shù)組名)。
⑤數(shù)據(jù)型:一個(gè)模塊傳送給另一個(gè)模塊的參數(shù)是單個(gè)的數(shù)據(jù)項(xiàng)(如參數(shù)為簡(jiǎn)單的數(shù)據(jù),且采用值傳遞方式)。
⑥無直接型:模塊之間沒有直接的關(guān)系,相互之間不傳遞任何信息。
總之,耦合是影響軟件復(fù)雜程度的一個(gè)重要因素。應(yīng)該采取下述設(shè)計(jì)原則:盡量使用數(shù)據(jù)耦合,少用控制耦合,限制公共環(huán)境耦合的范圍,完全不用內(nèi)容耦合。
(2)內(nèi)聚。內(nèi)聚標(biāo)志一個(gè)模塊內(nèi)各個(gè)元素彼此結(jié)合的緊密程度,它是信息隱蔽和局部化概念的自然擴(kuò)展。簡(jiǎn)單地說,理想內(nèi)聚的模塊只做一件事情。設(shè)計(jì)時(shí),應(yīng)該力求做到高內(nèi)聚,通常中等程度的內(nèi)聚也是可以采用的,而且效果和高內(nèi)聚相差不多。但低內(nèi)聚很糟糕,不要使用。
內(nèi)聚和耦合是密切相關(guān)的,模塊內(nèi)的高內(nèi)聚往往意味著模塊間的松耦合。內(nèi)聚和耦合都是進(jìn)行模塊化設(shè)計(jì)的有力工具,但實(shí)踐表明,內(nèi)聚更重要,應(yīng)該把更多的注意力集中到提高模塊的內(nèi)聚程度上。模塊間的耦合程度強(qiáng)烈影響系統(tǒng)的可理解性、可測(cè)試性、可靠性和可維護(hù)性。內(nèi)聚性有六種類型,由小到大分別是:
①偶然型:模塊中各元素之間沒有任何聯(lián)系。
②邏輯型:將幾個(gè)邏輯上相似的功能放在一個(gè)模塊中,通過參數(shù)確定該模塊完成哪一個(gè)功能。
③瞬時(shí)型:將需要同時(shí)執(zhí)行的元素放在同一個(gè)模塊中,如初始化模塊(對(duì)各變量置初值,打開多個(gè)文件等)。
④通信型:模塊中的元素引用共同的數(shù)據(jù)。⑤順序型:模塊中某個(gè)元素的輸出是另一個(gè)元素的輸入。
⑥功能型:模塊中僅包括完成某個(gè)具體任務(wù)所必需的所有元素。
事實(shí)上,沒有必要精確確定內(nèi)聚的級(jí)別。重要的是,設(shè)計(jì)時(shí)力爭(zhēng)做到高內(nèi)聚,并且能夠辨認(rèn)出低內(nèi)聚的模塊,有能力通過修改設(shè)計(jì)來提高模塊的內(nèi)聚程度,降低模塊間的耦合程度,從而獲得較高的模塊獨(dú)立性。
3.面向數(shù)據(jù)流的設(shè)計(jì)方法
面向數(shù)據(jù)流的設(shè)計(jì)方法的目標(biāo)是給出設(shè)計(jì)軟件結(jié)構(gòu)的一個(gè)系統(tǒng)化的途徑。
在軟件工程的需求分析階段,通常用數(shù)據(jù)流圖描繪信息在系統(tǒng)中加工和流動(dòng)的情況。面向數(shù)據(jù)流的設(shè)計(jì)方法定義了一些不同的“映射”,利用這些映射可以把數(shù)據(jù)流圖變換成軟件結(jié)構(gòu)。因?yàn)槿魏诬浖到y(tǒng)都可以用數(shù)據(jù)流圖表示,所以面向數(shù)據(jù)流的設(shè)計(jì)方法理論上可以設(shè)計(jì)任何軟件的結(jié)構(gòu)。通常所說的結(jié)構(gòu)化設(shè)計(jì)方法,也就是基于數(shù)據(jù)流的設(shè)計(jì)方法。
面向數(shù)據(jù)流的設(shè)計(jì)方法把信息流映射成軟件結(jié)構(gòu),信息流的類型決定了映射的方法。信息流有變換流和事務(wù)流兩種類型。
1)變換分析
變換分析是一系列設(shè)計(jì)步驟的總稱,經(jīng)過以下步驟能夠把具有變換流特點(diǎn)的數(shù)據(jù)流圖按預(yù)先確定的模式映射成軟件結(jié)構(gòu):
(1)復(fù)查基本系統(tǒng)模型。
(2)復(fù)查并精化數(shù)據(jù)流圖。
(3)確定數(shù)據(jù)流圖具有變換特性還是事務(wù)特性。
(4)確定輸入流和輸出流的邊界,從而孤立出變換中心。
(5)完成“第一級(jí)分解”。
(6)完成“第二級(jí)分解”。使用設(shè)計(jì)度量和啟發(fā)規(guī)則對(duì)第一次分割得到的軟件結(jié)構(gòu)進(jìn)一步精化。
上述七個(gè)設(shè)計(jì)步驟的目的是,開發(fā)出軟件的整體表示。也就是說,一旦確定了軟件結(jié)構(gòu),就可以把它作為一個(gè)整體來復(fù)查,從而能夠評(píng)價(jià)和精化軟件結(jié)構(gòu)。在這個(gè)時(shí)期進(jìn)行修改只需要很少的附加工作,但是卻能夠?qū)浖馁|(zhì)量特別是軟件的可維護(hù)性產(chǎn)生深遠(yuǎn)的影響。
2)事務(wù)分析
雖然在任何情況下都可以使用變換分析方法設(shè)計(jì)軟件結(jié)構(gòu),但是在數(shù)據(jù)流具有明顯的事務(wù)特點(diǎn)時(shí),也就是有一個(gè)明顯的“發(fā)射中心”(事務(wù)中心)時(shí),還是以采用事務(wù)分析方法為宜。事務(wù)分析的設(shè)計(jì)步驟和變換分析的設(shè)計(jì)步驟大部分相同或類似,主要差別僅在于由數(shù)據(jù)流圖到軟件結(jié)構(gòu)的映射方法不同。對(duì)于一個(gè)大系統(tǒng),常常把變換分析和事務(wù)分析應(yīng)用到同一個(gè)數(shù)據(jù)流圖的不同部分,由此得到的子結(jié)構(gòu)形成“構(gòu)件”,可以利用它們構(gòu)造出完整的軟件結(jié)構(gòu)。
3)軟件結(jié)構(gòu)設(shè)計(jì)的優(yōu)化問題
考慮設(shè)計(jì)優(yōu)化問題時(shí)應(yīng)該記住,“一個(gè)不能工作的‘最佳設(shè)計(jì)’的價(jià)值是值得懷疑的”。軟件設(shè)計(jì)人員應(yīng)該致力于開發(fā)能夠滿足所有功能和性能要求,而且按照設(shè)計(jì)原理和啟發(fā)式設(shè)計(jì)規(guī)則衡量是值得接收的軟件。
應(yīng)該在設(shè)計(jì)的早期階段盡量對(duì)軟件結(jié)構(gòu)進(jìn)行精化,可以導(dǎo)出不同的軟件結(jié)構(gòu),然后對(duì)它們進(jìn)行評(píng)價(jià)和比較,力求得到“最好”的結(jié)果。
4.面向數(shù)據(jù)結(jié)構(gòu)的設(shè)計(jì)方法
在許多應(yīng)用領(lǐng)域中,信息都有清楚的層次結(jié)構(gòu),而輸入數(shù)據(jù)、內(nèi)部存儲(chǔ)的信息(數(shù)據(jù)庫(kù)或文件)以及輸出數(shù)據(jù)都可能有獨(dú)特的結(jié)構(gòu)。數(shù)據(jù)結(jié)構(gòu)既影響程序的結(jié)構(gòu),又影響程序的處理過程,重復(fù)出現(xiàn)的數(shù)據(jù)通常由具有循環(huán)控制結(jié)構(gòu)的程序來處理,選擇數(shù)據(jù)(即可能出現(xiàn)也可能不出現(xiàn)的信息)要用帶有分支控制結(jié)構(gòu)的程序來處理。層次的數(shù)據(jù)組織通常和使用這些數(shù)據(jù)的程序的層次結(jié)構(gòu)十分相似。面向數(shù)據(jù)結(jié)構(gòu)的設(shè)計(jì)方法的最終目標(biāo)是得出對(duì)程序處理過程的描述。這種設(shè)計(jì)方法并不明顯地使用軟件結(jié)構(gòu)的概念,模塊是設(shè)計(jì)過程的副產(chǎn)品,對(duì)于模塊獨(dú)立原理也沒有給予應(yīng)有的重視。因此,這種方法最適合于在詳細(xì)設(shè)計(jì)階段使用,也就是說,在完成了軟件結(jié)構(gòu)設(shè)計(jì)之后,可以使用面向數(shù)據(jù)結(jié)構(gòu)的方法來設(shè)計(jì)每個(gè)模塊的處理過程。
面向數(shù)據(jù)結(jié)構(gòu)的設(shè)計(jì)方法又稱為Jackson方法,其基本思想是從數(shù)據(jù)結(jié)構(gòu)出發(fā)建立對(duì)應(yīng)的程序結(jié)構(gòu)。所以,這樣的數(shù)據(jù)結(jié)構(gòu)特別適合于企事業(yè)事務(wù)管理類的數(shù)據(jù)處理系統(tǒng)。
在事務(wù)處理的程序中,雖然實(shí)際使用的數(shù)據(jù)結(jié)構(gòu)種類繁多,但是它們的數(shù)據(jù)元素彼此間的邏輯關(guān)系卻只有順序、選擇和重復(fù)三類,因此,邏輯數(shù)據(jù)結(jié)構(gòu)也只有這三類。
1)順序結(jié)構(gòu)
順序結(jié)構(gòu)的數(shù)據(jù)由一個(gè)或多個(gè)數(shù)據(jù)元素組成,每個(gè)元素按確定次序出現(xiàn)一次。圖1.17是表示順序結(jié)構(gòu)的Jackson圖的一個(gè)例子。圖中,A由B、C、D三個(gè)元素順序組成,每個(gè)元素只出現(xiàn)一次,出現(xiàn)的次序依次是B、C和D。圖1.17順序結(jié)構(gòu)的Jackson示例圖
2)選擇結(jié)構(gòu)
選擇結(jié)構(gòu)的數(shù)據(jù)包含兩個(gè)或多個(gè)數(shù)據(jù)元素,每次使用這個(gè)數(shù)據(jù)時(shí),按一定條件從這些數(shù)據(jù)元素中選擇一個(gè)。圖1.18是“三選一”結(jié)構(gòu)的Jackson圖。圖中,A是B或C或D中的某一個(gè)(注意:在B、C和D的右上角有小圓圈標(biāo)記)。圖1.18選擇結(jié)構(gòu)的Jackson示例圖
3)重復(fù)結(jié)構(gòu)
重復(fù)結(jié)構(gòu)的數(shù)據(jù)根據(jù)使用時(shí)的條件由一個(gè)數(shù)據(jù)元素出現(xiàn)零次或多次構(gòu)成。圖1.19表示重復(fù)結(jié)構(gòu)的Jackson圖。圖中,A由B出現(xiàn)N次(N≥0)組成(注意:在B的右上角有星號(hào)標(biāo)記)。圖1.19重復(fù)結(jié)構(gòu)的Jackson示例圖
4)改進(jìn)的Jackson圖
Jackson結(jié)構(gòu)程序設(shè)計(jì)方法基本上由下述五個(gè)步驟組成:
第一步:分析并確定輸入數(shù)據(jù)和輸出數(shù)據(jù)的邏輯結(jié)構(gòu),并用Jackson圖描繪這些數(shù)據(jù)結(jié)構(gòu)。
第二步:找出輸入數(shù)據(jù)結(jié)構(gòu)和輸出數(shù)據(jù)結(jié)構(gòu)中有對(duì)應(yīng)關(guān)系的數(shù)據(jù)單元。所謂有對(duì)應(yīng)關(guān)系是指有直接的因果關(guān)系,在程序中可以同時(shí)處理的數(shù)據(jù)單元(對(duì)于重復(fù)出現(xiàn)的數(shù)據(jù)單元,必須重復(fù)的次序和次數(shù)都相同才可能有對(duì)應(yīng)關(guān)系)。圖1.20(a)表示順序結(jié)構(gòu),數(shù)據(jù)元素B、C、D中的任一個(gè)都不能是選擇結(jié)構(gòu)或重復(fù)結(jié)構(gòu)(即不能是右上角有小圓圈或星號(hào)標(biāo)記的元素)。
圖1.20(b)是選擇結(jié)構(gòu),A是元素B,或是元素C,或是元素D。S右面括號(hào)中的i是分支條件的編號(hào)。
圖1.20(c)是可選結(jié)構(gòu),A是元素B,或者不出現(xiàn)(可選結(jié)構(gòu)是選擇結(jié)構(gòu)的一種常見特殊形式)。
圖1.20(d)是重復(fù)結(jié)構(gòu),循環(huán)結(jié)束條件的編號(hào)為i。圖1.20改進(jìn)的Jackson圖第三步:用下述三條規(guī)則從描繪數(shù)據(jù)結(jié)構(gòu)的Jackson圖導(dǎo)出描繪程序結(jié)構(gòu)的Jackson圖。
(1)為每對(duì)有對(duì)應(yīng)關(guān)系的數(shù)據(jù)單元,按照它們?cè)跀?shù)據(jù)結(jié)構(gòu)圖中的層次在程序結(jié)構(gòu)圖的相應(yīng)層次畫一個(gè)處理框(注意,如果這對(duì)數(shù)據(jù)單元在輸入數(shù)據(jù)結(jié)構(gòu)和輸出數(shù)據(jù)結(jié)構(gòu)中所處的層次不同,則和它們對(duì)應(yīng)的處理框在程序結(jié)構(gòu)圖中所處的層次與它們之中在數(shù)據(jù)結(jié)構(gòu)圖中層次低的那個(gè)對(duì)應(yīng))。
(2)根據(jù)輸入數(shù)據(jù)結(jié)構(gòu)中剩余的每個(gè)數(shù)據(jù)單元所處的層次,在程序結(jié)構(gòu)圖的相應(yīng)層次分別為它們畫上對(duì)應(yīng)的處理框。
(3)根據(jù)輸出數(shù)據(jù)結(jié)構(gòu)中剩余的每個(gè)數(shù)據(jù)單元所處的層次,在程序結(jié)構(gòu)圖的相應(yīng)層次分別為它們畫上對(duì)應(yīng)的處理框。
第四步:列出所有操作和條件,并且把它們分配到程序結(jié)構(gòu)圖的適當(dāng)位置。
第五步:用偽碼表示程序。(Jackson方法中使用的偽碼和Jackson圖是完全對(duì)應(yīng)的。)
總之,描繪程序結(jié)構(gòu)的Jackson圖應(yīng)該綜合輸入數(shù)據(jù)結(jié)構(gòu)和輸出數(shù)據(jù)結(jié)構(gòu)的層次關(guān)系而導(dǎo)出。在導(dǎo)出程序結(jié)構(gòu)圖的過程中,由于改進(jìn)的Jackson圖規(guī)定在構(gòu)成順序結(jié)構(gòu)的元素中不能有重復(fù)出現(xiàn)或選擇出現(xiàn)的元素,因此可能需要增加中間層次的處理框。
【例1.2】一個(gè)正文文件由若干個(gè)記錄組成,每個(gè)記錄是一個(gè)字符串。要求統(tǒng)計(jì)每個(gè)記錄中空格字符的個(gè)數(shù),以及文件中空格字符的總個(gè)數(shù)。要求的輸出數(shù)據(jù)格式是,每復(fù)制一行輸入字符串之后,另起一行印出這個(gè)字符串中的空格數(shù),最后印出文件中空格的總個(gè)數(shù)。
按照順序、選擇和重復(fù)三種類型的Jackson圖,我們通過圖1.21、1.22、1.23來描述各數(shù)據(jù)元素彼此間的邏輯關(guān)系。圖1.21表示輸入/輸出數(shù)據(jù)結(jié)構(gòu)的Jackson圖圖1.22描繪統(tǒng)計(jì)空格程序結(jié)構(gòu)的Jackson圖圖1.23把操作和條件分配到程序結(jié)構(gòu)圖的適當(dāng)位置軟件設(shè)計(jì)的目標(biāo)是設(shè)計(jì)出所要開發(fā)的軟件模型,傳統(tǒng)的軟件工程方法學(xué)采用結(jié)構(gòu)化設(shè)計(jì)技術(shù)完成軟件設(shè)計(jì)工作。軟件設(shè)計(jì)在軟件工程過程中處于技術(shù)核心地位,是軟件開發(fā)過程中決定軟件產(chǎn)品質(zhì)量的關(guān)鍵階段。軟件設(shè)計(jì)必須依據(jù)對(duì)軟件產(chǎn)品的需求來進(jìn)行,因此,結(jié)構(gòu)化設(shè)計(jì)把結(jié)構(gòu)化分析的結(jié)果作為基本輸入信息。由數(shù)據(jù)模型、功能模型和行為模型描述的軟件需求被傳送給軟件設(shè)計(jì)者,以便他們采用適當(dāng)?shù)脑O(shè)計(jì)方法完成數(shù)據(jù)設(shè)計(jì)、體系結(jié)構(gòu)設(shè)計(jì)、接口設(shè)計(jì)和過程設(shè)計(jì)。為了獲得高質(zhì)量的軟件設(shè)計(jì)結(jié)果,應(yīng)該遵循模塊化、抽象、逐步求精、信息隱藏和模塊獨(dú)立等基本設(shè)計(jì)原理,特別是其中的模塊獨(dú)立原理,對(duì)軟件體系結(jié)構(gòu)設(shè)計(jì)和接口設(shè)計(jì)具有非常重要、十分具體的指導(dǎo)作用??偨Y(jié)眾多軟件工程師在開發(fā)軟件的長(zhǎng)期實(shí)踐中所積累的豐富經(jīng)驗(yàn),形成了一些啟發(fā)規(guī)則,這些啟發(fā)規(guī)則雖然不像上述基本原理那樣普遍適用,但在許多場(chǎng)合仍然能給軟件設(shè)計(jì)者以有益的啟示,有助于設(shè)計(jì)出有效模塊化的軟件。通常,使用層次圖或結(jié)構(gòu)圖表示軟件結(jié)構(gòu),這些圖形工具具有形象直觀、容易理解的優(yōu)點(diǎn),讀者應(yīng)該學(xué)會(huì)用這類圖形描繪軟件結(jié)構(gòu)。
面向數(shù)據(jù)流的設(shè)計(jì)方法是設(shè)計(jì)軟件體系結(jié)構(gòu)的一種系統(tǒng)化的方法,它定義了一些映射規(guī)則,可以把數(shù)據(jù)流圖變換成軟件的初步結(jié)構(gòu)。得出軟件的初步結(jié)構(gòu)之后,還必須根據(jù)軟件結(jié)構(gòu)設(shè)計(jì)的優(yōu)化標(biāo)準(zhǔn),以基本設(shè)計(jì)原理和啟發(fā)規(guī)則為指南,對(duì)所得到的軟件結(jié)構(gòu)進(jìn)行仔細(xì)優(yōu)化,才能設(shè)計(jì)出令人滿意的軟件體系結(jié)構(gòu)。1.4.3編碼和軟件測(cè)試
通常把編碼和測(cè)試統(tǒng)稱為實(shí)現(xiàn)。
所謂編碼,就是把軟件設(shè)計(jì)翻譯成計(jì)算機(jī)可以理解的形式——用某種程序設(shè)計(jì)語(yǔ)言書寫的程序。作為軟件工程的一個(gè)階段,編碼是設(shè)計(jì)的自然結(jié)果。雖然軟件的質(zhì)量主要取決于軟件設(shè)計(jì)的質(zhì)量,但是所選用的程序設(shè)計(jì)語(yǔ)言的特點(diǎn)和編碼風(fēng)格也會(huì)對(duì)軟件的可靠性、可讀性、可測(cè)試性和可維護(hù)性產(chǎn)生深遠(yuǎn)的影響。無論怎樣強(qiáng)調(diào)軟件測(cè)試的重要性和它對(duì)軟件可靠性的影響都不過分。在開發(fā)大型軟件系統(tǒng)的漫長(zhǎng)過程中,面對(duì)著極其錯(cuò)綜復(fù)雜的問題,人的主觀認(rèn)識(shí)不可能完全符合客觀現(xiàn)實(shí),與工程密切相關(guān)的各類人員之間的通信和配合也不可能完美無缺,因此,在軟件生命周期的每個(gè)階段都不可避免地會(huì)產(chǎn)生差錯(cuò)。我們力求在每個(gè)階段結(jié)束之前通過嚴(yán)格的技術(shù)審查,盡可能早地發(fā)現(xiàn)并糾正差錯(cuò)。經(jīng)驗(yàn)表明,審查并不能發(fā)現(xiàn)所有差錯(cuò),此外,在編碼過程中還不可避免地會(huì)引入新的錯(cuò)誤。如果在軟件投入使用之前沒有發(fā)現(xiàn)并糾正軟件中的大部分差錯(cuò),則這些差錯(cuò)遲早會(huì)在軟件使用過程中暴露出來,那時(shí)不僅改正這些錯(cuò)誤的代價(jià)更高,而且往往會(huì)造成很惡劣的后果。測(cè)試的目的就是在軟件投入使用之前,盡可能多地發(fā)現(xiàn)軟件中的錯(cuò)誤。目前軟件測(cè)試仍然是保證軟件質(zhì)量的關(guān)鍵步驟,它是對(duì)軟件規(guī)格說明、設(shè)計(jì)和編碼的最后復(fù)審。軟件測(cè)試在軟件生命周期中橫跨兩個(gè)階段。通常在編寫出每個(gè)模塊之后就對(duì)它做必要的測(cè)試(稱為單元測(cè)試),模塊的編寫者和測(cè)試者是同一個(gè)人,編碼和單元測(cè)試屬于軟件生命周期的同一個(gè)階段。在這個(gè)階段結(jié)束之后,對(duì)軟件系統(tǒng)還應(yīng)該進(jìn)行各種綜合測(cè)試,這是軟件生命周期中的另一個(gè)獨(dú)立的階段,通常由專門的測(cè)試人員承擔(dān)這項(xiàng)工作。大量統(tǒng)計(jì)資料表明,軟件測(cè)試的工作量往往占軟件開發(fā)總工作量的40%以上,在極端情況,測(cè)試那種關(guān)系人的生命安全的軟件所花費(fèi)的成本,可能相當(dāng)于軟件工程其他步驟總成本的3~5倍。因此,必須高度重視軟件測(cè)試工作,決不要以為寫出程序之后軟件開發(fā)工作就接近完成了。實(shí)際上,大約還有同樣多的開發(fā)工作量需要完成。
僅就測(cè)試而言,它的目標(biāo)是發(fā)現(xiàn)軟件中的錯(cuò)誤。軟件工程的根本目標(biāo)是開發(fā)出高質(zhì)量的完全符合用戶需要的軟件,因此,通過測(cè)試發(fā)現(xiàn)錯(cuò)誤之后,還必須診斷并改正錯(cuò)誤,這就是調(diào)試的目的。在對(duì)測(cè)試結(jié)果進(jìn)行收集和評(píng)價(jià)的時(shí)候,軟件所達(dá)到的可靠性也就開始明朗了。
1.編碼
1)選擇程序設(shè)計(jì)語(yǔ)言
總的說來,高級(jí)語(yǔ)言明顯優(yōu)于匯編語(yǔ)言,因此,除了在很特殊的應(yīng)用領(lǐng)域(例如,對(duì)程序執(zhí)行時(shí)間和使用的空間都有很嚴(yán)格限制的情況;需要產(chǎn)生任意的甚至非法的指令序列;體系結(jié)構(gòu)特殊的微處理機(jī),以至于在這類機(jī)器上通常不能實(shí)現(xiàn)高級(jí)語(yǔ)言編譯程序),或者大型系統(tǒng)中執(zhí)行時(shí)間非常關(guān)鍵的(或直接依賴于硬件的)一小部分代碼需要用匯編語(yǔ)言編寫之外,其他程序應(yīng)該一律用高級(jí)語(yǔ)言編寫。為了使程序容易測(cè)試和維護(hù),以減少生命周期的總成本,選用的高級(jí)語(yǔ)言應(yīng)該有理想的模塊化機(jī)制,以及可讀性好的控制結(jié)構(gòu)和數(shù)據(jù)結(jié)構(gòu);為了便于調(diào)試和提高軟件可靠性,語(yǔ)言的特點(diǎn)應(yīng)該使編譯程序能夠盡可能多地發(fā)現(xiàn)程序中的錯(cuò)誤;為了降低軟件開發(fā)和維護(hù)的成本,選用的語(yǔ)言應(yīng)該有良好的獨(dú)立編譯機(jī)制。上述這些要求是選擇語(yǔ)言的理想標(biāo)準(zhǔn),但是在實(shí)際選用語(yǔ)言時(shí)不能僅僅考慮理論上的標(biāo)準(zhǔn),還必須同時(shí)考慮實(shí)用方面的各種限制。
2)編碼風(fēng)格
源程序代碼的邏輯簡(jiǎn)明、清晰、易理解是衡量程序質(zhì)量的一個(gè)重要標(biāo)準(zhǔn)。為了做到這幾點(diǎn),應(yīng)該遵循下述規(guī)則。
規(guī)則1:源程序文檔化。
所謂源程序文檔化,包括恰當(dāng)?shù)臉?biāo)識(shí)符命名、適當(dāng)?shù)淖⑨尯统绦虻囊曈X組織等。
標(biāo)識(shí)符包括模塊名、變量名、常量名、標(biāo)號(hào)名、子程序名、數(shù)據(jù)區(qū)名以及緩沖區(qū)名等,這些名字應(yīng)當(dāng)“按意取名”。例如,表示次數(shù)的用Times,表示總量的用Total,表示平均值的用Average,表示和的用Sum等。名字不是越長(zhǎng)越好,應(yīng)當(dāng)選擇精煉的、意義明確的名字,必要時(shí)可使用縮寫名字,但縮寫規(guī)則要一致。同時(shí)應(yīng)當(dāng)注意,在一個(gè)程序中一個(gè)標(biāo)識(shí)符只應(yīng)用于一種用途。程序的注釋就是對(duì)程序的說明,是程序員與日后的程序讀者之間通信的重要手段。注釋決不是可有可無的,一些正規(guī)的程序文本中,注釋行的數(shù)量占到整個(gè)源程序的1/3到1/2,甚至更多。注釋分為序言性注釋和功能性注釋。
(1)序言性注釋:通常置于每個(gè)模塊的開頭部分,它應(yīng)當(dāng)給出模塊的整體說明,對(duì)于理解模塊具有引導(dǎo)作用。序言性注釋包括:
●說明模塊的用途、功能;
●說明模塊的接口:調(diào)用形式、參數(shù)描述及從屬模塊清單;
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 呼吸系統(tǒng)慢病管理新進(jìn)展
- 智能安全設(shè)備的人性化設(shè)計(jì)
- 機(jī)械安全事故案例
- 第三章 運(yùn)動(dòng)和力的關(guān)系-教材實(shí)驗(yàn)4 探究加速度與力、質(zhì)量的關(guān)系 2025年高考物理基礎(chǔ)專項(xiàng)復(fù)習(xí)
- 3.3.2鹽類水解的影響因素及常數(shù) 課件高二上學(xué)期化學(xué)人教版(2019)選擇性必修1
- 智慧園區(qū)產(chǎn)品方案
- 《Excel數(shù)據(jù)獲取與處理實(shí)戰(zhàn)》 課件 陳青 第1、2章 Excel 2016概述、外部數(shù)據(jù)的獲取
- 輿情應(yīng)急演練桌面推演
- 保暖小幫手教案及反思
- 好餓的毛毛蟲說課稿
- 高血壓病三級(jí)預(yù)防策略 醫(yī)學(xué)類模板 醫(yī)學(xué)課件
- DL∕T 523-2017 化學(xué)清洗緩蝕劑應(yīng)用性能評(píng)價(jià)指標(biāo)及試驗(yàn)方法
- 無人機(jī)應(yīng)用技術(shù)專業(yè)申報(bào)表
- 食品營(yíng)養(yǎng)學(xué)選擇試題庫(kù)(附參考答案)
- 北師大版二年級(jí)數(shù)學(xué)上冊(cè)第五單元《2~5的乘法口訣》(大單元教學(xué)設(shè)計(jì))
- 2024年入團(tuán)知識(shí)考試題庫(kù)及答案
- 腫瘤化療導(dǎo)致的中性粒細(xì)胞減少診治中國(guó)專家共識(shí)(2023版)解讀
- 《新能源汽車概論》課件-6新能源汽車空調(diào)系統(tǒng)結(jié)構(gòu)及工作原理
- 2024年共青團(tuán)入團(tuán)考試題庫(kù)(附答案)
- 安川g7變頻器說明書-安川變頻器g7面板操作說明
- 田徑運(yùn)動(dòng)會(huì)各種記錄表格
評(píng)論
0/150
提交評(píng)論