結構化方法與面向對象方法之比較

引言算法

  所謂軟件開發方法,就是爲了知足在有限的項目投資、開發時間內,儘量地設計、實現出符合用戶要求且高質量的軟件而提出的開發策略,根據這些策略將整個軟件開發過程變得更加科學化、系統化。固然,在軟件開發領域存在各類各樣的系統分析和設計方法,但其中結構化方法與面向對象方法是軟件開發程序設計中的兩個核心思想。數據庫

  結構化方法起源於20世紀60年代對於GOTO語句的爭論和認識,通過幾十年的研究及應用,最爲成熟且影響最大,而面向對象方法近10年來發展較快,被普遍應用於計算機軟件的各個領域。編程

  結構化方法的核心思想是自頂向下(逐步求精)和模塊化設計(結構化編碼),從原問題出發不斷拆分、不斷簡化,最終將問題劃分紅相對獨立的多個小問題,以後再以模塊化的形式進行編程;而面向對象方法則以對象爲中心,將問題中涉及到的各項事務抽象分解爲多個對象,問題便存在於對象之間的交互、關聯中,藉由對象的行爲進行表現。數據結構

結構化方法架構

概述框架

  結構化方法(SD方法)是一種成熟、傳統的軟件開發方法。它的組成部分有結構化分析(SA)、結構化設計(SD)和結構化程序設計(SP),分別對應軟件生命週期的分析、設計和編碼階段。基本思想爲把一個複雜問題的求解過程分階段進行,並且這種分解是自頂向下,逐層分解,使得每一個階段處理的問題都控制在人們容易理解和處理的範圍內。模塊化

  這裏借用一張經典的圖來表示自頂向下分解的過程:函數

 

圖1 自頂向下分解示例圖工具

 

結構化分析性能

  結構化分析的基本思想是「分解」和「抽象」,並最終用數據流圖、 數據字典、 斷定表、斷定樹等圖形來對分解、抽象的結果加以表達。下面介紹其中最爲的三種——數據流圖、數據字典和結構圖。

數據流圖(DFD

  數據流圖(Data Flow Diagram,簡稱DFD)是一種常見的描述系統中數據流程的圖形工具,以圖形方式來表達系統的邏輯功能、數據在系統內部的邏輯流向和邏輯變換過程。

  數據流程圖中有如下幾種主要元素:

  →:數據流。數據流是數據在系統內傳播的路徑,所以由一組成分固定的數據組成。如訂票單由旅客姓名、年齡、單位、身份證號、日期、目的地等數據項組成。因爲數據流是流動中的數據,因此必須有流向,除了與數據存儲之間的數據流不用命名外,數據流應該用名詞或名詞短語命名。

  □:數據源(終點)。表明系統以外的實體,能夠是人、物或其餘軟件系統。

  ○:對數據的加工(處理)。加工是對數據進行處理的單元,它接收必定的數據輸入,對其進行處理,併產生輸出。

  〓:數據存儲。表示信息的靜態存儲,能夠表明文件、文件的一部分、數據庫的元素等。

  同時出於結構化、模塊化的要求,數據流圖也應該以分層的形式來繪製。其繪製方法爲:一、肯定系統的輸入輸出;二、由外向裏畫系統的頂層數據流圖;三、自頂向下逐層分解,繪出分層數據流圖。

  下圖是一張典型的數據流圖的示例:

圖2 數據流圖示例

數據字典(DD

  數據字典(Data Dictionary,簡稱DD)是指對數據的數據項、數據結構、數據流、數據存儲、處理邏輯、外部實體等進行定義和描述,其目的是對數據流程圖中的各個元素作出詳細的說明。

  上述分層數據流圖只是表達了系統的「分解」,爲了完整地描述這個系統,還需藉助數據詞典對圖中的每一個數據和加工給出解釋。

 

  圖3 數據字典示例圖

  經過這幾種表述工具,咱們能夠將分析步驟概括以下:

  ①分析當前的狀況,作出反映當前物理模型的數據流圖(DFD);

  ②推導出等價的邏輯模型的數據流圖(DFD);

  ③設計新的邏輯系統,生成 數據字典和基元描述;

  ④創建人機接口,提出可供選擇的目標系統物理模型的DFD;

  ⑤肯定各類方案的成本和風險等級,據此對各類方案進行分析;

  ⑥選擇一種方案;

  ⑦創建完整的需求規約。

結構化設計

  結構化分析完成了軟件開發週期中的(需求)分析部分,知道了在軟件開發階段應該作些什麼。接着就應該是結構化設計(SD)來對整個軟件項目進行設計,描述整個系統的設計思路和框架,瞭解如何進行軟件的開發。

  結構化設計的重要目的就是將軟件項目模塊化,於是咱們有必要先介紹一下模塊結構圖。

結構圖(SC

  結構圖是一個將系統拆解爲最小可管理程序單位的圖。在結構化設計中,結構圖能夠將程序模塊整理爲樹狀結構,每個模塊以一個其中有模塊名稱的方框表示,樹狀結構能夠清楚表示各模塊之間的關係。

  結構化分析中經常使用結構圖表示程序的頂層架構。結構圖有助於程序設計者用個個擊破的方式處理軟件問題,也就是將一直將問題拆解爲更小的問題,直到最後問題小到能夠被人類理解爲止。此程序稱爲由上到下設計或是功能分解。結構圖的做用相似建築房屋中使用的藍圖。在設計階段,結構圖是客戶和不一樣軟件工程師溝通的方式。在代碼實現的階段,由結構圖能夠得知系統的完整架構。

 

 

  圖4 結構圖示例

  結構化設計的基本思想就是根據結構化分析方法獲得的數據流圖(DFD)創建結構圖(SC),從而達到儘量用程序結構反映須要解決問題的結構的目的。固然,此時獲得的結構圖還只是初步的結構圖,還須要根據結構化設計的基本原則和有關啓發規則,對結構圖進行進一步的優化。

結構化程序設計

  結構化程序設計(structured programming,簡稱SP)由結構化設計獲得的結構圖劃分功能模塊,自頂向下分解任務,並將其分配相應的開發人員,開發過程當中通常要求僅利用順序、選擇、循環三種基本結構。經過這樣的方式,開發人員不須要考慮軟件項目的整體,而僅僅須要分析本身開發的部分,這樣有利於對單元模塊進行詳細的測試,也能很好地保證軟件的開發質量。

面向對象方法

  面向對象的出發點是儘量模擬人類的思惟方式,將軟件開發過程變得更加接近人類認識世界、解決問題的過程。爲了達到這一點,面向對象方法經過引入對象、類、封裝、繼承、多態等概念來支撐其開發方法,打破了傳統的代碼、數據分離作法,而是將一種數據結構和操做該數據結構的方法捆在一塊兒, 封裝在一個程序內,實現了數據封裝和信息隱藏,經過「 操做」做爲接口實現信息傳遞。對外部來講,只知道「 它是作什麼的」,而不知道「 它是如何作的」,使得數據封裝、 信息隱藏、 抽象代碼共享等軟件工程思想獲得充分體現。

  面向對象方法(Object-Oriented)包括面向對象分析(OOA)、面向對象設計(OOD)和麪向對象程序設計(OOP)三個部分。

面向對象分析(OOA

  面向對象分析時面向對象方法的第一個環節,這一環節的任務是將問題和對項目的理解,抽象成規範的對象和消息傳遞,從而創建起整個面向對象軟件開發的基礎。通常這一部分對於新手來講是較難的,由於要適應相應思惟的轉變。上個學期OO課程的開頭部分,你們應該可以感覺到,很難正確地對問題中的對象進行準確劃分,可是在適應這類思惟方式以後,在處理其餘問題時很能很容易對問題進行抽象。

  總的來講,OOA創建在封裝、抽象、多態這三個概念之上。

  封裝

  面向對象方法中,經過封裝機制將數據和相應的操做捆綁到了一塊兒,以造成一個完整的、具備屬性(數據)和行爲(操做)的數據類型。這就實現了從數據和操做兩個方面來描述某個事物,更加符合人們描述某個事物的思惟習慣,所以也更加容易理解和實現。

  繼承

  繼承可讓某個類型得到另外一個類型的屬性(成員變量)和行爲(成員函數)的簡單方法。繼承就如同現實世界中的進化同樣,繼承獲得的子類型,既能夠擁有父類型的屬性和行爲,又能夠新增長子類型所特有的屬性和行爲。這樣大大提升了開發的效率,這是傳統面向過程開發所難以實現的。

  多態

  多態是繼承的直接結果。可是雖然繼承了父類型的屬性和行爲,不一樣的對象間有着差別,有不一樣的操做,因此面向對象方法經過給出接口調用不一樣類的「同一行爲」實現了對象的多態。

  有了上述的三者,OOA則經過五個層次(主題層、對象層、結構層、屬性層和服務層)上的抽象,完成對問題的完整分析,最終獲得問題的抽象結構。

面向對象設計(OOD

  OOA 和 OOD 採用一致的概念、 原則和表示方法,兩者之間不存在鴻溝,不像上面所述的結構化方法,從OOA到OOD不須要從分析文檔到設計文檔的轉換。它們之間沒有明顯的邊界,甚至可能有必定程度的交集。

  其中二者的區別主要是:OOA 與系統的問題域更加相關,OOD 與系統的實現更加密切;OOD 是對 OOA 所得出的對象模型的直接細化和抽象,獲得可直接實現的類圖。

  經過OOA的初步分析咱們獲得了:問題 = 對象 + 類 + 繼承 + 消息傳遞,而OOD則進一步過渡,對OOA分析的結果做進一步的規範化整理,以便可以被OOP直接接受。

面向對象程序設計(OOP

  OOP是近幾年來最爲流行的開發方式之一,而且在實際應用中展示了巨大的威力。

  OOP 達到了軟件工程的三個主要目標:重用性、靈活性和擴展性。經過接口的設計,實現了總體運算,每一個對象都可以接收信息、處理數據和向其它對象發送信息。OOP 主要有如下主要的概念:

  組件:數據和功能一塊兒在運行着的計算機程序中造成的單元,組件在 OOP 計算機程序中是模塊和結構化的基礎。

  抽象:程序有能力忽略正在處理中信息的某些方面,即對信息主要方面關注的能力。

  封裝:確保組件不會以不可預期的方式改變其它組件的內部狀態;只有在那些提供了內部狀態改變方法的組件中,才能夠訪問其內部狀態。每類組件都提供了一個與其它組件聯繫的接口,並規定了其它組件進行調用的方法。

  多態:組件的引用和類集會涉及到其它許多不一樣類型的組件,並且引用組件所產生的結果得依據實際調用的類型。

  繼承:容許在現存的組件基礎上建立子類組件,這統一併加強了多態性和封裝性。典型地來講就是用類來對組件進行分組,並且還能夠定義新類爲現存的類的擴展,這樣就能夠將類組織成樹形或網狀結構,這體現了動做的通用性。

  以上的四個概念側重於系統實現的角度,和OOA段的概念闡述並不徹底一致。

面向對象方法和結構化方法的比較

  首先,面向對象方法較之與傳統的結構化方法有其獨到之處:

  1) 可重用性。可重用性是面向對象軟件開發的一個核心思路。經過類的繼承關係,使公共的特性可以共享,簡化了對象、類的建立工做量,增長了代碼的可重性。另外,重用通過測試的代碼還可使產生額外錯誤的可能性達到最小。

  2) 可擴展性。可擴展性是對現代應用軟件提出的又一個重要要求。類的繼承性使類能反映現實世界的層次結構,多態性反映了現實世界的複雜多樣。類的繼承性和多態性使軟件編碼具備良好的可重用性和可擴展性。無需修改源代碼就可使軟件功能容易擴充和修改。

  3) 數據保護。數據和操做數據的算法再也不分離,它們被封裝在一塊兒,對象內部的行爲實現細節被隱藏。封裝防止了程序相互依賴性而帶來的變更影響。

  4) 可管理性。面向對象的開發方法採用類做爲構建系統的部件,以對象做爲系統的基本組成單元,使整個項目的組織更加合理、方便,由於概括事物、 劃分類進行管理符合人們在認識和管理客觀世界的習慣思惟方式。

  然而面向對象方法和結構化方法相比也存在一些弊端:

  1) 上手慢。新手在接觸到面向對象方法時,每每很難準確的將問題分解爲多個類之間的聯繫。並且即便通過一段時間的訓練,對於一些比較複雜的問題也很難作到經過類和類之間的信息傳遞來準確描述。

  2) 認識差別。對於一個相同的問題,很難有一個肯定性的劃分,因此就會出現不一樣的設計人員對於類、類之間的聯繫的理解不一致,而這種不一致很難經過統一的方式表達出來,這就可能會致使後期面向對象程序設計OOP過程當中出現分歧。

  3) 編程便捷性。在編寫程序方面,結構化方法有着比較強的優點,它思路清晰,條理嚴謹,步驟整潔,便於閱讀理解。這一點也正是不少企業開發項目時首先經過面向對象方法進行分析設計,以後經過模塊化、結構化的方式進行軟件開發的緣由。

總結

  程序設計方法的發展經歷了四代,而通過幾十年的更迭,結構化方法和麪向對象方法成爲當代軟件工程的程序設計方法中最本質的兩種思想方法,足以體現優越性。

  結構化方法體現了抽象思惟和複雜問題求解的基本原則,面向對象則深入反映了客觀世界由對象組成這一本質特色。各類程序設計方法的一個重要區別在於問題分解的出發點不一樣(因子),思惟模式不一樣。計算機中數據結構和過程是密切相關的,結構化方法將數據結構和過程分開考慮,面向對象的方法組合數據和過程於對象之中。理論上,對象式方法將產生更好的模塊內聚和耦合特性,使得軟件更易於重用與維護,但在實踐中程序設計方法須要工具和環境的支撐,須要考慮軟件生命週期的各個環節,在選擇程序設計方法時,須要綜合考慮這些因素,適當選用其中一種或者是綜合使用。

  最後借用一句俏皮話來描述二者之間的差異:結構化方法是編年體;面向對象方法是紀傳體。

 

參考資料:

[1] Wikipedia,結構化方法、面向對象方法

[2] Baidu Baike,結構化方法、面向對象方法

[3] 符於江. 程序設計中結構化方法和麪向對象方法的比較[A]. 海南: 電腦知識與技術,2008

[4] 汪寒昊. 軟件開發方法_結構化方法與面向對象方法比較[A]. 四川: 科技信息,2011

相關文章
相關標籤/搜索