結構化方法vs面向對象方法


結構化方法

  • 什么是結構化方法

  通過網上的查找,我得到了這樣的定義:

  結構化分析方法(Structured Method)是強調開發方法的結構合理性以及所開發軟件的結構合理性的軟件開發方法。

  結構的合理性通過系統內各個組成要素之間的相互聯系、相互作用的框架來進行約束。而結構化開發方法的作用就在於提出了一組提高軟件結構合理性的准則,如分解與抽象、模塊獨立性、信息隱蔽等。針對軟件生存周期各個不同的階段,它可以分為結構化分析(SA)、結構化設計(SD)

  • 數據流圖(DFD):

  必須先說一下什么是數據流呢(DFD)。它的本質就是一組數據,而數據流的流向則表現了數據的傳遞與加工,表達了數據的邏輯流向與邏輯變換。

  下面就是一張數據流圖:

 

其中:

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

□:數據源或宿(“宿”表示數據的終點)。代表系統之外的實體,可以是人、物或其他軟件系統。

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

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

  • 結構化分析(SA): 

  先說結構化分析方法,它是一種着眼於數據流,自頂向下,逐層分解,建立系統的處理流程,以數據流圖和數據字典為主要工具,建立系統的邏輯模型。

  在做結構化分析的時候,我們需要根據實際情況做出它的數據流圖,去除掉非本質因素建立邏輯模型,最后不斷完善直到確認符合用戶的需求。

  我們的網站系統中就用到了結構化的方法,雲用結構化分析,我們的網站就是從前端獲取數據后到后端處理完成后再返回前端,這就是一種很明確的數據流,因此針對於這樣的功能需求,我們確定使用SSH的框架結構,這樣在不同的數據處理階段,我們都可以有針對性的針對這一階段的功能需求進行書寫,邏輯更加清晰。

  • 結構化設計(SD):

  前一階段建立好了DFD,這一階段需要細化數據流圖,確定數據流圖的類型。之后把數據流圖映射到軟件的模塊結構,分解出高層模塊,中下層模塊。最后對模塊結構進行優化,得到更為合理的軟件結構,並且設計模塊的接口。

  在SSH的框架中,可以通過Spring來分發請求,這樣我們只需要書寫ControllerService層來處理數據即可,至於獲取數據,我們流出了獲取數據的接口,在使用的Mybatis框架中,只要mapping配置文件與接口相對應,就可以完成數據的獲取,十分方便,設計過程中框架與接口的結合可以大大減少開發者的工作量。

面向對象方法:

  面向對象方法相信大家就熟悉多了,它是使用現實世界的概念把系統分為不同的對象,通過對象的繼承,調用等方式,以一種相對和現實世界解決問題的方法接近的方式解決問題。

  針對於面向對象方法的建模技術,其中最主要的就是類圖(UML),這個大二面向對象課程的時候也畫過,下面就是節選自我們項目的一個類圖:

 

  

  這其中包含了類的調用關系。可見Controller類調用了Service類,而Service類又會調用Dao類,Dao勒種又使用了下面三個實體類,這就是其中一個流程的類的調用關系。

  • 面向對象開發流程:

  首先需要進行面向對象的分析(OOA),這一階段我們需要確定該模型需要抽象出哪些類,這可以從現實中的划分入手,就以之前寫過的電梯系統為例,電梯就是一個單獨的類,而其調度功能,運行功能,打印功能又可以分別視為不同的類來划分。

  之后我們需要確定這些類之間的關系,定義類中的屬性以及提供的方法,給出約束。比如電梯系統中,電梯是最終被調度的類,他可以有自己的運動方法,所在樓層屬性,開關門屬性等,但是這些屬性均會有其他的功能類來進行修改,其運動方法也會由調度類來進行調度,從而完成對電梯的調度。

  之后就可以進行設計工作(OOD),我們需要根據前面設計的類給出該系統與用戶交互的接口,類與類之間交互的接口。在電梯的系統中,這就體現在我們的輸入與輸出上,可以做一個GUI的界面來規范用戶的輸入。

  最后需要設計這些類之間的協調關系,並且設計全局資源,最終使用對象完成相應的功能。對於一個多線程的電梯,不同的線程之間是不能有直接的調度關系的,因此,我們就需要來設置一些全局屬性來規范多線程電梯的調度,讓不同的線程可以訪問修改這些全局變量,從而完成線程之間的協調工作。

兩者比較:

  兩個開發方式都各有所長,個人而言,我更傾向於面向對象的開發方式,而且這種開發方式我也使用較多。那么我就先說一下面向對象的開發方式的優勢。

  • 更接近現實中的問題模型。就以一個飛機大戰的典型面向對象的小程序為例,我們可以把飛機,子彈,控制機分為三個不同的對象,通過對這三個對象直接的邏輯判斷來完成游戲的設計。相較之下,如果我們試圖用結構化方法來從數據流圖的角度來分析這個程序,會感覺根本無從入手。這就體現出面向對象設計的優勢,我們更容易從現實入手設計模型。
  • 代碼的冗余度更低。面向對象開發中,我們可以把不同的功能給不同的對象來實現,這樣一類的對象就可以在程序中重用同一個功能。相較之下,如果使用結構化的設計,如果我們修改一個功能,那么可能就要針對這個流程中每個與這個功能相關的部分進行修改,這樣代碼工作量就要比面向對象的設計多很多。
  • 設計靈活度高。在面向對象開發中,我們可以自由設置不同的對象,給對象自由的設置屬性,因此面向對象的建模具有更高的靈活性。這樣帶來的優勢就是我們可以更加靈活地解決問題,選取更加簡單的方式。舉個例子,設計一個游戲有不同的敵人,我們可以用不同的對象表示不同的敵人,也可以把他們視為同樣的敵人對象,兩者所帶給我們的建模效果是不同的。當然,我們一般會使用敵人類作為繼承類或者接口,這樣就統一了具有相同屬性的對象的特征。這是面向對象編程的一大優勢。

  當然結構化設計也有其優勢所在,而且我認為面向對象的設計方法在結構化設計中也有很多應用。

  • 容易設計可以復用的框架。比如我們現在使用的SSH框架,我認為這就是一個結構化設計的應用,從前端獲取數據給Spring進行分發,然后內部進行處理,最后通過hibernate進行數據庫的數據操作。然而其實Spring針對javaBean的管理其實也是一種面向對象的管理方式,因此說結構化設計中應用了面向對象的設計也是沒問題的。由於流程的確定性,我們就很容易設計出一套框架來完成結構化的設計。而對於面向對象的設計,由於對象的不確定性,就很少有可以直接使用的框架。因此,這時結構化設計的優勢。
  • 設計相對規范嚴謹。在做結構化設計前,我們需要先設計出他的數據流圖,通過這一過程,我們可以更加嚴謹的確定我們的系統的功能需求,避免在開發過程中才發現一些之前沒有考慮到的東西。就拿這個網站而言,通過繪制流程圖,我們可以確定網站的功能需求,結構化的分層設計就可以使我們在每層添加相應的功能即可。若是面向對象編程,或許還需要考慮對象之間的協作問題等。這也是結構化方法的優勢之一。
  • 更適合於做系統的開發。就比如我們現在做的書評影評網站,其實就是一種結構化的設計,而且使用了SSH的框架。對於系統的開發一般具有流程的確定性,因此我們可以找到很多可用的優質框架,這就大大減少了開發者的工作量,而且我們也可以做到不同的流程中相互獨立,這樣如果要修改某一功能,也就只需要針對於這一功能所在的流程進行修改即可,這也還比較方便。

 

  我認為面向對象的開發方法與結構化的設計師相輔相成的,在軟件工程中,我們更經常使用結構化的設計,但是結構化方法其實也會運用面向對象的設計方法,因此做到兩者優勢互補,可以大大加強開發者的工作效率。

參考文獻:

基於框架技術的軟件結構化設計的研究與應用---中山大學,徐志浩

百度百科-結構化設計

http://baike.baidu.com/link?url=TLhxj5zU4E9h9IwmTfXcQYkxoEo9esMRQUi-sZd9fC5Y8wF2TvtKNU71Ro3Fmld9Z06QZqGtwN9ocRt_iFMpHN1KGeO0ILm8v6o67TfJAwhhWtXrZhHW9Be-e1TqCodZHAFpm1GFDKATQBkmTrQeqa

新浪博客http://blog.sina.com.cn/s/blog_62b8fc3301013rm7.html

 


免責聲明!

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



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