http://www.cnblogs.com/hy13211114/p/6193593.html 軟體工程之結構化方法與面向對象方法之比較與結合 軟體開發方法指,在項目投資規模和時間限制內,設計、實現符合用戶需求的高質量軟體,根據軟體開發的特點,提出的多種軟體開發的策略。隨著20世紀60年代,電腦 ...
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]。
從設計方面,我們可以比較明顯地看出結構化和麵向對象的區別。結構化方法的核心是程式,從分析到設計,其實是從抽象到具體,從模糊到清晰地實現程式的過程;而面向對象方法的核心是功能,分析的是對象,設計的是行為,程式設計和系統設計相對分離。
圖六:模塊結構圖
圖七:交互圖 圖八:狀態圖 圖九:活動圖
(五)從程式設計上看
以例子進行說明(銀行存取款):
![複製代碼](http://common.cnblogs.com/images/copycode.gif)
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);
}
![複製代碼](http://common.cnblogs.com/images/copycode.gif)
結構化程式設計
![複製代碼](http://common.cnblogs.com/images/copycode.gif)
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;
}
}
![複製代碼](http://common.cnblogs.com/images/copycode.gif)
面向對象程式設計
從上例可見,結構化程式設計是一種過程式的“解題”的方式,程式關註且只關註對於輸入數據,輸出正確的結果,代碼是演算法的直接體現,代碼效率高;面型對象程式設計是整體式的“建模”的方式,程式關註現實客體,而非某些數據,代碼是功能的直接體現,複雜的演算法往往是一兩行庫函數處理,代碼效率低。
(六)從擴展重用上看
結構化方法是面向整體應用進行的分析、設計,程式設計也是過程式的針對固定的輸入域,代碼定向性明顯。所以,結構化方法的可擴展性較差,功能的變化可能危及整個系統;重用性不好,若系統間存在嵌套關係,主系統可重用子系統;較難以組合拼接,系統的設計實現是緊耦合的,連接往往是有縫的。
相反,面向對象方法雖然基於應用,但面向現實客體,對象之間獨立性較強,功能是對象的交互。所以,面向對象的可擴展性較強,只需擴展或修改某個類,或調整某種通訊;重用性好,面向對象的繼承和多態機制大大提高了代碼重用的層次和粒度;易於組合拼接,對象是數據和功能的最小單位,為對象建立新的通信的聯繫,就能夠組合出新的軟體系統。
(七)從應用上看
結構化方法的實質是問題求解,結構化程式是由演算法決定的,演算法是程式員分析設計的,程式的執行過程主要是由程式員控制,而不是由用戶控制;面向對象方法中,程式員設計的是對象屬性及操作方法,但在什麼時間、使用什麼方式操作對象則是完全由用戶交互控制。
結構化方法的建模工具難以表達交互性強的軟體系統,程式設計融入系統的分析和設計中,處理大型系統時會過於複雜,甚至很難控制;面向對象方法的抽象機制提供了自然的建模方法,特別是能很好地把握對象之間複雜的相互關係。
結構化方法比較適合工程計算、實時數據的跟蹤處理、各種自動控制系統等等; 面向對象分析更加適用於複雜的、由用戶控製程序執行過程的應用軟體,比如大型游戲軟體以及各類管理信息系統軟體[3]。
(八)二者之結合
經過上述分析,我們可知結構化方法和麵向對象方法對於不同的軟體系統各有優劣。結構化方法把解空間分數據和功能兩部分,可以更加清晰地進行需求分析和功能分解,數據流圖能夠細緻地說明數據在各個功能模塊之間的流動和變化,更適於系統設計的前期階段。設計人員清楚地瞭解數據和系統要求的操作後,面向對象方法能夠把數據和功能以對象為單位封裝成一個整體,更直觀地表達對象的狀態變化和對象間的交互,更加準確地分析功能的實現過程,更適於在軟體後期細化系統的具體行為。基於此,設計的混合式軟體開發方法如下:
1) 使用SA進行需求分析,建立數據字典,構建總的和分層的數據流圖。
2) 使用模塊結構圖設計系統的獨立功能塊,做出模塊內的程式流圖。
3) 結合數據流圖,聚合同類模塊,規約類,根據程式流圖,設計類的屬性和類的方法。
4) 使用OOD建立系統的動態模型,分析對象的行為和協作。
5) 總體面向對象程式設計,細節結構化程式設計優化,實現代碼層。
使用混合式方法,我們能夠充分利用兩種方法的優點,揚長避短,提高開發的效果和效率。
無論是結構化方法,還是面向對象方法,都是用來解決日益矛盾的軟體危機的系統方法。從直接開發,到結構化方法,再到面向對象方法,軟體構件的愈發獨立、可重用,開發在一個更高的層次進行,分析層、設計層和代碼層關聯性減少。這些都有利於系統開發員更加關註功能本身,提高軟體質量。硬體性能的提高會使電腦的使用越發廣泛,軟體工作的環境更加複雜,軟體的功能更加豐富,軟體的性能更需提高,對軟體開發方法提出了更多的要求,會涌現更高層次的新的方法。無論使用哪種開發方法,或者是混合哪幾種開發方法,我們都要因地制宜,依據需求分析和系統要求,做出最好的選擇或組合。
參考文獻:
[1] 汪寒昊,謝加勝,邢躍,《軟體開發方法——結構化方法與面向對象方法比較》,綿陽師範學院數學與電腦科學學院,,2011,第13期。
[2] 張莉,《結構化方法與面向對象方法的比較分析》,陝西師範大學電腦科學學院,陝西師範大學學報(自然科學版),第29捲,第2期,2001.6。
[3] 許秀林,《結構化方法與面向對象方法思想辨析》,南通職業大學,南通職業大學學報,第18捲,第4期,2004.12。