軟件開發方法指,在項目投資規模和時間限制內,設計、實現符合用戶需求的高質量軟件,根據軟件開發的特色,提出的多種軟件開發的策略。隨着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開發成爲熱點。面向對象方法已經成爲軟件開發方法的中堅力量。工具
結構化方法和麪型對象方法的起源和發展具備模式一致性:性能
圖一:軟件開發方法發展模式優化
(二)從思想上看this
結構化方法承襲告終構化程序設計的思想,把待解決的問題看做一個系統,用系統科學的思想方法來分析和解決問題。結構化方法遵循抽象原則、分解原則和模塊化原則;以數據和功能爲中心;以模塊爲基本單位;以算法爲程序核心;強調逐步求精和信息隱藏。spa
面向對象方法的思想是模擬了客觀世界的事物以及事物之間的聯繫。面向對象以類取代模塊爲基本單位;經過封裝、繼承和多態的機制,表徵對象的數據和功能、聯繫和通訊;經過對對象的管理和對象間的通信完成信息處理與信息管理的計算和存儲,實現軟件功能。設計
對於結構化方法,模塊由函數實現,完成對輸入數據的加工和計算,數據和功能是分離的;而面向對象把數據和功能封裝在對象中,造成一個總體。兩種方法在數據和功能上的不一樣處理是其思想上的本質差異。
圖二:結構化思想和麪向對象思想
(三)從分析上看
創建模型是爲了更好地理解要模擬的現實世界,是軟件開發方法的核心問題。在結構化方法中,使用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。