免费视频淫片aa毛片_日韩高清在线亚洲专区vr_日韩大片免费观看视频播放_亚洲欧美国产精品完整版

打開APP
userphoto
未登錄

開通VIP,暢享免費(fèi)電子書等14項(xiàng)超值服

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

聯(lián)系客服