---恢復內容開始---
結構化和面向對象之應用比較
在無數程序設計人員的不斷實踐和理論改進中,軟件工程程序設計中極其重要的指導性思路一直在發生着變革。在相對較長的時間里,不斷有新的軟件工程中的程序設計思路涌現,其中在生產實踐中得到了十分廣泛的應用的,當屬結構化和面向對象的方法。
結構化程序設計在結構上將軟件系統划分為若干功能模塊或實體,分別采用模塊化程序設計語言編程實現,再由各模塊聯結,組合成相應結構的軟件系統。
而在面向對象的程序設計中,所謂對象是指具有一定結構、屬性和功能的實體,采用對象和對象類,以及對象之間的相互通信的消息,描述客觀世界中的各種事物及其相互關系,建立面向對象和消息的具有層次結構的世界模型。
1. 結構化程序設計
1.1. 概念綜述
所謂結構化設計(structured design, SD),主要屬於一種面向數據流或面向過程的設計方式,可以與結構化分析(structured analysis, SA)方法,結構化程序設計方法前后呼應,形成統一完整的系列化方法。具體來看,結構化設計是基於模塊化、自頂而下細化、結構化程序設計等基礎的一種設計方法,其最為基礎的思想是把系統設計成為功能單一、相對獨立的模塊組成結構。
在結構化軟件設計過程中,從技術角度來看,程序的設計過程中主要包括數據設計、接口設計、體系結構設計以及過程設計等工作。其中數據設計主要是將實體關系轉化為文件系統結構以及數據庫表結構。至於體系結構設計主要是對軟件模塊之間的關系進行定義。而接口設計則是以數據流圖對系統內部中的各種關系及交互機制進行定義。最后,過程設計則是對軟件各組成部分的算法以及內部數據結構確定下來,並采取某種形式對算法進行描述。
1.2 建模技術
1.2.1數據流及數據流圖
數據流圖(data flow diagram, DFD)產生於需求分析階段。DFD中從系統的輸入數據流到系統的輸出數據流的一連串連續變換形成了一條信息流。根據數據流類型的不同,可分為變換型和事物型兩大類。
變換型數據流中,信息沿着輸入通路進入系統,同時由外部形式變換成內部形式進入系統的信息,通過變換中心經加工處理,以后再沿着輸出通路變換成外部形式離開系統。變換型數據流的DFD可明顯地分為三大部分:邏輯輸入、變換中心(主加工)、邏輯輸出。變換型數據流結構。

在事物型數據流模型中,信息在沿着輸入通路進入系統,由外部形成內部形式后到達事務中心。通常事務中心位於幾條處理路徑的起點,從數據流程圖上很容易標識出來,因為事務處理中心一般會有“發射中心”的特征。因為事務流有明顯的事務中心,所以各式各樣活動流都以事務中心為起點呈輻射狀流出。
而數據流圖是結構化系統分析的基本工具。一個數據流圖確定了系統的轉化過程、系統所操縱的數據或物質的收集(存儲),還有過程、存儲、外部世界之間的數據流或物質流。從我們畫了那么多數據流圖來理解,數據流圖就是用圖形化的方法顯示整個現實世界中實際存在的數據流向轉化為圖表的形式,並最終轉化為表,轉化為計算機能夠接受的形式,所以數據流圖是我們做需求分析過程中必不可少的,通過對數據流圖的理解,我們會對項目的整個過程有一個深刻的理解
1.2.2結構圖
SD方法采用了結構圖來描述程序的結構。需求分析階段用SA產生的數據流圖通過結構化設計可以被方便地轉換為軟件結構圖。

結構圖主要描述軟件結構中模塊之間的調用關系和信息傳遞問題。基本成分有模塊、調用和數據。在通常情況下會在結構圖中用箭頭注釋表示模塊在調用過程中信息的來回傳遞。
1.2.3 數據字典
數據字典是結構化的核心。一個定義應用程序中使用的所有數據元素和結構的含義、類型、數據大小、格式、度量單位、精度以及允許取值范圍的共享倉庫。數據字典的維護獨立於軟件需求規格說明,並且在產品的開發和維護的任何階段,各個風險承擔者都可以訪問數據字典。它定義了原數據元素、組成結構體的復雜數據元素、重復的數據項、一個數據項的枚舉值以及可選的數據項。
1.2.4 E-R圖
ER圖(ERD)是為了把用戶的數據要求清楚准確地描述起來而建立的一個概念性的數據模型。其中主要有以下幾個要素:用矩形表示的實體型,矩形框內寫明實體名;用橢圓形或圓角矩形表示的屬性,用無向邊將其與相應的實體連接起來,多值屬性由雙線連接,主屬性名稱下加下划線;用菱形表示的聯系,菱形框內寫明聯系名,並用無向邊分別與有關實體連接起來,同時在無向邊旁標上聯系的類型。
1.2.5 狀態轉換圖
通過描繪系統的狀態及引起系統狀態轉換的事件,來表示系統的行為.此外狀態轉換圖還指明了作為特定事件的結果系統將做那些動作(例如,處理數據).因此狀態轉換圖提供了行為建模機制
在狀態轉換圖中,每一個節點代表一個狀態,其中雙圈是終結狀態。
1.3 結構化設計的流程
第一,對數據流圖進行研究、分析及市查,這主要可以幫助我們從軟件需求規格說明中掌握數據流加工過程。
第二,以數據流圖為依據對數據處理的類型進行確定,需要注意,針對事物型以及變換型,設計人員要注意對其進行分別分析和處理。
第三,通過數據流圖對系統初始結構圖進行推導。
第四,采取啟發式原則對系統初始結構圖進行改進,直到結構圖滿足我們的要求為止。
第五,利用數據字典以及分析模型E-R圖對數據進行設計,包括數據文件的設計和數據庫的設計。
第六,以狀態轉換圖、加工規格說明為依據,進行過程設計。
1.4 結構化設計的優缺點
優點:結構化方法是強調開發方法的結構合理性以及所開發軟件的結構合理性的軟件開發方法。結構化方法的本質是功能分解,從代表目標系統整體功能的單個處理着手,自頂向下不斷地把復雜的處理分解為子處理,這樣一層一層地分解下去,直到僅剩下的若干個容易實現的子處理為止。當所分解的子處理十分簡單時,就可寫出各個最低層處理的處理描述。
缺點:首先,結構化方法是圍繞實現處理功能的過程來構造系統的,然而,用戶需求的變化大部分是針對功能的,因此,用結構化方法設計出的系統結構常常是不穩定的。其次,結構化方法定義了目標系統的邊界,且開出發的系統結構依賴於對系統邊界的定義,因此,很難把系統擴展到新的邊界,系統較難修改和擴充。再者,結構化方法設計系統時,幾乎每開發一個新的軟件系統,都要針對具體系統作大量重復和繁瑣的工作,思維成果的可重性差。
2. 面向對象程序設計
2.1 概念綜述
面向對象技術自八十年代初問世以來,由於它的模塊性、封裝性、繼承性、多態性和動態束定能滿足軟件工程要求的局部化、易維護、可重用、易擴充以及當今多媒體和分布式計算的諸多要求,一時成為計算機各領域爭相采用的新技術焦點。所謂對象是指具有一定結構、屬性和功能的實體,采用對象和對象類,以及對象之間的相互通信的消息,描述客觀世界中的各種事物及其相互關系,建立面向對象和消息的具有層次結構的世界模型。面向對象的程序設計方法基於上述面向對象世界模型。

2.2 面向對象分析(OOA)
OOA強調直接針對問題域中客觀存在的各項事物設立OOA模型中的對象。用對象的屬性和方法分別描述事物的靜態特征和行為。問題域有哪些值得考慮的事物,OOA模型中就有哪些對象。而且對象及其方法的命名都強調與客觀事物一致。另外,OOA模型也保留了問題域中事物之間關系的原貌。這包括:把具有相同屬性和相同方法的對象歸結為類;用一般----特殊結構(又稱分類結構)描述一般類與特殊類之間的關系(即繼承關系);用整體一部分結構(又稱組裝結構)描述事物間的組成關系;用事例連接和消息連接表示事件之間的靜態聯系(一個對象的屬性與另一個對象有關)和動態聯系(一個對象的行為和另一個對象行為有關)。可以看到,無論是對問題域中的單個事物,還是對各個事物之間的關系,OOA模型都保留着它們的原貌,沒有加以轉換、扭曲,也沒有打破原有的界限而重新組合。所以,OOA模型能夠很好地映射問題域。OOA對問題域的觀察、分析和認識是直接的,對問題域的描述也是很直接的。它所采用的概念及術語與問題域中的事物保持了最大程度的一致,不存在語言上的鴻溝。
2.3 面向對象設計(OOD)
OOA與OOD的職責划分是:OOA針對問題域運用OO方法,建立一個反映問題域的OOA模型,不考慮與系統的具體實現有關的因素(例如采用什么編程語言、圖形用戶界面、數據庫等),從而使OOA模型獨立於具體的實現。OOD則是針對系統的一個具體的實現運用OO方法。其中包括兩方面的工作,一是把OOA模型直接搬到OOD(不經過轉換,僅作某些必要的修改和調整),作為OOD的一個部分:另外使針對具體實現中的人機界面、數據存儲、任務管理等因素補充一些與實現有關的部分。這些部分與OOA采用相同的表示方法和模型結構。OOA與OOD采用一致的表示法是面向對象的分析與設計優於傳統的軟件工程方法的重要因素之一。這使得從OOA到OOD不存在轉換,只有局部的修改或調整,並增加幾個與實現有關的獨立部分。因此,OOA與OOD之間不存在傳統方法中分析與設計之間的鴻溝,二者能夠緊密銜接,大大降低了OOA過渡到OOD的難度、工作量和出錯率。
2.4 面向對象編程(OOP)
面向對象編程是面向對象方法從誕生、發展到走向成熟的第一片領地,也是使面向對象的軟件開發最終落實的重要階段。在OOA和OOD理論出現之前,程序員要寫一個好的面向對象的程序,首先要學會運用OO方法來認識問題域,所以OOP被看作一門比較高深的技術。現在,在OOA->OOD->OOP這一軟件工程的過程系列中,OOP的分工比較簡單了:認識問題域以及設計系統成分的工作已經在OOA和OOD階段完成,OOP工作就是用一種面向對象的編程語言把OOD模型中的各個成分書寫出來。
2.5基於UML的軟件分析和設計
系統(用戶)需求。它是問題提出的過程,軟件大體要實現什么功能,有什么參與者。而應用圖所表達的正是參與者(Actor)與軟件應用(Use Case ),應用和系統響應之間的關系。在了解系統需求的過程中,就可以給應用圖添加上相應的Actor與Use Case。在了解系統需求的后期,則可以把不同Actor與Use Case間的關系用相應的連線連接和對連線的定義使之清晰。之后可對Use Case的系統響應進行分析,即把系統執行順序畫出來,這已經進入系統分析階段。
系統分析。在這一階段,需要把軟件的功能細節化,同時考慮數據間的關系(層次),然后建立與之對應的對象,接着分析對象間的關系(即軟件結構)並定義對象的屬性和方法。常用的分析方法有流程圖、泡泡圖和由上到下分析法等,但每種方法只能反映系統的某一個方而,把它們綜合起來,即是UML的分析方法。
代碼編寫。這一過程是把抽象的軟件模型轉變為具體的代碼。使用基於UML的CASE工具建立了相應的模型,或者說建立起一個多視角的相關數據庫系統(RDMS)之后,則可使用軟件直接產生基於此模型的對應代碼框架。至此一個具有清晰結構的軟件系統就已經有了雛形,往后的階段只需要把某一種具體代碼往框架里填充。
代碼的維護和擴展。面向對象的程序設計出來的方法,主要目的就是為了讓程序更容易維護、擴展。為了改動和添加代碼,一般情況下就得通讀源代碼和注釋,然后才明白程序的結構和完成的功能,進而修改。但對於UML設計出來的軟件,先看其模型中不同視角的圖表就可以把軟件結構清晰的表達出來了。同時在建立模型時所寫的文檔,也會加入源代碼中。另外,有的CASE工具還提供COM接口,通過編程對建立的模型進行分析,輸出相應的報表、文檔。以上3點都說明了用UML建立模型更利於軟件的維護和擴展。
2.6 優越性和局限性
優越性:采用面向對象思想設計的結構,可讀性高,由於繼承的存在,即使改變需求,那么維護也只是在局部模塊,所以維護起來是非常方便和較低成本的。在設計時,可重用現有的,在以前的項目的領域中已被測試過的類使系統滿足業務需求並具有較高的質量。在軟件開發時效率較高,能夠根據設計的需要對現實世界的事物進行抽象、產生類。使用這樣的方法解決問題,接近於日常生活和自然的思考方式,勢必提高軟件開發的效率和質量。由於繼承、封裝、多態的特性,自然設計出高內聚、低耦合的系統結構,使得系統更靈活、更容易擴展,而且成本較低。
局限性: 需要一定的軟件支持環境;不太適宜大型的MIS開發,若缺乏整體系統設計划分,易造成系統結構不合理、各部分關系失調等問題;只能在現有業務基礎上進行分類整理,不能從科學管理角度進行理順和優化;初學者不易接受、難學。
3. 結構化和面向對象設計的對比
結構化方法首先關心的是功能,強調以模塊(即過程)為中心,采用模塊化、自頂向下、逐步求精設計過程,系統是實現模塊功能的函數和過程的集合,結構清晰、可讀性好,的確是提高軟件開發質量的一種有效手段。每個模塊有可能保持較強的獨立性,但它往往與數據庫結構相獨立,功能模塊與數據庫邏輯模式間沒有映射關系,程序與數據結構很難封裝在一起。如果問題世界的功能比數據更復雜或者更重要,那么結構化方法仍應是首選的方法。
如果數據結構復雜,模塊獨立性很難保證。面向對象方法抽象的系統結構往往並不比結構化方法產生的系統結構簡單,但它能映射到數據庫結構中,很容易實現程序與數據結構的封裝。結構化設計從系統的功能入手,按照工程標准和嚴格規范將系統分解為若干功能模塊。然而,由於用戶的需求和軟、硬件技術的不斷發展變化,作為系統基本成分的功能模塊很容易受到影響,局部修改甚至會引起系統的根本性變化。開發過程前期入手快而后期頻繁改動的現象比較常見。面向對象方法則從所處理的數據入手,以數據為中心來描述系統,數據相對於功能而言,具有更強的穩定性,這樣設計出的系統模型往往能較好地映射問題域模型。對象、類、繼承性、多態性、動態定連概念和設施的引入使用,顯然令面向對象的設計方法具有一定的優勢,能為生產可重用的軟件構件和解決軟件的復雜性問題提供一條有效的途徑。
面向對象的設計過程就是指通過建立一些類以及它們之間的關系來解決實際問題,這就需要對問題域中的對象作整體分析,類及類間關系的設計要求較高,否則設計出的並不是真正意義上的面向對象的軟件系統,而只是一些類的堆砌而已,不能體現出面向對象設計方法的優勢之處。
面向對象方法的優點並不是減少開發時間,初次使用這種技術軟件,可能比結構化方法開發時間更長,開發人員必須花很大精力去分析對象是什么,每個對象應該承擔什么責任,所有這些對象怎樣很好地合作以完成預定的目標。這樣做換來的好處是,提高了目標系統的可重用性,減少了生命周期后續階段的工作量和可能犯的錯誤,提高了軟件的可維護性。
4. 總結
無論是以模塊為核心的結構化還是以對象之間關系的面向對象軟件工程設計思路,都是基於實踐,總結出來的科學的程序設計方法。在現實的程序設計開發的過程中,開發者必須結合項目本身的特征,以及自己的實際開發經驗,選擇最適合的設計和開發方法。
5. 參考文獻
[1] 劉薇.關於軟件工程之中的結構化設計方法探究[A].2013
[2] 蔡偉淦.軟件工程中的結構化設計方法[A].2011
[3] 霍迎旦.軟件工程中結構化方法和面向對象方法之比較[A].2007
[4] 張京,李成大.結構化軟件工程方法與面向對象軟件工程方法的比較[A].2000
[5] 邸劍,李新葉,宋雨.面向對象軟件工程分析方法[A].2002
[6] 張秋. 結構化程序設計及判別 [A].1997
[7]王德軍,郝永芳.結構化程序設計方法與面向對象的程序設計方法的比較 [A]. 2003
[8]張耀民.軟件工程中的結構化設計方法[A]. 2012
[7] http://blog.csdn.net/lxd8731247769/article/details/47101589
[8] http://blog.sina.com.cn/s/blog_71e00b8801010msv.html
[9] http://blog.csdn.net/zhoukun1008/article/details/40450627
---恢復內容結束---
