從C語言到Java,我們多多少少可以感覺到兩種語言在設計上有所不同,其實,這兩種程序設計語言對應的是兩種不同的軟件開發方法。那么,什么是軟件開發方法?軟件開發方法指:在項目投資規模和時間限制內,設計、實現符合用戶需求的高質量軟件,根據軟件開發的特點,提出的多種軟件開發策略。20世紀60年代的“軟件危機”席卷了全球的軟件業,其表現為費用超支、進度失控和軟件質量難以有效保證,人們開始意識到軟件的開發需要有一套科學、先進的工程技術作為理論指導。於是為了提高軟件質量,軟件開發方法不斷推陳出新,產生了許多眾所周知的開發方法,如生命周期法(即結構化方法)、原型法、面向數據結構的Jackson方法、基於模型的VDM(維也納開發)方法、面向對象方法等。其中,結構化方法與面向對象方法是比較具有代表性的兩種方法,結構化方法經過30多年的研究以及應用,最為成熟且影響最大,直到現在仍有許多系統是用它開發的.而面向對象方法是在結構化方法、信息建模方法等基礎上發展起來的。
結構化方法(Structured Methodology)是計算學科的一種典型的系統開發方法。它采用了系統科學的思想方法,從層次的角度,自頂向下地分析和設計系統。結構化方法包括結構化分析(Structured Analysis,簡稱SA)、結構化設計(Structured Design,簡稱SD)和結構化程序設計(Structured Program Design,簡稱SP)三部分內容。其中,SA和SD主要屬於學科抽象的內容,SP則主要屬於學科設計方面的內容。面向對象(Object—oriented,簡稱OO)方法是以面向對象思想為指導進行系統開發的一類方法的總稱。這類方法以對象為中心,以類和繼承為構造機制來抽象現實世界,並構建相應的軟件系統[1]。下文將進行結構化方法與面向對象方法的應用比較。
從起源上看
結構化方法的起源:1966年,C-BOhm和G-Jacopini提出了關於“程序結構”的理論,並給出了任何程序的邏輯結構都可以用順序結構、選擇結構和循環結構來表示的證明。在程序結構理論的基礎上,1968年,戴克斯特拉提出了“GOTO語句是有害的”的問題,並引起普遍重視,SP逐漸形成,並成為計算機軟件領域的重要方法,對計算機軟件的發展具有重要的意義。伴隨着SP的形成,相繼出現了Modula-2、C以及Ada等結構化程序設計語言。
面向對象方法的起源:與結構化方法一樣,面向對象方法也起源於面向對象程序語言(Object Oriented Program Language,簡稱OOPL)。面向對象程序語言始於20世紀60年代后期,第一個OOPL是挪威計算中心的Kristen-Nygaard和Ole-JohanDahl於1967年研制的Simula語言,該語言引入了許多面向對象的概念,如類和繼承性等。受Simula語言的影響,1972年,Alan Kay在Xerox公司研制成功了Smalltalk語言,並對面向對象的一些概念作了更精確的定義。1980年,Xerox公司推出的Smalltalk-80語言標志着00PL進入實用化階段。20世紀80年代,OOPL得到了極大地發展,相繼出現了一大批實用的面向對象語言。20世紀80年代中期,隨着OOPL推廣使用,面向對象技術很快被應用到系統分析和系統設計中。20世紀90年代,面向對象分析(Object-Oriented Analysis,簡稱OOA)和面向對象設計(Object—Oriented Design,簡稱OOD)開始成熟,一些實用的面向對象開發方法和技術相繼出現。如G.Booch提出的面向對象開發方法,P.Coad和E.Yourdon提出的OOA和OOD等等。這些方法的提出,標志着面向對象方法逐步發展成為完整的系統化的技術體系。
從基本思想上看
結構化方法的基本思想就是將待解決的問題看作一個系統,從而用系統科學的思想方法來分析和解決問題。結構化方法遵循以下基本原則:(1)抽象原則,(2)分解原則,(3)模塊化原則。
面向對象是面對問題的,本身就是以人的角度來看問題,如同《大英百科全書》描述了“分類學理論”中有關人類認識現實世界普遍采用的3個構造法則:(1)區分對象及其屬性;(2)區分整體對象及其組成部分;(3)形成並區分不同對象的類。按照P-Coad和EYourdon的論述,面向對象思想正是根據以上3個常用的構造法而建立起來的。在實際應用中,它采用對象及其屬性,整體和部分,類、成員和它們之間的區別等3個法則來對系統進行分析和設計,遵循了分類學理論的基本原理,符合認識來源於實踐,又服務於實踐的科學思維方式。在OO方法中,對象和類是其最基本的概念。其中,對象是系統運行時的基本單位,是類的具體實例,是一個動態的概念;而類是對具有相同屬性和操作(或稱方法、服務)的對象進行的抽象描述,是對象的生成模板,是一個靜態的概念。類可以形式化定義為:
Class=<ID,INH,ATT,OPE,ITF>
其中:
ID——類名:
INH——類的繼承性集;
ATT——屬性集;
OPE——操作集;
ITF——接口消息集。
從核心問題上看
模型問題是結構化方法的核心問題。建立模型(簡稱建模)是為了更好地理解要模擬的現實世界。建模通常是從系統的需求分析開始,在結構化方法中,就是使用SA方法構建系統的環境模型;然后使用SD方法,確定系統的行為和功能模型;最后用SP方法進行系統的設計。SD的主要任務就是要在系統環境模型的基礎上建立系統的行為和功能模型,完成系統內部行為的描述。實現系統行為和功能模型的主要工具有:數據字典、數據流圖、狀態變遷圖和實體一聯系模型等。
面向對象方法與結構化方法一樣,其核心問題也是模型問題。面向對象模型主要由OOA模型、OOD模型組成。其中,OOA主要屬於學科抽象方面的內容,OOD主要屬於學科設計方面的內容。OOA關心的是構建現實世界的模型問題。如何解決現實世界的建模問題呢?根據系統科學的思想,首先需要對復雜的系統進行分解,最常用的分解方法就是分層。OOA與OOD不存在轉換的問題。OOD根據設計的需要,僅對OOA在問題域方面建立的5個抽象層次進行必要的增補和調整,同時,OOD還必須對人機交互、任務管理和數據管理3個部分的內容進行抽象,最后建立完整的OOD模型。使用OOPL來實現OOA和OOD模型相對來說比較容易,因為OOPL的構造與OOA和OOD模型的構造是相似的,OOPL支持對象、運行多態性和繼承等概念。使用非OO語言則需要特別注意和規定保留程序的OO結構。OO概念可以映射到非OO語言結構中,這只是一個表達方式的問題,不是語言能力的問題,因為編程語言最終要轉換為機器語言,對OO模型而言,使用OOPL效果更好一些[2]。
除了上述幾個重要的不同之外,結構化方法和面向對象方法在其他方面仍有不同之處。在編程語言方面,面向對象方法主要采用的是C++、 VB、 JAVA 等,而結構化方法主要采用的是C、 BASIC、 FORTRAN 等;在邏輯工具方面,面向對象方法主要采用的是對象模型圖、 數據字典動態模型圖、 功能模型圖,而結構化方法主要采用的是數據流圖、 系統結構圖、 數據字典狀態轉移圖、 實體關系圖。在處理問題方面,面向對象方法面向的是問題,而過程化方法則是面向過程的。在層次結構的邏輯關系方面,面向對象的方法使用類的層次結構來體現類之間的繼承和發展,而結構化方法則是用模塊的層次結構概括模塊和模塊之間的關系和功能;從控制程序方式,面向對象方法是通過“事件驅動”來激活和運行程序,而結構化方法則是通過設計調用或者返回程序來實現的。在可擴展性方面兩種軟件開發方法也存在一定的差異,面向對象方法相比於結構化方法可擴展性更好,只需要通過修改或者增加操作,而基本對象結構不變。相比之下,結構化方法可擴展性顯得更弱一點,功能變化會危及整個系統。同理,在重用性方面,面向對象方法也顯得更有優勢。在分析、設計和編碼的轉換方式上,面向對象是個平滑過程,可以實現無縫連接,而結構化設計則是需要按照規則轉換,有縫連接。盡管如此看來,面向對象方法似乎顯得比結構化方法更好一點,但是,出來混的總是要還的,面向對象方法相比於結構化方法之所有有如此多的有點正是因為其犧牲了運行效率換來的,所以在運行效率方面,結構化方法比面向對象方法略勝一籌[3]。
盡管二者之間有很多差異,但畢竟面向對象方法是在結構化方法基礎上建立起來的,所以二者之間還是存在一定的聯系。主要體現在以下幾方面:首先是在預定目標和組成上的一致。面向對象方法與結構化方法都是把客觀世界中要解決的問題轉向計算機上的實現作為預定目標[4]。從抽象的意義上講,面向對象方法與結構化方法從實現預定目標和組成上是完全一致的[5]。
其次是在運用分解和抽象原則上的一致分解和抽象是軟件開發中控制問題復雜性的重要原則。分解即是化整為零,各個擊破;而抽象則是通過分解體現,在逐層進行的分解中,上一層是下一層的抽象,而下一層是對上層的具體解釋或體現,運用抽象可以不用一下考慮過多的細節,而是逐步有節奏地去了解更多的細節。因此,分解和抽象的原則是處理客觀世界復雜問題的最有力的武器,面向對象方法和結構方法在運用分解和抽象原則上的要求則是完全一致的。
再則則是局部化是軟件開發中的一個重要原則,即不希望軟件一部分過多地涉及或影響軟件的其他部分。在結構化方法中,局部化主要體現在代碼與數據的分隔化,即程序各部分除必要的信息交流外,彼此相互隔離而互不影響,而面向對象方法則采用數據、代碼的封裝,即將數據和代碼封裝成一個能動的整體對象。在運用局部化原則上,面向對象方法繼承了結構化方法的宗旨,但它比結構化方法的運用更為深入、更為徹底。重用性即復用性。復用性是軟件或軟件構件能夠容易地構造其他新軟件的一種能力。重用性與局部化密切相關,重用性是以局部化為基礎的,即只有采用局部化設計原則,才有可能使被設計的軟件具有重用性。在面向對象方法中,重用性往往是通過類繼承和對象組合兩個最基本的技術來實現的,而在結構化方法中,多通過基本模型的組合實現重用[6]。
在軟件系統的開發中,結構化方法和面向對象方法在建模中得到了廣泛的應用。面向對象方法是現代軟件開發方法的主流,在各個領域得到了有效的應用,顯示出強大的生命力。雖然相比之下結構化方法優勢不如面向對象方法,但是仍有其優勢領域所在,不至於被淘汰。在開發軟件過程中,要善於發揮兩種方法各自的優勢,在主流的面向對象的開發方法中,可以輔助結構化方法來更加明確系統的功能,加快面向對象的軟件開發過程,有利於建造高質量的軟件。
參考文獻:
[1] 林玲 結構化方法與面向對象方法在建模中的應用與比較 機電技術 2011年10月
[2] 喻 梅 結構化程序設計方法與面向對象程序設計方法之比較
[3] 汪寒昊 謝加勝 邢躍 軟件開發方法——結構化方法與面向對象方法比較 科技信息 2011 年 第 13 期
[4] 黃柏素軟件工程實踐者的研究方法 [M].北京: 機械工業出版社 , 2001.
[5] 周之英現代軟件工程 (新技術篇 ) [ M ].北京: 科學出版社 , 2001.
[6] 賀啟寶 ,王 軍 面向對象方法與結構化方法 佛山科學技術學院學報 (自然科學版 )第 22卷第 4期