1.5 軟件工程方法學
1.5.1 軟件工程方法學的定義
軟件工程方法為軟件開發提供了“如何做”的技術,軟件工具為軟件工程方法提供了自動的或半自動的軟件支撐環境;過程是為了獲得高質量的軟件所需要完成的一系列任務框架,它規定了完成各項任務的工作步驟。
通常把在軟件開發過程中使用的一整套技術方法的集合稱為方法學(Methodology)。軟件工程方法學包含三個要素:方法、工具和過程。
其中:①方法是完成軟件開發各項任務的技術方法,回答“怎樣做”的問題。②工具是為運用方法而提供的自動的或半自動的軟件工程支撐環境,軟件開發工具是用于輔助軟件生命周期過程的基于計算機的工具,通常可以設計并實現工具來支持特定的軟件工程方法,減少手工方式管理的負擔,讓軟件工程更加系統化,工具的種類包括支持單個任務的工具及囊括整個開發過程的工具。③過程是為了獲得高質量的軟件所需要完成的一系列任務的框架,它規定了完成各項任務的工作步驟。
1.5.2 軟件工程方法學的類型
軟件工程方法是軟件工程學科的核心內容,從20世紀60年代末以來,出現了許多軟件工程方法,其中最具影響的是結構化設計方法、面向對象方法和形式化方法。
(1)結構化設計方法
結構化設計方法(Structured Design,SD)是一種傳統的軟件開發方法,它是由結構化分析、結構化設計和結構化程序設計三部分有機組合而成的。它的基本思想:把一個復雜問題的求解過程分階段進行,而且這種分解是自頂向下,逐層分解,使得每個階段處理的問題都控制在人們容易理解和處理的范圍內。結構化方法將軟件開發全過程依次劃分為若干個階段,采用結構化技術來完成每個階段的任務。特點:①強調自頂向下順序地完成軟件開發的各階段任務;②結構化方法要么面向行為,要么面向數據,缺乏使兩者有機結合的機制。
結構化分析方法是以自頂向下、逐步求精為基點,以一系列經過實踐的考驗被認為是正確的原理和技術為支撐,以數據流圖、數據字典、結構化語言、判定表、判定樹等圖形表達為主要手段,強調開發方法的結構合理性和系統的結構合理性的軟件分析方法。
結構化設計方法是以自頂向下、逐步求精、模塊化為基點,以模塊化、抽象、逐層分解求精、信息隱蔽化局部化和保持模塊獨立為準則的設計軟件的數據架構和模塊架構的方法學。
結構化方法按軟件生命周期劃分,有結構化分析(SA)、結構化設計(SD)和結構化實現(SP)。其中要強調的結構化方法學是一個思想準則的體系,雖然有明確的階段和步驟,但是也集成了很多原則性的東西。所以,學會結構化方法,僅從理論知識上去了解是不夠的,還要從實踐中慢慢理解各準則,并將其變成自己的方法學。
結構化分析的步驟如下:
①分析當前的情況,做出反映當前物理模型的數據流圖。
②推導出等價的邏輯模型的數據流圖。
③設計新的邏輯系統,生成數據字典和基元描述。
④建立人機接口,提出可供選擇的目標系統物理模型的數據流圖。
⑤確定各種方案的成本和風險等級,據此對各種方案進行分析。
⑥選擇一種方案。
⑦建立完整的需求規約。
結構化設計方法給出一組幫助設計人員在模塊層次上區分設計質量的原理與技術。它通常與結構化分析方法銜接起來使用,以數據流圖為基礎得到軟件的模塊結構。結構化設計方法尤其適用于變換型結構和事務型結構的目標系統。在設計過程中,它從整個程序的結構出發,利用模塊結構圖表述程序模塊之間的關系。結構化設計的步驟如下:
①評審和細化數據流圖。
②確定數據流圖的類型。
③把數據流圖映射到軟件模塊結構,設計出模塊結構的上層。
④基于數據流圖逐步分解高層模塊,設計中下層模塊。
⑤對模塊結構進行優化,得到更為合理的軟件結構。
⑥描述模塊接口。
(2)面向對象方法
面向對象方法(Object-Oriented Method)是一種把面向對象的思想應用于軟件開發過程中,指導開發活動的系統方法,簡稱OO(Object-Oriented)方法,是建立在“對象”概念基礎上的方法學。對象是由數據和容許的操作組成的封裝體,與客觀實體有直接對應關系,一個對象類定義了具有相似性質的一組對象。而繼承性是對具有層次關系的類的屬性和操作進行共享的一種方式。所謂面向對象就是基于對象概念,以對象為中心,以類和繼承為構造機制,來認識、理解、刻畫客觀世界和設計、構建相應的軟件系統。
OO方法起源于面向對象的編程語言(簡稱OOPL)。20世紀50年代后期,在用FORTRAN語言編寫大型程序時,常出現變量名在程序不同部分發生沖突的問題。鑒于此,ALGOL語言的設計者在ALGOL60中采用了以“Begin…End”為標識的程序塊,使塊內變量名是局部的,以避免它們與程序中塊外的同名變量相沖突。這是編程語言中首次提供封裝(保護)的嘗試。此后程序塊結構廣泛用于高級語言如Pascal、Ada、C之中。
20世紀60年代中后期,Simula語言在ALGOL基礎上研制開發,它將ALGOL的塊結構概念向前發展一步,提出了對象的概念,并使用了類,也支持類繼承。20世紀70年代,Smalltalk語言誕生,它取Simula的類為核心概念,它的很多內容借鑒于Lisp語言。由Xerox公司經過對Smautalk72/76持續不斷地研究和改進之后,于1980年推出并商品化,它在系統設計中強調對象概念的統一,引入對象、對象類、方法、實例等概念和術語,采用動態聯編和單繼承機制。
從20世紀80年代起,人們基于以往已提出的有關信息隱蔽和抽象數據類型等概念,以及由Modula2、Ada和Smalltalk等語言所奠定的基礎,再加上客觀需求的推動,進行了大量的理論研究和實踐探索,不同類型的面向對象語言(如Object-c、Eiffel、C++、Java、Object-Pascal等)逐步發展和建立起來。
面向對象源出于Simula,真正的OOP由Smalltalk奠基。Smalltalk現在被認為是最純的OOPL。正是通過Smalltalk80的研制與推廣應用,使人們注意到OO方法所具有的模塊化、信息封裝與隱蔽、抽象性、繼承性、多樣性等獨特之處,這些優異特性為研制大型軟件、提高軟件可靠性、可重用性、可擴充性和可維護性提供了有效的手段和途徑。
20世紀80年代以來,將面向對象的基本概念和運行機制運用到其他領域,獲得了一系列相應領域的面向對象的技術。面向對象方法已被廣泛應用于程序設計語言、形式定義、設計方法學、操作系統、分布式系統、人工智能、實時系統、數據庫、人機接口、計算機體系結構以及并發工程、綜合集成工程等,在許多領域的應用都得到了很大的發展。1986年在美國舉行了首屆“面向對象編程、系統、語言和應用(OOPSLA'86)”國際會議,使面向對象受到世人矚目,其后每年都舉行一次,這進一步標志OO方法的研究已普及到全世界。
面向對象方法學:OO方法遵循一般的認知方法學的基本概念(即“有關演繹—從一般到特殊和歸納—從特殊到一般”的完整理論和方法體系)而建立面向對象方法等基礎。
面向對象方法學要點之一:認為客觀世界是由各種“對象”所組成的,任何事物都是對象,每一個對象都有自己的運動規律和內部狀態,每一個對象都屬于某個對象“類”,都是該對象類的一個元素。復雜的對象可以是由相對比較簡單的各種對象以某種方式而構成。不同對象的組合及相互作用就構成了要研究、分析和構造的客觀系統。
面向對象方法學要點之二:是通過類比,發現對象間的相似性,即對象間的共同屬性,這就是構成對象類的依據。
面向對象方法學要點之三:認為對已分成類的各個對象,可以通過定義一組“方法”來說明該對象的功能,即允許作用于該對象上的各種操作。對象間的相互聯系是通過傳遞“消息”來完成的,消息就是通知對象去完成一個允許作用于該對象的操作,至于該對象將如何完成這個操作的細節,則是封裝在相應的對象類的定義中的,細節對于外界是隱蔽的。
面向對象方法的具體步驟如下:
①分析確定在問題空間和解空間出現的全部對象及其屬性。
②確定應施加于每個對象的操作,即對象固有的處理能力。
③分析對象間的聯系,確定對象彼此間傳遞的消息。
④設計對象的消息模式,消息模式和處理能力共同構成對象的外部特性。
⑤分析各個對象的外部特性,將具有相同外部特性的對象歸為一類,從而確定所需要的類。
⑥確定類間的繼承關系,將各對象的公共性質放在較上層的類中描述,通過繼承來共享對公共性質的描述。
⑦設計每個類關于對象外部特性的描述。
⑧設計每個類的內部實現(數據結構和方法)。
⑨創建所需的對象(類的實例),實現對象間應有的聯系(發消息)。
面向對象方法是將數據和對數據的操作緊密地結合起來的方法。軟件開發過程是多次反復迭代的演化過程。面向對象方法在概念和表示方法上的一致性,保證了各項開發活動之間的平滑過渡。對于大型、復雜及交互性比較強的系統,使用面向對象方法更有優勢。
(3)形式化方法
形式化方法是一種基于形式化數學變換的軟件開發方法,它可將系統的規格說明轉換為可執行的程序。
在計算機科學和軟件工程領域,形式化方法是基于數學的特種技術,適合于軟件和硬件系統的描述、開發和驗證。將形式化方法用于軟件和硬件設計,是期望能夠像其他工程學科一樣,使用適當的數學分析以提高設計的可靠性和魯棒性。但是,由于采用形式化方法的成本高,意味著它們通常只用于開發注重安全性的高度整合的系統。
形式化方法在古代就運用了,在現代邏輯中又有了進一步的發展和完善。這種方法特別在數學、計算機科學、人工智能等領域得到廣泛運用。它能精確地揭示各種邏輯規律,制定相應的邏輯規則,使各種理論體系更加嚴密。同時也能正確地訓練思維、提高思維的抽象能力。
軟件形式化方法最早可追溯到20世紀50年代后期對于程序設計語言編譯技術的研究,即J.Backus提出BNF描述Algol60語言的語法,出現了各種語法分析程序自動生成器以及語法制導的編譯方法,使得編譯系統的開發從“手工藝制作方式”發展成具有牢固理論基礎的系統方法。形式化方法的研究高潮始于20世紀60年代后期,針對當時所謂的“軟件危機”,人們提出種種解決方法,歸納起來有兩類:一是采用工程方法來組織、管理軟件的開發過程;二是深入探討程序和程序開發過程的規律,建立嚴密的理論,以其用來指導軟件開發實踐。前者導致“軟件工程”的出現和發展,后者則推動了形式化方法的深入研究。經過30多年的研究和應用,今人們在形式化方法這一領域取得了大量、重要的成果,從早期最簡單的形式化方法——一階謂詞演算方法到現在的應用于不同領域、不同階段的基于邏輯、狀態機、網絡、進程代數、代數等眾多形式化方法。形式化方法的發展趨勢逐漸融入軟件開發過程的各個階段,從需求分析、功能描述(規約)、(體系結構/算法)設計、編程、測試直至維護。