小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

博客園 - 我,sumargin,肖少富的博客 - 面向?qū)ο笈c結(jié)構(gòu)化分析與區(qū)別

 浪打天門 2006-03-16

面向?qū)ο蟾Y(jié)構(gòu)化的區(qū)別與分析

按我的理解,所謂的面向?qū)ο缶褪蔷褪窃诔绦蛟O(shè)計中按類來對系統(tǒng)進行設(shè)計。舉個例子,要發(fā)廣告郵件,廣告郵件列表存在數(shù)據(jù)庫里面。倘若用C來寫的話,一般會這樣思考,先把郵件內(nèi)容讀入,然后連接數(shù)據(jù)庫,循環(huán)取郵件地址,調(diào)用本機的qmailsendmail命令發(fā)送。
  然后考慮用Java來實現(xiàn),既然是OOP,就不能什么代碼都塞到main過程里面,于是就設(shè)計了三個類:
   
一個類是負責(zé)讀取數(shù)據(jù)庫,取郵件地址,調(diào)用qmailsendmail命令發(fā)送;

  一個類是讀郵件內(nèi)容,MIME編碼成HTML格式的,再加上郵件頭;

  一個主類負責(zé)從命令讀參數(shù),處理命令行參數(shù),調(diào)用發(fā)email的類。

仔細的分析一下,就會發(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)的操作。訪問限制符Privateprotectedpublic將類分成三個部分:私有部分、保護部分和公有部分。使數(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。下面是TerisAppletUML圖:
 

                                         
 

                                      TerisApplet

                                  Init()

                                  Initcomponent()

                                  Minewgameactionperformed()

                                  Miendgameactionperformed()

 

















(1)       init():初始化applet

(2)       initcomponent():初始化窗口以及窗口中的組件

(3)       minewGameActionPerformed():當(dāng)選擇菜單或者工具欄上的“開始游戲”命令后,開始新游戲。

(4)       miEndGameActionPerformed():當(dāng)選擇或者工具欄上上的“結(jié)束游戲”命令后,結(jié)束游戲。

2Brick3D,以下是UML







  

 


 略,看word




從圖中可以看出
,Brick3D定義主要有reset(),getShapeIno(),getAngle(),getShape(),rotate()paint()方法。其中getshapeInfo(),getAngle(),getShape()用于獲取磚塊的形狀信息,矩陣、角度和形狀值。Totate()方法用于旋轉(zhuǎn)磚塊,paint()方法用于在指定的地點給制磚塊
  
 

3Board

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.javaTetrisApplet.java三個文件,在實例中還包括了一個Html文件。

  雖然用面向?qū)ο髮懙拇a更多,看似面向?qū)ο蟾鼮槁闊?,但實際上面向?qū)ο蟾芙鉀Q現(xiàn)在的軟件工程問題,而結(jié)構(gòu)化程序設(shè)計的方法只對小型的軟件設(shè)計適合。未來十年內(nèi)面向?qū)ο筮€是軟件開發(fā)的主流。


posted on 2005-11-05 13:06 我是sumargin 閱讀(65) 評論(0)  編輯 收藏 收藏至365Key 所屬分類: 軟件工程概論

    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多