|
面向?qū)ο蟾Y(jié)構(gòu)化的區(qū)別與分析 按我的理解,所謂的面向?qū)ο缶褪蔷褪窃诔绦蛟O(shè)計中按類來對系統(tǒng)進行設(shè)計。舉個例子,要發(fā)廣告郵件,廣告郵件列表存在數(shù)據(jù)庫里面。倘若用C來寫的話,一般會這樣思考,先把郵件內(nèi)容讀入,然后連接數(shù)據(jù)庫,循環(huán)取郵件地址,調(diào)用本機的qmail的sendmail命令發(fā)送。 仔細的分析一下,就會發(fā)現(xiàn)這樣的設(shè)計完全是從程序員實現(xiàn)程序功能的角度來設(shè)計的,或者說,設(shè)計類的時候,是自低向上的,從機器的角度到現(xiàn)實世界的角度來分析問題的。因此在設(shè)計的時候,就已經(jīng)把程序編程實現(xiàn)的細節(jié)都考慮進去了,企圖從底層實現(xiàn)程序這樣的出發(fā)點來達到滿足現(xiàn)實世界的軟件需求的目標(biāo)。類與類之間是通過發(fā)送和接收消息相聯(lián)系的,接收消息的對象通過調(diào)用類的方法來實現(xiàn)相應(yīng)的操作。訪問限制符Private、protected和public將類分成三個部分:私有部分、保護部分和公有部分。使數(shù)據(jù)具有不同的隱蔽程度。類定義可包含一組構(gòu)造函數(shù)和析構(gòu)函數(shù),構(gòu)造函數(shù)保證了在聲明類的對象時對其自動初始化,而析構(gòu)函數(shù)則保證對類的對象正常地清除。從已有的類還可以派生瓣的類,前者稱為基類,后者稱為派生類,OO方法中繼承的原則在這里得以體現(xiàn)。能夠突破類的私有部分,禁止其它函數(shù)直接訪問限制的友員機制,以及由運算符重載、函數(shù)名重載和虛函數(shù)構(gòu)成的多形性,使程序員能以更自然、方便的表達方式實現(xiàn)對象的操作。 當(dāng)然萬事萬物皆為對象,而對象又是類的實例,因此在面向?qū)ο蟮木幊讨?,就如上面的例子,我們可以在分析三個大類的前提下,定義這些類的對象。大家都知道任何對象都會有 屬性,方法,過程,函數(shù),事件等,且類與類之間又可以繼承,子類繼承父類,子類間有多態(tài)性。類也可以先進行封裝,再使用。這些都是面向的特性,當(dāng)然它還有一個代碼可重復(fù)使用的特性。也是因為如此,在程序設(shè)計中如果采用面向?qū)ο蟮木幊谭绞娇梢愿玫囊匀祟惖恼K季S進行分析。至于具體的分析,到后面將用俄羅斯方塊來分析。相比之下,傳統(tǒng)的結(jié)構(gòu)化程序設(shè)計則采用另外一種編程方式,它是采用按模塊功能進行系統(tǒng)分析的,下面附出結(jié)構(gòu)化方法的大概流程圖。圖略 結(jié)構(gòu)化程序設(shè)計的主要思想是功能分解并逐步求精,當(dāng)一些任務(wù)十分復(fù)雜以至無法描述時,可以將它拆分為一系列較小的功能部件,直到這些自完備的子任務(wù)小到易于理解的程度。例如,計算一個公司中每一個職員的平均工資是一項較為復(fù)雜的任務(wù)??梢詫⑵洳鸱譃橐韵碌淖尤蝿?wù) (1) 找出一個人的收入 (2) 計算總共有多少職員 (3) 計算工資總額 (4) 用職員人數(shù)去除工資總額 而計算工資總額本身又可以分為一系列子任務(wù): (1) 找出每個職員的檔案 (2) 讀出工資數(shù)額 (3) 把工資加到部分和上 (4) 讀出下個職員的檔案 類似地,讀出每個職員檔案的記錄又可以分解為一系列子任務(wù) (1) 打開職員的檔案 (2) 找出正確記錄 (3) 從磁盤讀取數(shù)據(jù) 具體看來結(jié)構(gòu)化程序具有以下幾個特征:自頂向下,逐步細化,模塊化設(shè)計,結(jié)構(gòu)化編碼 從軟件工程發(fā)展的歷史來看,早期的軟件開發(fā)量小,結(jié)構(gòu)化程序設(shè)計在成功地為處理復(fù)雜問題提供了有力的手段。然而到80年代末,它的一些缺點越來越大。比如當(dāng)數(shù)據(jù)量增大時,數(shù)據(jù)與處理這些數(shù)據(jù)的方法之間的分離使程序變得越來越難以理解。對數(shù)據(jù)處理能力的需求越強,這種分離所造成的負面影響越顯著。并且對于每一種老問題的新方法都要帶來額外的開銷,與可重用性相比,這種編程思想顯得落后許多。面向?qū)ο缶褪窃谶@種情況產(chǎn)生了,相信在未來十年內(nèi),面向?qū)ο筮€將繼續(xù)發(fā)展。 介紹完了兩者大致的定義后,接下來用俄羅斯方塊來分析一下兩種編程思想具體的不同 對于結(jié)構(gòu)化程序的方法,在這里用腳本語言javascript來描述,而面向?qū)ο髣t采用如日中天的java來分析。 首先按結(jié)構(gòu)化編程方式來完成俄羅斯方塊的話,我們會對問題按數(shù)據(jù)結(jié)構(gòu)進行模塊化的分解,本程序?qū)⒂靡韵聨讉€模塊來完成: (1) 開始游戲(function beginGame()) (2) 俄羅斯方向鍵的控制(function keyControl()) (3) 塊的消除(function decline()) (4) 面板的移動(function moveBar()) (5) 暫停游戲(function pauseGame()) (6) 游戲重新開始(function replayGame()) (7) 方塊的顯示(function randBar()) 在分解這幾個模塊后,就已經(jīng)大致完成了對程序的整體分析了。這是對程序中問題的描述,接下來則是具體的算法分析,也是結(jié)構(gòu)化當(dāng)中的解決問題了。要解決本程序中最主要的一個算法一一方塊的顯示算法,在本程序中采用四維數(shù)組的方式來表達方塊,比如: 1,0,0,0 1,0,0,0 1,0,0,0 1,1,1,1 這樣則表示方塊中的L形狀態(tài),其他則不在一一列出。其他算法的則略過。還是把重點轉(zhuǎn)移到面向?qū)ο笾衼怼?/span> 在面向?qū)ο笾惺滓鉀Q的是本程序中要分為幾大類來完成最基本的系統(tǒng)設(shè)計。這個俄羅斯方塊放在網(wǎng)頁中,也就是采用applet小程序的形式,但由于java跨平臺性,它可以在windows,linux,unix等操作系統(tǒng)中使用。本程序大致分為三個大類:Tetrisapplet,Brick3D,Board。下面是TerisApplet的UML圖: TerisApplet Init() Initcomponent() Minewgameactionperformed() Miendgameactionperformed() (2) initcomponent():初始化窗口以及窗口中的組件 (3) minewGameActionPerformed():當(dāng)選擇菜單或者工具欄上的“開始游戲”命令后,開始新游戲。 (4) miEndGameActionPerformed():當(dāng)選擇或者工具欄上上的“結(jié)束游戲”命令后,結(jié)束游戲。 2.Brick3D,以下是UML圖
3.Board Board類實現(xiàn)俄羅斯方塊的主要大部分功能,下面是它的UML圖
從建模圖中可以看出:Board實現(xiàn)的方法有drop()、move()、reset()、newGame()、endGame()、run()、paint()、createNewBrick()、checkRow()、processKeyEvent()、processMouseEvent()、processMouseWheelEvent()等方法,這些方法的功能定義如下。 (1) drop():磚塊的下落函數(shù)。 (2) move():移動磚塊,1表示向右移動,-1表示向左移動 (3) reset():初始化board_info數(shù)組 (4) newGame():開始執(zhí)行線程(游戲) (5) endgame():停止執(zhí)行線程(游戲) (6) run():線程運行的函數(shù) (7) paint():繪制背景,邊界和磚塊 (8) createNewBrick():創(chuàng)建下一個新的磚塊形狀、角度和顏色,角度、形狀和顏色隨機產(chǎn)生 (9) checkrow():檢查是否可以消行,并計算分數(shù) (10) processKeyEvent():處理鍵盤事件,控制磚塊的移動和旋轉(zhuǎn) (11) processMouseEvent():處理鼠標(biāo)事件,控制旋轉(zhuǎn)和左右移動 (12) processMouseWheelEvent():處理鼠標(biāo)滾輪事件,當(dāng)向下滾動時,控制塊向下移動 分析完后,本程序用了三個主要的類:Brick3D對象、Board對象和TerisApplet對象,分別對應(yīng)Brick3D.java,Board.java和TetrisApplet.java三個文件,在實例中還包括了一個Html文件。 雖然用面向?qū)ο髮懙拇a更多,看似面向?qū)ο蟾鼮槁闊?,但實際上面向?qū)ο蟾芙鉀Q現(xiàn)在的軟件工程問題,而結(jié)構(gòu)化程序設(shè)計的方法只對小型的軟件設(shè)計適合。未來十年內(nèi)面向?qū)ο筮€是軟件開發(fā)的主流。 |
|
|