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


目錄:


<1>結構化方法介紹


<2>面向對象方法介紹


<3>從結構化到面向對象


<4>結構化和面向對象的優缺點比較


<5>在實例中比較結構化和面向對象


<6>參考文獻

<1>結構化方法介紹

    什么是結構化方法呢?對比於簡單的測試和使用跳轉語句的程序(為跳躍去聲明往往會形成“面條代碼”,使得程序難以維護和加工),結構化方法是一種范式,通過廣泛的使用子程序,塊結構,for和while循環語句,改善程序的清晰度,質量和減少開發時間【1】

   在這種方法下,所有的程序都可以看作是控制結構。使用“序列”,“選擇”,“迭代”,“遞歸”控制結構就可以完成一個完整程序的編寫。

                  【圖1】

 

當我們使用結構化方法進行編程的時候,與以前的非結構化相比有哪些區別呢?我們以C/C++為例。
條件語句

//結構化方法 int flag; if(flag==1){   flag=0; } else{   flag=1; } //使用goto語句: int flag; if(flag==1)    goto label1; else    goto label2; label1: flag=0; goto label3; label2: flag=1; goto label3; label3: //continue to do

循環語句

//機構化方法
int
array[max_size]; for(int i=0;i<10;++i){   if(i==5){     array[5]=1234;   break;   } } //使用goto語句 int array[max_size]; for(int i=0;i<10;++i){   if(i==5){     goto label1;   } } label1:array[5]=1234;

可以看到盡管使用結構化方法在使用的時候,不如使用goto語句跳來跳去的方便。但可讀性大大增強了,如果一個程序中有大量的goto語句,那足以讓看代碼的人崩潰,更不要說維護代碼了。

 經典的結構化代碼示例如下:

bool myCheck1() throw() { bool success = false; try { // do something that may throw exceptions
    if(myCheck2() == false) { throw SomeInternalException(); } // other code similar to the above
    success = true; } catch(...) { // all exceptions caught and logged
 } return success; }

結構化方法的基本要點是:
(1)自頂向下,從頂部開始設計程序。
(2)模塊化設計,程序是由一個一個的功能函數構成。
(3)結構化編碼,程序的每一部分都是控制結構。 以控制結構為基本單位單位,只有一個入口,一個出口(也有可能通過return語句實現多個出口)。從而以函數或者語句塊封裝一個功能。
(4)“獨立功能,單出、入口”的模塊結構,是的一段程序能夠作為單獨的模塊或者插件使用,易於理解,提高程序的復用性,並且降低程序的復雜性,提高了程序的可靠性。程序的主體是子程序層次庫,它通過函數與功能模塊的抽象層次相對應,增強了主體程序的可讀性。
該如何理解這段話呢,我這里舉一個學生上學的例子。

void main(){   /*   *本程序用於計算一個學生的一天的時間點。   *輸出學生完成一件事后的時間點   *   */
  string wakeTime="7:00";//醒來的時間
  string afterPre;//洗漱后的時間
  string afterEat;//吃完早,中,晚飯后的時間
  string arrSchTime;//到達學校的時間
  string afterClass;//上完課的時間
  string arrHomeTime;//到家的時間
  string afterExam;//考完試的時間
  int LongTime=1000000;//活的時間
  bool flag;//出現各種神奇的倒霉事   /*   *流程開始了!!!   */
  for(int i=1;i<=LontTime;++i){     afterPre=prepare("7:00"); //洗漱
    print(aftePre); //輸出洗漱后的時間
    afterEat=eat(aftePre);//吃早飯
    print(aftePre);//輸出吃完飯的時間
    arrSchTime=gotoSchool(afterEat);//去學校
    afterClass=gotoClass(arrTime);//輸出到達學校的時間
    arrHomeTime=backToHome(afterClass);//回家
    print(arrHomeTime);//輸出到家的時間
    afterEat=eat(arrHomeTime);//吃午飯
    print(afterEat);//輸出吃完午飯后的時間
    arrTime=gotoSchool();//去學校
    print(arrTime); //輸出下午到學校的時間
    afterExam=exam(); //考試
    print(afterExam);//輸出考完試的時間
    arrHomeTime=backToHome(afterExam);//回家
    print(arrHomeTime);//輸出到家的時間
    afterEat=eat();//吃完飯
    flag=check();//檢查是否有倒霉的事情發生
    if(flag){       gotoDie();//處理事情
    }     else{       sleep(afterEat);//睡覺
    }   } }

<2>面向對象方法介紹
    什么是面向對象方法呢?是一種把面向對象的思想應用於軟件開發過程中,指導開發活動的系統方法,簡稱OO (Object-Oriented)方法,是建立在“對象”概念基礎上的方法學。對象是由數據和容許的操作組成的封裝體,與客觀實體有直接對應關系,一個對象類定義了具有相似性質的一組對象。總的來說以對象為中心,以類和繼承為構造機制,來認識、理解、刻畫客觀世界和設計、構建相應的軟件系統【2】。         

          面向對象方法強調三個要點 
          (A)封裝性。面向對象方法中,程序和數據是封裝在一起的,對象作為一個實體,其操作隱藏在方法中,其狀態由對象的"屬性"來描述,並且只能通過對象中的"方法"來改變,通過類將對象內部的狀態和外部隔絕開來。封裝性構成了面向對象方法的基礎。面向對象就是"對象+屬性+方法"。
      (B)抽象性。面向對象方法中,把從具有共同性質的實體中抽象出的事物本質特征概念,稱為"類"(Class),對象是類的一個實例。類中封裝了對象共有的屬性和方法,通過實例化一個類創建的對象,自動具有類中規定的屬性和方法,並且可以通過繼承方法獲得父類的屬性和方法。
       (C)對象之間的聯系。對象之間通過信息傳遞,動態的聯系。

還是用上文的學生上學的例子。

public class Student{   //屬性
  string current;   int LongTime=1000000;//活的時間   //方法
  public void eat();   public void exam();   public void backToHome();   public void prepare();   public void gotoClass();   public void gotoSchool();   public void print(); }

<3> 從結構化設計到面向對象程序設計
        傳統的過程化設計方法,以C語言為代表的面向過程程序設計思想,以及模塊化的設計流程已經無法駕馭超大型的軟件系統設計了,並且隨着整個軟件代碼函數的增加,整個工程的復雜度和可維護性也超過了設計人員的想象。必須找到解決這個軟件危機的方法。在《人月神話》這本書中提出了“銀彈”的概念,尋找能夠消滅“軟件危機”這頭怪獸的“銀彈(silver bullet)”。從C到C++,體現了從過程化設計到面向對象設計設計方法的轉化。面向對象程序設計思想通過強調設計與實現的可擴展性和可重復性成功以及良好的封裝性,成為了消滅軟件危機怪獸的“銀彈”。

<4>  結構化和面向對象的優缺點比較

      

(1)程序設計方面:結構化方法以過程化為中心,在上文中舉的學生上學的例子中,可以看到數據是在整個程序中不斷流動的,當前時間作為參數和返回值在模塊之間流動。過程化方法把現實世界描繪為數據在信息系統中的流動,數據不僅在模塊之間流動也會在模塊之間轉化。我們可以通過自頂向下的程序設計將復雜的程序分解為程序模塊的層次圖。

   

    【圖2】

    在面向對象的方法中,數據是在對象間傳遞的,面對象數據模型和處理模型二者合一,將屬性和方法封裝在一個對象當中。並且將信息系統看成是一起工作來完成某項任務的相互作用的對象集合;通過定義系統中所有對象類型並顯示對象之間是如何通過相互作用來完成分析任務。對象之間能通過傳遞消息實現彼此通信,然后數據在對象的內部實現流動和轉化。

  

【圖3】

(2) 在具體工程中的實用性:面向對象在現代的大項目中大放異彩。面向對象方法不再把程序看成工作在數據上的一系列過程或函數的集合,而是把程序看作是相互協作而又彼此獨立的對象的集合。面向對象的設計方法使得整個工程具有以下的四個優點:
(A)工程穩定性好。
(B)代碼復用性好。
(C)較易開發大型軟件產品。
(D)可維護性好。
(E)代碼的封裝性好。
而結構化方法是將系統看成是過程的集合,過程與數據實體之間交互,過程接受輸入並產生輸出(1個入口,1個出口)。這樣也帶來的幾個缺點
(A)代碼的可維護性相對較差。
(B)代碼的復用性相對較差。
(C)不適合大型項目的多人團隊協作。
(D)難以構建合適的測試集。
(3)從構成方面看,結構化軟件是過程和數據的集合,以過程為中心;面向對象軟件是數據和相應操作的封裝,以對象為中心;
(4)從運行控制方面看,結構化軟件采用順序處理方式,由過程驅動控制;面向對象軟件采用交互式、並行處理方式,由消息驅動控制
(5)從概念方面看,結構化軟件是功能的集合,通過模塊以及模塊和模塊之間的分層調用關系實現;面向對象軟件是事物對象的集合,通過對象以及對象和對象之間的通訊聯系實現;
(6)從面向對象方法和結構化方法在軟件設計方面來說,結構化方法的工作重點是設計,面向對象方法的工作重點是分析;在結構化方法中,分析階段和設計階段的表達方式不同,因此在設計階段需要把在分析階段采用的具有網絡特征的數據流圖轉換為具有分層特征的軟件結構圖,也就是在設計階段需要設計出真正能夠對編程有直接幫助的軟件結構圖。而在面向對象方法中設計階段只需要將分析階段的對象的方法和屬性進行具體的細化即可。
(7)建模技術的不同。結構化方法使用DFD建立模型,面向對象通常使用UML建立模型。UML是一種標准的統一語言,使得IT專業人員能夠進行計算機應用程序的建模。UML的主要創始人是Jim Rumbaugh、Ivar Jacobson和Grady Booch,UML使用用例圖建立模型。用例圖描述了系統提供的一個功能單元。用例圖的主要目的是幫助開發團隊以一種可視化的方式理解系統的功能需求,包括基於基本流程的"角色"關系,以及系統內用例之間的關系。

【圖4】

什么是DFD(Data Flow Diagram)呢? 數據流圖是通過一個“數據流”的圖形表示信息系統,建立過程的模型。DFD經常被用來初始創建系統。DFD還可以用於可視化的數據處理(結構化設計)【3】。

一個數據流圖一般由以下幾種圖形構成:

【圖5】

面向對象方法使用UML進行建模,UML通過描述對象之間的關系來描述整個系統【4】,例如下圖

【圖6】

(8)軟件設計的立足點不同。結構化方法注重“面向應用,分解需求”。需要分析當前情況,做出當前物理模型的數據流圖。“細化分析結果,過渡軟件結構”需要將數據流圖進一步細化並映射到軟件模塊結構。面向對象方法注重“立足應用,刻畫問題”,需要確定問題區域,區分類和對象,區分整體和部分。然后在原有的基礎上進一步(A)改進系統分析結果(B)
規范化接口定義(C)設計任務管理,以及系統之間的任務調度(D)確定各個系統之間的資源分配
(9)對現實世界的抽象重點不同。面向對象方法重點進行客觀實體的概念抽象。也用上文的學生上學的例子來說,面向對象方法的重點是抽象學生這個實體,在構建模型階段並不需要關心學生具體干了什么,后續只需要完善細節。而對於結構化方法,則需要將學生具體干了什么抽象為單獨的功能模塊。面向對象方法側重於對客觀實體的概念抽象,不強調具體的過程,強調封裝性和可重用性,而過程化方法強調對整個問題的分解。
(10)適用於開發不同的應用,結構化方法更加適合,較小的功能不太復雜的,工程量較小和數據統計管理軟件的開發【5】,面向對象方法更加適合大型復雜的人機交互軟件的開發。

<5>在實例中比較結構化和面向對象
結構化方法對學生上學的例子的分解結果如下:

【圖7】

面向對象對學生上學的概念抽象如下

【圖8】

  可以從圖例中看出面向對象方法和結構化方法的不同點。

<6>參考文獻及插圖
【1】:來源於wikipedia “Structured programming is a programming paradigm aimed at improving the clarity, quality, and development time of a computer program by making extensive use of subroutines, block structures, for and while loops—in contrast to using simple tests and jumps such as the go to statement which could lead to "spaghetti code" causing difficulty to both follow and maintain.”
【2】:來源於 wikipedia “Object-oriented programming (OOP) is a programming paradigm based on the concept of "objects", which may contain data, in the form of fields, often known as attributes; and code, in the form of procedures, often known as methods. A feature of objects is that an object's procedures can access and often modify the data fields of the object with which they are associated (objects have a notion of "this" or "self"). In OOP, computer programs are designed by making them out of objects that interact with one another.[1][2] There is significant diversity of OOP languages, but the most popular ones are class-based, meaning that objects are instances of classes, which typically also determine their type.”
【 3 】:來源於wikipedia“A data flow diagram (DFD) is a graphical representation of the "flow" of data through an information system, modelling its process aspects. A DFD is often used as a preliminary step to create an overview of the system, which can later be elaborated.[2] DFDs can also be used for the visualization of data processing (structured design).”
【 3 】: 《編程邏輯與結構化程序設計》 作 者:“美”魯德著
【 4 】:《面向對象分析與設計》 ,“美”GradyBooch等著 王海鵬,潘家宇譯。來源於第二章“對象模型”
【 5 】:  《人月神話》 “美”FrederickP.Brooks.Jr.

【6】:http://www.myexception.cn/cpp/1844782.html

【7】:http://www.cnblogs.com/allenblogs/archive/2011/02/11/1951173.html
【圖1】來源於網絡
【圖2】自行繪制
【圖3】自行繪制
【圖4】來源於網絡
【圖5】來源於網絡
【圖6】來源於網絡

【圖7】 自行繪制

【圖8】自行繪制

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM