http://www.cnblogs.com/hy13211114/p/6193593.html
軟件工程之結構化方法與面向對象方法之比較與結合
軟件開發方法指,在項目投資規模和時間限制內,設計、實現符合用戶需求的高質量軟件,根據軟件開發的特點,提出的多種軟件開發的策略。隨着20世紀60年代,計算機軟件、硬件發展不均衡,使大型軟件的開發過程中出現了復雜程度高、研制周期長、正確性難以保證的三大難題,引發了“軟件危機”。為了同時提高軟件效率和質量,軟件開發方法不斷革新。經過幾十年的研究和應用,兩種基於相應的程序設計思想和語言的軟件開發方法,結構化方法與面向對象方法,成為了主流的開發方法之一,廣泛地使用於軟件工程。
結構化方法包括結構化分析(Structured Analysis,簡稱SA)、結構化設計(Structured Design,簡稱SD)和結構化程序設計(Structured Program Design,簡稱SP)三部分內容。相應地,面向對象方法包括面向對象分析(Object-Oriented Analysis,簡稱OOA)、面向對象設計(Object—Oriented Design,簡稱OOD)和面向對象程序語言(Object-Oriented Program Design,簡稱OOP)。兩種軟件開發方法從起源、思想、分析、設計,到程序設計、擴展重用、應用等各個方面有着許多的聯系和區別,下文我將對二者進行比較分析。兩種方法針對不同的工作環境和應用場景,各具優勢,也都有所不足,我也將討論二者在軟件工程中的結合,以期產生更好的效果。
(一)從起源上看
結構化方法與面向對象方法都起源於相應的程序設計思想和語言。20世紀60年代后期,《程序結構理論》和《GOTO陳述有害論》的提出,證明了任何程序的邏輯結構都可以用順序結構、選擇結構和循環結構來表示,確立了結構化程序設計思想,產生了如FORTRAN、PASCAL、C等語言。結構化方法把對程序的分析、設計,延伸至對項目工程的分析、設計,結合程序設計語言的技術支持,得以產生和發展。
20世紀80年代,隨着應用系統的日趨復雜、龐大,結構化開發方法在工程應用中出現了一些問題。同期,面向對象程序設計思想經過20年的研究和發展逐漸成熟,一大批面向對象語言相繼出現,面向對象方法自產生就廣受青睞。90年代中期,互聯網興起,JAVA語言因跨平台特性得以蓬勃發展;21世紀初,不受限於時空的聯合開發成為常態;今天,移動APP市場火爆,Andriod開發成為熱點。面向對象方法已經成為軟件開發方法的中堅力量。
結構化方法和面型對象方法的起源和發展具有模式一致性:
圖一:軟件開發方法發展模式
(二)從思想上看
結構化方法承襲了結構化程序設計的思想,把待解決的問題看作一個系統,用系統科學的思想方法來分析和解決問題。結構化方法遵循抽象原則、分解原則和模塊化原則;以數據和功能為中心;以模塊為基本單位;以算法為程序核心;強調逐步求精和信息隱藏。
面向對象方法的思想是模擬了客觀世界的事物以及事物之間的聯系。面向對象以類取代模塊為基本單位;通過封裝、繼承和多態的機制,表征對象的數據和功能、聯系和通信;通過對對象的管理和對象間的通訊完成信息處理與信息管理的計算和存儲,實現軟件功能。
對於結構化方法,模塊由函數實現,完成對輸入數據的加工和計算,數據和功能是分離的;而面向對象把數據和功能封裝在對象中,形成一個整體。兩種方法在數據和功能上的不同處理是其思想上的本質差別。
圖二:結構化思想和面向對象思想
(三)從分析上看
建立模型是為了更好地理解要模擬的現實世界,是軟件開發方法的核心問題。在結構化方法中,使用SA構建系統的環境模型和邏輯模型,實現模型的主要工具有數據字典(DD)、ER圖和數據流圖(DFD)。數據字典是一個包含所有系統數據元素定義的倉庫;ER圖描述了數據之間的屬性及聯系;數據流圖是描述信息流和數據從輸入到輸出變換,並展示系統和外部的接口、數據的輸入和輸出以及數據的存儲的應用圖形技術[1]。SA的前提條件是需求分析,建模過程是迭代分解需求、不斷細化應用的過程,即數據流圖的分解從頂層圖開始,按照每個加工對應一個子圖的分解原則,逐層分解為0層圖、1層圖等。
面向對象方法使用OOA定義類,對現實世界建模。OOA的主要任務是要在問題域上構建具有主題層、對象層、結構層、屬性層和服務層的OOA模型,實現模型的主要工具有用例圖(Use-Case)和類圖(Class Diagram)。用例圖從用戶角度描述系統功能,並指出各功能的操作者,是對需求分析的整理;類圖定義了類的組成(屬性和服務)、類的結構和類間的關系,確定並划分系統中的類。經過OOA,系統的靜態模型建立起來。
相對於結構化方法使用DD、ER圖和DFD分別描述數據和功能(盡管二者存在相互參考),面向對象方法中,無論是用例圖還是類圖,數據和功能的描述總是並行的。
圖三:數據流圖
圖四:用例圖 圖五:類圖
(四)從設計上看
在結構化方法中,使用SD構建系統的行為和功能模型,實現模型的主要工具有模塊結構圖(SC)和程序流程圖。模塊結構圖說明了系統的模塊的划分、模塊的功能、模塊間的數據傳遞及調用關系。根據數據流圖,我們能夠映射出相應的軟件的上層模塊結構;結合數據流圖,我們可以逐步分解上層模塊,設計出中、下層模塊;對於得到的全部模塊,我們需要設計模塊基本的內部結構和外部接口及對模塊結構進行優化。進一步,則是針對每一個模塊設計程序流程圖,整理優化,歸納算法。SD依然是對項目系統的進一步分解求精的過程,把模型從邏輯級,細化到模塊級,再細化到程序級。
而OOD不只是對OOA的細化,更主要的,構建了系統的動態模型,實現模型的主要工具有交互圖(Sequence Diagram)、狀態圖(State Diagram)、活動圖(Activity Diagram)。和模塊相比,對象最大的不同是具有“活性”,突出表現在對象具有狀態和對象間能夠通訊。交互圖描述對象間的交互關系,顯示對象之間的動態合作關系,強調對象之間消息發送的時間順序;狀態圖描述對象的所有可能狀態,以及事件發生時狀態的轉移條件;活動圖描述為滿足用例要求所進行的活動以及活動間的約束關系,用於識別並行活動,以提高系統效率[2]。
從設計方面,我們可以比較明顯地看出結構化和面向對象的區別。結構化方法的核心是程序,從分析到設計,其實是從抽象到具體,從模糊到清晰地實現程序的過程;而面向對象方法的核心是功能,分析的是對象,設計的是行為,程序設計和系統設計相對分離。
圖六:模塊結構圖
圖七:交互圖 圖八:狀態圖 圖九:活動圖
(五)從程序設計上看
以例子進行說明(銀行存取款):
int main () { int count; int money; int type; scanf ("%d %d %d", &count, &money, &type); if (type) printf ("%d", count - money); else printf ("%d", count + money); }
結構化程序設計
class Count { int count; Count (int count) { this.count = count; } int save (int money) { count += money; } int take (int money) { if(count >= money) count -= money; } }
面向對象程序設計
從上例可見,結構化程序設計是一種過程式的“解題”的方式,程序關注且只關注對於輸入數據,輸出正確的結果,代碼是算法的直接體現,代碼效率高;面型對象程序設計是整體式的“建模”的方式,程序關注現實客體,而非某些數據,代碼是功能的直接體現,復雜的算法往往是一兩行庫函數處理,代碼效率低。
(六)從擴展重用上看
結構化方法是面向整體應用進行的分析、設計,程序設計也是過程式的針對固定的輸入域,代碼定向性明顯。所以,結構化方法的可擴展性較差,功能的變化可能危及整個系統;重用性不好,若系統間存在嵌套關系,主系統可重用子系統;較難以組合拼接,系統的設計實現是緊耦合的,連接往往是有縫的。
相反,面向對象方法雖然基於應用,但面向現實客體,對象之間獨立性較強,功能是對象的交互。所以,面向對象的可擴展性較強,只需擴展或修改某個類,或調整某種通訊;重用性好,面向對象的繼承和多態機制大大提高了代碼重用的層次和粒度;易於組合拼接,對象是數據和功能的最小單位,為對象建立新的通信的聯系,就能夠組合出新的軟件系統。
(七)從應用上看
結構化方法的實質是問題求解,結構化程序是由算法決定的,算法是程序員分析設計的,程序的執行過程主要是由程序員控制,而不是由用戶控制;面向對象方法中,程序員設計的是對象屬性及操作方法,但在什么時間、使用什么方式操作對象則是完全由用戶交互控制。
結構化方法的建模工具難以表達交互性強的軟件系統,程序設計融入系統的分析和設計中,處理大型系統時會過於復雜,甚至很難控制;面向對象方法的抽象機制提供了自然的建模方法,特別是能很好地把握對象之間復雜的相互關系。
結構化方法比較適合工程計算、實時數據的跟蹤處理、各種自動控制系統等等; 面向對象分析更加適用於復雜的、由用戶控制程序執行過程的應用軟件,比如大型游戲軟件以及各類管理信息系統軟件[3]。
(八)二者之結合
經過上述分析,我們可知結構化方法和面向對象方法對於不同的軟件系統各有優劣。結構化方法把解空間分數據和功能兩部分,可以更加清晰地進行需求分析和功能分解,數據流圖能夠細致地說明數據在各個功能模塊之間的流動和變化,更適於系統設計的前期階段。設計人員清楚地了解數據和系統要求的操作后,面向對象方法能夠把數據和功能以對象為單位封裝成一個整體,更直觀地表達對象的狀態變化和對象間的交互,更加准確地分析功能的實現過程,更適於在軟件后期細化系統的具體行為。基於此,設計的混合式軟件開發方法如下:
1) 使用SA進行需求分析,建立數據字典,構建總的和分層的數據流圖。
2) 使用模塊結構圖設計系統的獨立功能塊,做出模塊內的程序流圖。
3) 結合數據流圖,聚合同類模塊,規約類,根據程序流圖,設計類的屬性和類的方法。
4) 使用OOD建立系統的動態模型,分析對象的行為和協作。
5) 總體面向對象程序設計,細節結構化程序設計優化,實現代碼層。
使用混合式方法,我們能夠充分利用兩種方法的優點,揚長避短,提高開發的效果和效率。
無論是結構化方法,還是面向對象方法,都是用來解決日益矛盾的軟件危機的系統方法。從直接開發,到結構化方法,再到面向對象方法,軟件構件的愈發獨立、可重用,開發在一個更高的層次進行,分析層、設計層和代碼層關聯性減少。這些都有利於系統開發員更加關注功能本身,提高軟件質量。硬件性能的提高會使計算機的使用越發廣泛,軟件工作的環境更加復雜,軟件的功能更加豐富,軟件的性能更需提高,對軟件開發方法提出了更多的要求,會涌現更高層次的新的方法。無論使用哪種開發方法,或者是混合哪幾種開發方法,我們都要因地制宜,依據需求分析和系統要求,做出最好的選擇或組合。
參考文獻:
[1] 汪寒昊,謝加勝,邢躍,《軟件開發方法——結構化方法與面向對象方法比較》,綿陽師范學院數學與計算機科學學院,,2011,第13期。
[2] 張莉,《結構化方法與面向對象方法的比較分析》,陝西師范大學計算機科學學院,陝西師范大學學報(自然科學版),第29卷,第2期,2001.6。
[3] 許秀林,《結構化方法與面向對象方法思想辨析》,南通職業大學,南通職業大學學報,第18卷,第4期,2004.12。