第一章交互式三維圖形軟件開(kāi)發(fā)系統(tǒng)_第1頁(yè)
第一章交互式三維圖形軟件開(kāi)發(fā)系統(tǒng)_第2頁(yè)
第一章交互式三維圖形軟件開(kāi)發(fā)系統(tǒng)_第3頁(yè)
第一章交互式三維圖形軟件開(kāi)發(fā)系統(tǒng)_第4頁(yè)
第一章交互式三維圖形軟件開(kāi)發(fā)系統(tǒng)_第5頁(yè)
已閱讀5頁(yè),還剩19頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、第一章 交互式三維圖形軟件開(kāi)發(fā)系統(tǒng)為什么要研制基于OpenGL的交互式三維圖形軟件開(kāi)發(fā)工具Intra3D 2.0 ? 本章開(kāi)頭兩節(jié)將解答這個(gè)問(wèn)題。軟件工程的主要目標(biāo)是提高質(zhì)量與生產(chǎn)率,如果沒(méi)有軟件工程思想方法的指導(dǎo),Intra3D 2.0的設(shè)計(jì)、編程、擴(kuò)展等工作可能會(huì)陷入混亂的困境。1.3節(jié)論述了軟件的質(zhì)量因素,以及提高質(zhì)量與生產(chǎn)率的三種基本策略:“復(fù)用”、“分而治之”和“優(yōu)化折衷”。本章重點(diǎn)是Intra3D 2.0的系統(tǒng)設(shè)計(jì),主要從“體系結(jié)構(gòu)設(shè)計(jì)”、“模塊化設(shè)計(jì)”、“數(shù)據(jù)結(jié)構(gòu)與算法設(shè)計(jì)”、“用戶界面設(shè)計(jì)美學(xué)”和“程序設(shè)計(jì)風(fēng)格”五個(gè)方面論述。1.1 圖形標(biāo)準(zhǔn)OpenGL及其高級(jí)開(kāi)發(fā)工具圖形標(biāo)準(zhǔn)

2、在圖形領(lǐng)域有著重要的地位,是很多大公司與機(jī)構(gòu)爭(zhēng)奪的法寶。歷史上曾出現(xiàn)的圖形標(biāo)準(zhǔn)有Core、GKS、PHIGS、PEX、GL、Dore、RenderMan、Hoops、OpenGL等等。經(jīng)過(guò)了競(jìng)爭(zhēng)與淘汰,目前OpenGL占據(jù)了領(lǐng)導(dǎo)地位,成為國(guó)際上公認(rèn)的3D圖形工業(yè)標(biāo)準(zhǔn)。SGI公司是贏家,它于1990年著手研制OpenGL。1992年OpenGL體系結(jié)構(gòu)委員會(huì)制定了1.0規(guī)范,1995年推出1.1規(guī)范。1998年OpenGL 1.2在SGI平臺(tái)實(shí)現(xiàn)。OpenGL及其應(yīng)用程序已在Unix與PC平臺(tái)得到廣泛的應(yīng)用。圖形標(biāo)準(zhǔn)存在顯而易見(jiàn)的優(yōu)點(diǎn):它不僅加速了3D應(yīng)用程序的開(kāi)發(fā),而且使應(yīng)用程序的可移植性更好

3、。但是標(biāo)準(zhǔn)亦存在著缺點(diǎn),Andries Van Dam 指出:“標(biāo)準(zhǔn)是很多人經(jīng)過(guò)多年的努力共同創(chuàng)建的,它的規(guī)范與實(shí)現(xiàn)總是落后于最新技術(shù)。經(jīng)驗(yàn)表明,絕大多數(shù)領(lǐng)域最先進(jìn)的設(shè)計(jì)都是極小數(shù)精英小組創(chuàng)作的,但是標(biāo)準(zhǔn)卻是一個(gè)龐大委員會(huì)的技術(shù)、政治折衷的產(chǎn)物”Dam 1998。OpenGL的發(fā)展已近10年,從1.0版本到1.2版本在功能上并無(wú)顯著的變化。在開(kāi)發(fā)交互式3D圖形應(yīng)用程序方面,OpenGL存在明顯的不足:(1)OpenGL與窗口系統(tǒng)無(wú)關(guān),不提供任何交互手段,必須由程序員自己編寫(xiě)所有的交互功能。(2)OpenGL應(yīng)用程序性能的優(yōu)化是程序員面臨的一大困難。OpenGL的API(編程接口)非常靈活,不僅

4、針對(duì)硬件與軟件的優(yōu)化方法多而相異,即便對(duì)于同一數(shù)據(jù)結(jié)構(gòu)或算法,如果代碼的組織不同亦會(huì)產(chǎn)生顯著的性能差異。(3)OpenGL 的API是低級(jí)的C函數(shù),不提供可復(fù)用的對(duì)象庫(kù)或者應(yīng)用程序框架,開(kāi)發(fā)效率不高。以上幾點(diǎn)表明,除非開(kāi)發(fā)人員既精通圖形系統(tǒng)又精通窗口系統(tǒng)的編程,否則難以開(kāi)發(fā)出較好的基于OpenGL的交互式3D應(yīng)用程序。由于標(biāo)準(zhǔn)不能被輕易創(chuàng)建與修改,它往往跟不上技術(shù)的發(fā)展與市場(chǎng)的變化。而3D圖形是迅猛發(fā)展的領(lǐng)域,為了克服這個(gè)困難,人們往往在圖形標(biāo)準(zhǔn)之上再建立更高級(jí)的開(kāi)發(fā)工具(3D Toolkit或3D Engine)?;贠penGL的著名的開(kāi)發(fā)工具有:一、Open InventorOpen I

5、nventor 是從SGI的Iris Inventor發(fā)展而來(lái),適合于開(kāi)發(fā)面向?qū)ο蟮慕换ナ?D圖形應(yīng)用程序。其核心是圍繞 Scene Graph的龐大的C+ 類庫(kù),它提供場(chǎng)景編輯、交互式繪制、文件輸入輸出等功能以及相應(yīng)的圖形用戶界面。Open Inventor是通用的商業(yè)化軟件,由Open Inventor體系結(jié)構(gòu)委員會(huì)制定標(biāo)準(zhǔn),可以在多個(gè)平臺(tái)運(yùn)行。PC平臺(tái)的Open Inventor由TGS公司開(kāi)發(fā)與銷售。Wernecke 1994 Wang 1997Open Inventor的基本特征是“大而全”,如果你只要開(kāi)發(fā)很小的3D應(yīng)用程序,使用Open Inventor就象讓相撲運(yùn)動(dòng)員去干針線活那

6、樣笨。二、Iris PerformerIris Performer 是高性能實(shí)時(shí)3D圖形開(kāi)發(fā)系統(tǒng),由SGI公司研制,專用于SGI的高檔圖形工作站。Iris Performer 提供高層的場(chǎng)景結(jié)構(gòu),支持多CPU、場(chǎng)景多層次細(xì)節(jié)(LOD)管理。不提供用于3D交互的圖形用戶界面。Rohlf 1994Iris Performer我只聽(tīng)說(shuō)過(guò)但沒(méi)有親手用過(guò)。總統(tǒng)套房好是好,可老百姓住不起。三、OpenGL Optimeizer/Cosmo3DOpenGL Optimeizer/Cosmo3D 是面向大型CAD/CAE與可視化應(yīng)用的開(kāi)發(fā)系統(tǒng),由SGI公司研制。它可以將大型復(fù)雜的造型簡(jiǎn)化,并快速地繪制。但由于

7、該產(chǎn)品推出的時(shí)間不長(zhǎng),短期內(nèi)難以被廣泛采納。Paul 1997所有的新產(chǎn)品都說(shuō)自己好并且對(duì)用戶“必不可少”,但用戶總免不了疑神疑鬼,還是等它成熟了再用。四、GLUTGLUT 的核心是個(gè)小型的C函數(shù)庫(kù),這些函數(shù)可以創(chuàng)建OpenGL窗口、彈出菜單、響應(yīng)鼠標(biāo)事件,并可以繪制簡(jiǎn)單的常見(jiàn)幾何形體。GLUT 可在X-Window, Windows NT, OS/2等系統(tǒng)下運(yùn)行,特別適合于開(kāi)發(fā)不需要復(fù)雜界面的OpenGL示例程序。GLUT的源程序是公開(kāi)的,并且提供了百余個(gè)出色的示例程序,可幫助用戶進(jìn)一步了解OpenGL。Paul 1997 Kilgard 1996GLUT可愛(ài)得象南方的小蔥,但是派不上大用場(chǎng)

8、。另外,SGI與Microsoft合作的“Fahrenheit計(jì)劃”,將綜合OpenGL、Direct3D、Open Inventor、Optimeizer/Cosmo3D的優(yōu)點(diǎn),創(chuàng)建更優(yōu)秀的圖形與可視化開(kāi)發(fā)系統(tǒng)??墒抢状蛄藘赡甓啵褪遣幌掠?。我在博士入學(xué)的第一年就看到了這計(jì)劃,一直到畢業(yè)都沒(méi)見(jiàn)到產(chǎn)品,幸好我沒(méi)有干等著。Fahrenheit 1.2 Intra3D 2.0的研制背景由于Open Inventor在Unix與PC平臺(tái)得到了廣泛的應(yīng)用,被譽(yù)為是交互式3D開(kāi)發(fā)工具的“事實(shí)標(biāo)準(zhǔn)”。但顯然沒(méi)有一個(gè)3D開(kāi)發(fā)工具能滿足所有的應(yīng)用需求,3D的廣泛應(yīng)用需要更多的開(kāi)發(fā)工具支持。目前在Interne

9、t上可以搜索到的各種用途的3D Engine有500多個(gè)Engines,Open Inventor可以更精確地歸類于“object oriented drawing and document editing system” Kochhar 1996。隨著計(jì)算機(jī)圖形技術(shù)與網(wǎng)絡(luò)技術(shù)的迅猛發(fā)展,兩者的結(jié)合勢(shì)在必行。在商業(yè)、科研、教育、娛樂(lè)等領(lǐng)域,用于分布式虛擬環(huán)境(Distributed Virtual Environments, DVEs)和支持協(xié)同工作(Computer Supported Cooperative Work, CSCW)的圖形系統(tǒng)已成為研究與應(yīng)用的熱點(diǎn)Barton 1999 Pe

10、ndergast 19999。著名的DVEs系統(tǒng)有DIVE、dVS、MR、Repo-3D等MacIntyre 1998。但是這些DVEs系統(tǒng)缺乏3D開(kāi)發(fā)工具的交互式圖形功能以及通用性,而通用的3D開(kāi)發(fā)工具如Open Inventor則又不支持分布式計(jì)算和協(xié)同工作。由于在窗口系統(tǒng)、圖形支撐庫(kù)、編程語(yǔ)言等方面存在差異,上述DVEs系統(tǒng)和3D開(kāi)發(fā)工具難以方便地結(jié)合使用。為了緊跟發(fā)展潮流,我們從國(guó)情出發(fā),多方面分析了3D的需求及軟硬件條件研制完成了自主版權(quán)、運(yùn)行于PC平臺(tái)的“交互式協(xié)同式三維圖形軟件開(kāi)發(fā)系統(tǒng)與數(shù)據(jù)流可視化平臺(tái)”林銳 2000b,如圖1.1所示,其中:(1)Intra3D 2.0是基于O

11、penGL的交互式三維圖形軟件開(kāi)發(fā)工具,可用于快速開(kāi)發(fā)Window 9X/NT下的交互式三維圖形應(yīng)用軟件。(功能示例見(jiàn)彩圖16)(2)DVL 2.0是基于OpenGL的數(shù)據(jù)可視化工具庫(kù)(Data Visualization Lib),主要用于繪制科學(xué)計(jì)算數(shù)據(jù)和商業(yè)統(tǒng)計(jì)圖形。結(jié)合Intra3D 2.0和DVL 2.0可以快速開(kāi)發(fā)交互式數(shù)據(jù)可視化應(yīng)用軟件。(3)CNC 2.0是用于協(xié)同工作的網(wǎng)絡(luò)通訊開(kāi)發(fā)系統(tǒng)(Cooperative Network Communicator),其核心是支持“發(fā)布訂閱模式”和“數(shù)據(jù)流模式”的類庫(kù)。結(jié)合Intra3D 2.0、DVL 2.0和CNC 2.0,可以快速開(kāi)發(fā)

12、支持協(xié)同工作的交互式三維圖形與數(shù)據(jù)可視化應(yīng)用軟件。(4)GIVE+ 是“分布式數(shù)據(jù)流可視化平臺(tái)”。用戶從GIVE+ 中選取模塊,以“搭積木”的方式將各個(gè)模塊用數(shù)據(jù)流連接起來(lái),之后用戶就可以直觀地控制這些模塊的運(yùn)行。如果用戶在GIVE+ 中找不到需要的模塊,可以使用Intra3D 2.0、DVL 2.0和CNC 2.0來(lái)開(kāi)發(fā)該模塊,把開(kāi)發(fā)完成的模塊添加到GIVE+的模塊庫(kù)中即可。(功能示例見(jiàn)彩圖7、8、9)通用可視化平臺(tái) GIVE與GIVE +應(yīng)用環(huán)境用于協(xié)同工作的網(wǎng)絡(luò)通訊開(kāi)發(fā)系統(tǒng)CNC 2.0數(shù)據(jù)可視化工具庫(kù) DVL 2.0交互式三維圖形軟件開(kāi)發(fā)工具 Intra3D 2.0開(kāi)發(fā)工具國(guó)際圖形標(biāo)準(zhǔn)

13、 OpenGL支撐PC + Windows 9X/NT平臺(tái)圖1.1 交互式協(xié)同式的三維圖形軟件開(kāi)發(fā)系統(tǒng)與數(shù)據(jù)流可視化平臺(tái)圖1.1的方案充分體現(xiàn)了“大規(guī)模復(fù)用”和“分而治之”的軟件工程思想(見(jiàn)1.3.節(jié))。如果按工作量劃分比例,那么Intra3D 2.0 約占40%,DVL 2.0約占10%,CNC 2.0約占25%,GIVE+ 約占25%。Intra3D 2.0 是上述方案中最重要的軟件開(kāi)發(fā)工具。在設(shè)計(jì)Intra3D 2.0時(shí),我們分析過(guò)百余個(gè)OpenGL應(yīng)用程序,借鑒了Open Inventor與Optimeizer/Cosmo3D的設(shè)計(jì)優(yōu)點(diǎn)。以下是Intra3D 2.0與Open Inve

14、ntor的主要不同點(diǎn):(1)體系結(jié)構(gòu)不同。Open Inventor是圍繞Scene Graph開(kāi)發(fā)的,可稱大而全,但其很多功能在圖1.1方案中不實(shí)用也不必需。Intra3D 2.0分四層設(shè)計(jì),每層少而精,擴(kuò)展靈活,切合圖1.1的方案。(2) Intra3D 2.0提供C+類庫(kù)與COM(Component Object Model)庫(kù),支持Visual C+、Visual Basic、Delphi編程。這種多語(yǔ)言編程是現(xiàn)代PC應(yīng)用開(kāi)發(fā)的一個(gè)特征。而Open Inventor是從SGI的IRIS Inventor發(fā)展而來(lái)的,由于需求背景不同,Open Inventor不具備Intra3D 2.0

15、這種特征。(3)Intra3D 2.0是個(gè)免費(fèi)軟件,所有源代碼向用戶開(kāi)放。Intra3D 2.0的內(nèi)核用Visual C+ 編寫(xiě),其C+類庫(kù)與COM庫(kù)各有60余個(gè)模塊,共有7萬(wàn)多行代碼。由于Intra3D 2.0是分層設(shè)計(jì)的,用戶可以方便地修改內(nèi)核以適應(yīng)不同的需求。Open Inventor是商業(yè)軟件,不免費(fèi)、不公開(kāi)源代碼。1.3 軟件工程思想本節(jié)講述指導(dǎo)Intra3D 2.0系統(tǒng)設(shè)計(jì)的軟件工程思想林銳 2000a。軟件工程的目標(biāo)是提高軟件的質(zhì)量與生產(chǎn)率,最終實(shí)現(xiàn)軟件的工業(yè)化生產(chǎn)。質(zhì)量是軟件需求方最關(guān)心的問(wèn)題,用戶即使不圖物美價(jià)廉,也要求個(gè)貨真價(jià)實(shí)。生產(chǎn)率是軟件供應(yīng)方最關(guān)心的問(wèn)題,老板和員工都

16、想用更少的時(shí)間掙更多的錢。質(zhì)量與生產(chǎn)率之間有著內(nèi)在的聯(lián)系。高生產(chǎn)率必須以質(zhì)量合格為前提。如果質(zhì)量不合格,對(duì)供需雙方都是壞事情。從短期效益看,追求高質(zhì)量會(huì)延長(zhǎng)軟件開(kāi)發(fā)時(shí)間并且增大費(fèi)用,似乎降低了生產(chǎn)率。從長(zhǎng)期效益看,高質(zhì)量將保證軟件開(kāi)發(fā)的全過(guò)程更加規(guī)范流暢,大大降低了軟件的維護(hù)代價(jià),實(shí)質(zhì)上是提高了生產(chǎn)率,同時(shí)可獲得很好的信譽(yù)。質(zhì)量與生產(chǎn)率之間不存在根本的對(duì)立,好的軟件工程方法可以同時(shí)提高質(zhì)量與生產(chǎn)率。對(duì)開(kāi)發(fā)人員而言,如果非得在質(zhì)量與生產(chǎn)率之間分個(gè)主次,那么應(yīng)該是質(zhì)量第一,生產(chǎn)率第二。這是因?yàn)椋海?)質(zhì)量直接體現(xiàn)在軟件的每段程序中,高質(zhì)量自然是開(kāi)發(fā)人員的技術(shù)追求,也是職業(yè)道德的要求。(2)高質(zhì)量對(duì)

17、所有的用戶都有價(jià)值,而高生產(chǎn)率只對(duì)開(kāi)發(fā)方有意義。(3)如果一開(kāi)始就追求高生產(chǎn)率,容易導(dǎo)致急功近利,留下隱患。寧可進(jìn)度慢些,也要保證每個(gè)環(huán)節(jié)的質(zhì)量,以圖長(zhǎng)遠(yuǎn)利益。1.3.1 軟件的質(zhì)量因素由于軟件開(kāi)發(fā)是一種智力創(chuàng)作活動(dòng),很難象傳統(tǒng)工業(yè)那樣通過(guò)執(zhí)行嚴(yán)格的操作規(guī)范來(lái)保證軟件產(chǎn)品的質(zhì)量。世上最小心翼翼、最老實(shí)巴腳的程序員未必就能開(kāi)發(fā)出高質(zhì)量的軟件來(lái)。程序員必須了解軟件質(zhì)量的方方面面(稱為質(zhì)量因素),才能在進(jìn)行系統(tǒng)設(shè)計(jì)、程序設(shè)計(jì)時(shí)將高質(zhì)量?jī)?nèi)建其中。軟件的高質(zhì)量并不是“管理”出來(lái)的,實(shí)質(zhì)上是設(shè)計(jì)出來(lái)的。那么什么是高質(zhì)量的程序?“運(yùn)行正確”的程序就是高質(zhì)量的程序嗎?“運(yùn)行正確”的程序不見(jiàn)得就是高質(zhì)量的程序。

18、這個(gè)程序也許運(yùn)行速度很低并且浪費(fèi)內(nèi)存;也許代碼寫(xiě)得一塌糊涂,除了開(kāi)發(fā)者本人誰(shuí)也看不懂也不會(huì)使用。正確性只是反映軟件質(zhì)量的一個(gè)因素而已。軟件的質(zhì)量因素很多,如正確性、精確性、可靠性、容錯(cuò)性、性能、效率、易用性、可理解性、簡(jiǎn)潔性、可復(fù)用性、可擴(kuò)充性、兼容性等等。這里關(guān)心的主要質(zhì)量因素為“正確性與精確性”、“性能與效率”、“易用性”、“可理解性與簡(jiǎn)潔性”和“可復(fù)用性與可擴(kuò)展性”。其中“正確性與精確性”排在第一位,其余的并列,如圖1.2所示。正確性與精確性易用性性能與效率可復(fù)用性與可擴(kuò)展性可理解性與簡(jiǎn)潔性圖1.2 軟件質(zhì)量因素的分類一、正確性與精確性正確性與精確性之所以排在質(zhì)量因素的第一位,是因?yàn)槿绻?/p>

19、軟件運(yùn)行不正確或者不精確,就會(huì)給用戶造成不便甚至造成損失。機(jī)器不會(huì)欺騙人,軟件運(yùn)行不正確或者不精確一般都是人造成的。即使一個(gè)軟件能100% 地按需求規(guī)格執(zhí)行,但是如果需求分析錯(cuò)了,那么對(duì)客戶而言這個(gè)軟件也存在錯(cuò)誤。即使需求分析完全符合客戶的要求,但是如果軟件沒(méi)有100% 地按需求規(guī)格執(zhí)行,那么這個(gè)軟件也存在錯(cuò)誤。開(kāi)發(fā)一個(gè)大的軟件項(xiàng)目,程序員要為正確、精確四個(gè)字竭盡精力。與正確性、精確性密切相關(guān)的質(zhì)量因素是容錯(cuò)性和可靠性。容錯(cuò)性首先承認(rèn)軟件系統(tǒng)存在不正確與不精確的因素,為了防止?jié)撛诘牟徽_與不精確因素引發(fā)災(zāi)難,系統(tǒng)為此設(shè)計(jì)了安全措施。在一些高風(fēng)險(xiǎn)的軟件系統(tǒng),如航空航天、武器、金融等系統(tǒng)中,容錯(cuò)性

20、設(shè)計(jì)非常重要。可靠性是指在一定的環(huán)境下,在給定的時(shí)間內(nèi),系統(tǒng)不發(fā)生故障的概率。可靠性本來(lái)是硬件領(lǐng)域的術(shù)語(yǔ)。比如某個(gè)電子設(shè)備,一開(kāi)始工作很正常,但由于工作中器件的物理性質(zhì)會(huì)發(fā)生變化(如發(fā)熱),慢慢地系統(tǒng)就會(huì)失常。所以一個(gè)設(shè)計(jì)完全正確的硬件系統(tǒng),在工作中未必就是可靠的。軟件在運(yùn)行時(shí)不會(huì)發(fā)生物理性質(zhì)的變化,人們常以為如果軟件的某個(gè)功能是正確的,那么它永遠(yuǎn)都是正確的??墒俏覀儫o(wú)法對(duì)軟件進(jìn)行徹底地測(cè)試,無(wú)法根除軟件中潛在的錯(cuò)誤。平時(shí)軟件運(yùn)行得好好的,說(shuō)不準(zhǔn)哪一天就不正常了,如“2000年”問(wèn)題。因此把可靠性引入軟件領(lǐng)域是非常有意義的。二、性能與效率用戶都希望軟件的運(yùn)行速度高些(高性能),并且占用資源少些

21、(高效率)。程序員可以通過(guò)優(yōu)化算法、數(shù)據(jù)結(jié)構(gòu)和代碼組織來(lái)提高軟件系統(tǒng)的性能與效率。優(yōu)化的關(guān)鍵工作是找出限制性能與效率的瓶頸。附錄A論述了OpenGL三維圖形程序性能優(yōu)化的方法。三、易用性易用性是指用戶感覺(jué)使用軟件的難易程度。用戶可能是操作軟件的最終用戶,也可能是那些要使用源代碼的程序員。易用性沒(méi)有一個(gè)量化的指標(biāo),主觀性較強(qiáng)。調(diào)查表明,當(dāng)用戶不理解軟件中的某個(gè)特性時(shí),大多數(shù)人首先會(huì)向同事、朋友請(qǐng)教。要是再不起作用,就向產(chǎn)品支持部門打電話。只有30%的用戶會(huì)查閱用戶手冊(cè)。一般認(rèn)為,如果用戶不翻閱手冊(cè)就能使用軟件,那么表明這個(gè)軟件具有較好的易用性。Cusumano 1995四、可理解性與簡(jiǎn)潔性開(kāi)發(fā)人

22、員只有在自己思路清晰時(shí)才可能寫(xiě)出讓別人能理解的程序。編程時(shí)要注意不可濫用技巧,應(yīng)該用自然的方式編程。簡(jiǎn)潔是一種美,不管是開(kāi)發(fā)人員自己還是用戶都會(huì)有同感。一個(gè)原始的應(yīng)用問(wèn)題可能很復(fù)雜,但高水平的人就能夠把軟件系統(tǒng)設(shè)計(jì)得很簡(jiǎn)潔。如果軟件系統(tǒng)臃腫不堪,它遲早會(huì)出問(wèn)題。簡(jiǎn)潔是人們對(duì)工作精益求精的結(jié)果。五、可復(fù)用性與可擴(kuò)展性可擴(kuò)展性反映軟件適應(yīng)“變化”的能力。在軟件開(kāi)發(fā)過(guò)程中,“變化”是司空見(jiàn)慣的事情,如需求的變化、對(duì)需求理解的變化、算法的改進(jìn)、數(shù)據(jù)及其描述的變化、程序?qū)崿F(xiàn)技術(shù)的變化等等。復(fù)用能同時(shí)提高軟件的質(zhì)量與生產(chǎn)率。復(fù)用的一種方式是原封不動(dòng)地使用現(xiàn)成的軟構(gòu)件,另一種方式是對(duì)現(xiàn)成的軟構(gòu)件進(jìn)行必要的擴(kuò)

23、展后再使用。可復(fù)用性好的程序一般也具有良好的可擴(kuò)展性。下一節(jié)將深入論述“復(fù)用”。1.3.2 提高質(zhì)量與生產(chǎn)率的三種基本策略人們都有自己的世界觀和方法論,能自然而然地運(yùn)用于生活和工作中。同樣,程序員腦子里的軟件工程觀念會(huì)無(wú)形地支配他怎么去做事情。軟件工程三十年的發(fā)展,已經(jīng)積累了相當(dāng)多的方法,但這些方法不是嚴(yán)密的理論。實(shí)踐人員不應(yīng)該教條地套用方法,更重要的是學(xué)會(huì)“選擇合適的方法”和“產(chǎn)生新方法”。本節(jié)講述提高質(zhì)量與生產(chǎn)率的三種基本策略:“復(fù)用”、“分而治之”、“優(yōu)化折衷”。一、復(fù)用復(fù)用是指“利用現(xiàn)成的東西”,被復(fù)用的對(duì)象可以是有形的物體,也可以是無(wú)形的成果。復(fù)用不是人類懶惰的表現(xiàn)而是智慧的表現(xiàn)。因

24、為人類總是在繼承了前人的成果,不斷加以利用、改進(jìn)或創(chuàng)新后才會(huì)進(jìn)步。復(fù)用的內(nèi)涵包括了提高質(zhì)量與生產(chǎn)率。由經(jīng)驗(yàn)可知,在一個(gè)新系統(tǒng)中,大部分的內(nèi)容是成熟的,只有小部分內(nèi)容是創(chuàng)新的。一般地可以相信成熟的東西總是比較可靠的(即具有高質(zhì)量),而大量成熟的工作可以通過(guò)復(fù)用來(lái)快速實(shí)現(xiàn)(即具有高生產(chǎn)率)。人們應(yīng)該把大部分的時(shí)間用在小比例的創(chuàng)新工作上,而把小部分的時(shí)間用在大比例的成熟工作中,這樣才能把工作做得又快又好。把復(fù)用的思想用于軟件開(kāi)發(fā),稱為軟件復(fù)用。據(jù)統(tǒng)計(jì),世上已有1000億多行程序,可見(jiàn)無(wú)數(shù)功能被重寫(xiě)了成千上萬(wàn)次。面向?qū)ο螅∣bject Oriented)學(xué)者的一個(gè)“呼吁”就是“請(qǐng)不要再發(fā)明相同的車輪子

25、了”。將具有一定集成度并可以重復(fù)使用的軟件組成單元稱為軟構(gòu)件(Software Component)。軟件復(fù)用可以表述為:構(gòu)造新的軟件系統(tǒng)可以不必每次從零做起,直接使用已有的軟構(gòu)件,即可組裝(或加以合理修改)成新的系統(tǒng)。復(fù)用方法合理化并簡(jiǎn)化了軟件開(kāi)發(fā)過(guò)程,減少了總的開(kāi)發(fā)工作量與維護(hù)代價(jià),既降低了軟件的成本又提高了生產(chǎn)率。另一方面,由于軟構(gòu)件是經(jīng)過(guò)反復(fù)使用驗(yàn)證的,自身具有較高的質(zhì)量。因此由軟構(gòu)件組成的新系統(tǒng)也具有較高的質(zhì)量。利用軟構(gòu)件生產(chǎn)應(yīng)用軟件的過(guò)程如圖1.3所示。查詢軟構(gòu)件庫(kù)用構(gòu)件建造新軟件定義所需構(gòu)件集合應(yīng)用軟件系統(tǒng)分解提取構(gòu)件 存在 創(chuàng)建新構(gòu)件 構(gòu)件不存在圖1.3 利用軟構(gòu)件生產(chǎn)應(yīng)用軟件

26、的過(guò)程軟件復(fù)用不僅要使自己拿來(lái)方便,還要讓別人拿去方便,是“拿來(lái)拿去主義”。面向?qū)ο蠹夹g(shù),Microsoft公司的COM規(guī)范 Rogerson 1999,都能很好地用于實(shí)現(xiàn)大規(guī)模的軟件復(fù)用。在圖1.1的方案中,Intra3D 2.0、DVL 2.0、CNC2.0軟件系統(tǒng)的核心都是可復(fù)用的對(duì)象庫(kù),可幫助用戶快速地開(kāi)發(fā)交互式協(xié)同式的三維圖形與數(shù)據(jù)可視化應(yīng)用軟件。軟構(gòu)件經(jīng)典的程序形式是C+的類,例如Open Inventor的構(gòu)件庫(kù)是C+類庫(kù)。目前在PC平臺(tái)非常流行的一種構(gòu)件程序形式是COM,COM的一個(gè)突出優(yōu)點(diǎn)是與編程語(yǔ)言無(wú)關(guān)。Intra3D 2.0同時(shí)提供C+類庫(kù)與COM庫(kù),在應(yīng)用編程時(shí)可以支持

27、Visual C+、Visual Basic、Delphi等語(yǔ)言,使得Intra3D 2.0的構(gòu)件適應(yīng)面更廣。二、分而治之分而治之是指把一個(gè)復(fù)雜的問(wèn)題分解成若干個(gè)簡(jiǎn)單的問(wèn)題,然后逐個(gè)解決。這種樸素的思想來(lái)源于人們生活與工作的經(jīng)驗(yàn),完全適合于技術(shù)領(lǐng)域。軟件人員在執(zhí)行分而治之的時(shí)候,應(yīng)該著重考慮:復(fù)雜問(wèn)題分解后,每個(gè)問(wèn)題能否用程序?qū)崿F(xiàn)?所有程序最終能否集成為一個(gè)軟件系統(tǒng)并有效解決原始的復(fù)雜問(wèn)題?圖1.4表示了軟件領(lǐng)域的分而治之策略。諸如軟件的體系結(jié)構(gòu)設(shè)計(jì)、模塊化設(shè)計(jì)都是分而治之的具體表現(xiàn)。軟件的分而治之不可以“硬分硬治”。不像為了吃一個(gè)西瓜或是一只雞,揮刀斬成n塊,再把每塊塞進(jìn)嘴里粉碎攪拌,然后交

28、由胃腸來(lái)消化吸收,象征復(fù)雜問(wèn)題的西瓜或是雞也就此消失了。圖1.1的設(shè)計(jì)方案充分體現(xiàn)了“分而治之”方法的有效性。Intra3D 2.0、DVL 2.0、CNC 2.0和GIVE+ 在設(shè)計(jì)和實(shí)現(xiàn)是都是獨(dú)立的,降低了開(kāi)發(fā)難度。而在應(yīng)用時(shí),它們可以方便的結(jié)合。例如使用Intra3D 2.0和DVL 2.0可以快速地開(kāi)發(fā)交互式數(shù)據(jù)可視化應(yīng)用軟件。結(jié)合Intra3D 2.0、DVL 2.0和CNC 2.0,可以快速開(kāi)發(fā)支持協(xié)同工作的交互式三維圖形與數(shù)據(jù)可視化應(yīng)用軟件,并且可以方便地將“模塊”加入到GIVE+的可視化集成環(huán)境中。軟件系統(tǒng)復(fù)雜問(wèn)題 解決原始問(wèn)題程序1子問(wèn)題1 分解 集成程序2子問(wèn)題2程序n子問(wèn)

29、題n圖1.4 軟件領(lǐng)域的分而治之策略三、優(yōu)化折衷軟件的優(yōu)化是指優(yōu)化軟件的各個(gè)質(zhì)量因素,如提高運(yùn)行速度,提高對(duì)內(nèi)存資源的利用率,使用戶界面更加友好,使三維圖形的真實(shí)感更強(qiáng)等等。想做好優(yōu)化工作,首先要讓開(kāi)發(fā)人員都有正確的認(rèn)識(shí):優(yōu)化工作不是可有可無(wú)的事情,而是必須要做的事情。當(dāng)優(yōu)化工作成為一種責(zé)任時(shí),程序員才會(huì)不斷改進(jìn)軟件中的算法,數(shù)據(jù)結(jié)構(gòu)和程序組織,從而提高軟件質(zhì)量。著名的3D游戲軟件Quake,能夠在PC機(jī)上實(shí)時(shí)地繪制高度真實(shí)感的復(fù)雜場(chǎng)景。Quake的開(kāi)發(fā)者能把很多成熟的圖形技術(shù)發(fā)揮到極致,例如把Bresenham畫(huà)線、多邊形裁剪、樹(shù)遍歷等算法的速度提高近一個(gè)數(shù)量級(jí)。我第一次看到Quake時(shí)不僅

30、感到震動(dòng),而且深受打擊。這個(gè)PC游戲軟件的技術(shù)水平已經(jīng)遠(yuǎn)勝于我所見(jiàn)識(shí)到的國(guó)內(nèi)領(lǐng)先的圖形學(xué)相關(guān)科研成果。這對(duì)我們?nèi)找媸⑿械狞c(diǎn)到完止的研發(fā)工作真是莫大的諷刺。所以當(dāng)我們開(kāi)發(fā)的軟件表現(xiàn)出很多不可救藥的病癥時(shí),不要怨機(jī)器差。真的是我們自己沒(méi)有把工作做好。優(yōu)化工作的復(fù)雜之處是很多目標(biāo)存在千絲萬(wàn)縷的關(guān)系,可謂數(shù)不清理還亂。當(dāng)不能夠使所有的目標(biāo)都得到優(yōu)化時(shí),就需要“折衷”的策略。軟件中的折衷策略是指通過(guò)協(xié)調(diào)各個(gè)質(zhì)量因素,實(shí)現(xiàn)整體質(zhì)量的最優(yōu)。軟件折衷的重要原則是不能使某一方損失關(guān)鍵的職能,更不可以象“舍魚(yú)而取熊掌”那樣拋棄一方。例如3D動(dòng)畫(huà)軟件的瓶頸通常是速度,但如果為了提高速度而在程序中取消光照明計(jì)算,那么

31、場(chǎng)景就會(huì)喪失真實(shí)感,3D動(dòng)畫(huà)也就不再有意義了(如果人類全是色盲,計(jì)算機(jī)圖形學(xué)將變得異常簡(jiǎn)單)。人都有惰性,如果允許濫用折衷的話,那么一當(dāng)碰到困難,人們就會(huì)用拆東墻補(bǔ)西墻的方式去折衷,不再下苦功去做有意義的優(yōu)化。所以我們有必要為折衷制定嚴(yán)正的立場(chǎng):在保證其它因素不差的前提下,使某些因素變得更好。Intra3D 2.0和DVL 2.0的核心都是基于OpenGL的對(duì)象庫(kù),這些對(duì)象庫(kù)對(duì)應(yīng)用軟件的圖形繪制性能有很大的影響。附錄A論述了OpenGL三維圖形程序性能優(yōu)化的方法,可以指導(dǎo)Intra3D 2.0、DVL 2.0及其應(yīng)用軟件的優(yōu)化工作。1.4 Intra3D 2.0系統(tǒng)設(shè)計(jì)系統(tǒng)設(shè)計(jì)是把需求轉(zhuǎn)化為軟

32、件系統(tǒng)的最重要的環(huán)節(jié)。系統(tǒng)設(shè)計(jì)的優(yōu)劣在根本上決定了軟件系統(tǒng)的質(zhì)量。本章在宏觀上講述Intra3D 2.0系統(tǒng)設(shè)計(jì)的五方面內(nèi)容:體系結(jié)構(gòu)設(shè)計(jì)、模塊設(shè)計(jì)、數(shù)據(jù)結(jié)構(gòu)與算法設(shè)計(jì)、“用戶界面設(shè)計(jì)美學(xué)”和“程序設(shè)計(jì)風(fēng)格”。林銳 2000a在進(jìn)行系統(tǒng)設(shè)計(jì)時(shí),我們要關(guān)注軟件的質(zhì)量因素,如正確性與精確性、性能與效率、易用性、可理解性與簡(jiǎn)法性、可復(fù)用性與可擴(kuò)充性等等。即使把系統(tǒng)設(shè)計(jì)做好了,也并不意味著就能產(chǎn)生好的軟件系統(tǒng)。在程序設(shè)計(jì)、測(cè)試、維護(hù)等環(huán)節(jié)還要做大量的工作,無(wú)論哪個(gè)環(huán)節(jié)出了差錯(cuò),都會(huì)把好事搞砸了。1.4.1 體系結(jié)構(gòu)設(shè)計(jì)原理體系結(jié)構(gòu)有兩個(gè)基本特征:(1)體系結(jié)構(gòu)是對(duì)復(fù)雜事物的抽象。良好的體系結(jié)構(gòu)是普遍適

33、用的,它可以高效地處理多種多樣的個(gè)體需求。一提起“房子”,我們的腦中馬上就會(huì)出現(xiàn)房子的印象?!胺孔印笔侨藗儗?duì)住宿或辦公環(huán)境的一種抽象。不論是辦公樓還是民房,同一類建筑物(甚至不同類的建筑物)之間都具有非常相似的體系結(jié)構(gòu)和構(gòu)造方式。(2)體系結(jié)構(gòu)在一定的時(shí)間內(nèi)保持穩(wěn)定。軟件開(kāi)發(fā)中最不希望發(fā)生的是需求變化,但“需求會(huì)發(fā)生變化”是個(gè)無(wú)法逃避的現(xiàn)實(shí)。人們希望在需求發(fā)生變化時(shí),最好只對(duì)軟件做些輕微的修改,如果此時(shí)不得不去修改軟件的體系結(jié)構(gòu),那么這個(gè)軟件的體系結(jié)構(gòu)設(shè)計(jì)是失敗的。良好的體系結(jié)構(gòu)意味著普適、高效和穩(wěn)定。圖1.1的方案中,Intra3D 2.0和DVL 2.0采用的是層次結(jié)構(gòu),而CNC 2.0和

34、GIVE+ 采用的是ClientServer(客戶機(jī)服務(wù)器)結(jié)構(gòu)。一、層次結(jié)構(gòu)(1)上下級(jí)關(guān)系的層次結(jié)構(gòu)上下級(jí)關(guān)系的層次結(jié)構(gòu)表達(dá)了這么一種常識(shí):有些事情比較復(fù)雜,我們沒(méi)法一下子做完,就把事情分為好幾層,一層一層地去做。上層的工作總是建立在下層的工作之上。上層子系統(tǒng)可以使用下層子系統(tǒng)的功能,而下層子系統(tǒng)不能夠使用上層子系統(tǒng)的功能。如同在軍隊(duì)中,上級(jí)可以命令任何下級(jí),而下級(jí)不能命令上級(jí)。(2)順序相鄰關(guān)系的層次結(jié)構(gòu)順序相鄰關(guān)系的層次結(jié)構(gòu)表明通訊只能在相鄰兩層之間發(fā)生,信息只能被一層一層地順序傳遞。這種層次結(jié)構(gòu)的經(jīng)典之作是計(jì)算機(jī)網(wǎng)絡(luò)的OSI參考模型。每一層的目的都是向它的上一層提供一定的服務(wù),而把如

35、何實(shí)現(xiàn)這一服務(wù)的細(xì)節(jié)對(duì)上一層加以屏蔽。一臺(tái)機(jī)器上的第n層與另一臺(tái)機(jī)器上的第n層進(jìn)行對(duì)話。通話的規(guī)則就是第n層的協(xié)議。數(shù)據(jù)不是從一臺(tái)機(jī)器的第n層直接傳送到另一臺(tái)機(jī)器的第n層。發(fā)送方把數(shù)據(jù)和控制信息逐層向下傳遞。最低層是物理介質(zhì),它進(jìn)行實(shí)際的通訊。接收方則將數(shù)據(jù)和控制信息逐層向上傳遞。當(dāng)網(wǎng)絡(luò)設(shè)計(jì)者在決定一個(gè)網(wǎng)絡(luò)應(yīng)包含多少層,每一層應(yīng)當(dāng)做什么的時(shí)候,其中很重要的工作是在相鄰層之間定義清晰的接口。接口可以使得同一層能輕易地用某一種實(shí)現(xiàn)(Implementation)來(lái)替換另一種完全不同的實(shí)現(xiàn)(如用衛(wèi)星信道來(lái)代替所有的電話線),只要新的實(shí)現(xiàn)能向上層提供同一組服務(wù)就可以了。Tanenbaum 1998(3

36、)其它的層次結(jié)構(gòu)目前在大型商業(yè)應(yīng)用軟件系統(tǒng)中還流行一種包含中間件(Middleware)的層次結(jié)構(gòu),如圖1.5所示。中間件支持與平臺(tái)無(wú)關(guān)的分布式計(jì)算,可以用DCOM和CORBA對(duì)象來(lái)實(shí)現(xiàn)。Application SystemsBusiness-specific ComponentsMiddlewareSystem Software圖1.5 包含中間件的層次結(jié)構(gòu)二、客戶機(jī)服務(wù)器結(jié)構(gòu)讓我們先回顧一下早期的電話系統(tǒng)。貝爾(Alexander Graham Bell)于1876年申請(qǐng)了電話專利。那時(shí)期的電話必須一對(duì)一對(duì)地賣,用戶自己在兩個(gè)電話之間拉一根線。如果一個(gè)電話用戶想和其它幾個(gè)電話用戶通話,他必

37、須拉n根單獨(dú)的線到每個(gè)人的房子里。于是在很短的時(shí)間內(nèi),城市里到處都是穿過(guò)房屋和樹(shù)木的混亂的電話線。很明顯,企圖把所有的電話完全互聯(lián)(如圖1.6(a)所示)是行不通的。 1.6(a)完全互聯(lián)的電話系統(tǒng) 1.6(b)集中交換式的電話系統(tǒng)貝爾電話公司在1878年開(kāi)辦了第一個(gè)交換局。公司為每個(gè)客戶架設(shè)一條線。打電話時(shí),客戶搖動(dòng)電話的曲柄使電話公司辦公室的鈴響起來(lái),操作員聽(tīng)到鈴聲以后根據(jù)要求將呼叫方和被呼叫方用跳線手工連接起來(lái)。這種集中交換式的模型如圖1.6(b)所示。很快地,貝爾系統(tǒng)的交換局就出現(xiàn)在各地。人們又要求能打城市間的長(zhǎng)途電話,就出現(xiàn)了二級(jí)交換局,以后進(jìn)一步發(fā)展為多個(gè)二級(jí)交換局。Tanenba

38、um 1998如果將圖1.6(b)中的電話看成是客戶程序,將中心的交換局看成是服務(wù)程序,那么圖1.6(b)就是典型的客戶機(jī)服務(wù)器結(jié)構(gòu)。注意這里客戶機(jī)和服務(wù)器都是指軟件而不是指硬件(一臺(tái)計(jì)算機(jī)可以放多個(gè)客戶機(jī)和服務(wù)器軟件)??蛻魴C(jī)服務(wù)器結(jié)構(gòu)存在兩個(gè)顯然的優(yōu)點(diǎn):(1)以集中的方式高效率地管理通訊。前面講電話系統(tǒng)的故事就是要說(shuō)明這一點(diǎn)。(2)可以共享資源。比如在信息管理系統(tǒng)中,服務(wù)器將信息集中起來(lái),任何客戶機(jī)都可以通過(guò)訪問(wèn)服務(wù)器而獲得所需的信息??蛻魴C(jī)和服務(wù)器之間的通訊以“請(qǐng)求響應(yīng)”的方式進(jìn)行??蛻魴C(jī)先向服務(wù)器發(fā)起“請(qǐng)求”,服務(wù)器再響應(yīng)這個(gè)請(qǐng)求,如圖1.7所示。采用“請(qǐng)求響應(yīng)”這種通訊方式的基本動(dòng)機(jī)

39、是為了解決“聚集”(Rendezvous)問(wèn)題。為了理解這一個(gè)問(wèn)題,設(shè)想一個(gè)人試圖在分離的機(jī)器上啟動(dòng)兩個(gè)程序并讓它們進(jìn)行通訊。還需記住,計(jì)算機(jī)的運(yùn)行速度要比人的操作速度高出許多數(shù)量級(jí)。在他啟動(dòng)第一個(gè)程序后,該程序開(kāi)始執(zhí)行并向?qū)Φ瘸绦虬l(fā)送消息。在幾個(gè)微秒內(nèi),它便發(fā)現(xiàn)對(duì)等程序還不存在,于是就發(fā)出一條錯(cuò)誤消息,然后退出。此后,他啟動(dòng)了第二個(gè)程序。不幸的是,當(dāng)?shù)诙€(gè)程序開(kāi)始執(zhí)行時(shí),它也找不到第一個(gè)程序(早已退出)。即使這兩個(gè)程序連續(xù)地重新試著通訊,但由于它們的執(zhí)行速度那么高,以致于它們?cè)谕凰查g聯(lián)系上的概率非常低。在客戶機(jī)服務(wù)器結(jié)構(gòu)中,服務(wù)器在啟動(dòng)后必須(無(wú)限期地)等待客戶機(jī)的“請(qǐng)求”,因此就形成了“

40、請(qǐng)求響應(yīng)”這種通訊方式Comer 1996。在Internet/Intranet領(lǐng)域,目前“瀏覽器Web 服務(wù)器數(shù)據(jù)庫(kù)服務(wù)器” 結(jié)構(gòu)是一種非常流行的客戶機(jī)服務(wù)器結(jié)構(gòu),如圖1.8所示。這種結(jié)構(gòu)最大的優(yōu)點(diǎn)是:客戶機(jī)統(tǒng)一采用瀏覽器軟件(如Microsoft公司或Netscape公司的瀏覽器),這不僅讓用戶使用方便,而且使得客戶機(jī)端不存在維護(hù)的問(wèn)題。當(dāng)然,軟件開(kāi)發(fā)布和維護(hù)的工作不是自動(dòng)消失了,而是轉(zhuǎn)移到了Web 服務(wù)器端。在Web 服務(wù)器端,程序員要用腳本語(yǔ)言編寫(xiě)響應(yīng)頁(yè)面。例如用Microsoft的ASP語(yǔ)言查詢數(shù)據(jù)庫(kù)服務(wù)器,將結(jié)果保存在Web 頁(yè)面中,再由瀏覽器顯示出來(lái)。 請(qǐng)求服務(wù)器客戶機(jī) 響應(yīng)圖1

41、.7 客戶機(jī)和服務(wù)器之間的通訊以“請(qǐng)求響應(yīng)”的方式進(jìn)行數(shù)據(jù)庫(kù)服務(wù)器Web 服務(wù)器客戶機(jī) ASP Engine瀏覽器 HTTP 請(qǐng)求 查詢 HTTP 響應(yīng) 圖1.8 “瀏覽器Web 服務(wù)器數(shù)據(jù)庫(kù)服務(wù)器”結(jié)構(gòu)1.4.2 Intra3D 2.0的層次結(jié)構(gòu)Intra3D 2.0采用上下級(jí)關(guān)系的層次結(jié)構(gòu),它將構(gòu)件庫(kù)分成四層,高層構(gòu)件可以引用低層構(gòu)件,但低層構(gòu)件不能引用高層構(gòu)件,如圖1.9所示。第一層為“基礎(chǔ)對(duì)象與函數(shù)”(Basic Objects and Functions),該層構(gòu)件集合記為B。第二層為“圖形對(duì)象”(Graphical Objects),該層構(gòu)件集合記為G。第三層為“場(chǎng)景圖與節(jié)點(diǎn)”(S

42、cene Graph and Nodes),該層的構(gòu)件集合記為S。第四層為“繪制與交互”(Rendering and Interaction),該層的構(gòu)件集合記為R。Intra3DCOM庫(kù)Intra3DC+類庫(kù) 4、 繪制與交互層 3、 場(chǎng)景圖與節(jié)點(diǎn)層 2、 圖形對(duì)象層 1、 基礎(chǔ)對(duì)象與函數(shù)層Window 9X/NT + OpenGL + Visual C+圖1.9 Intra3D 2.0 體系結(jié)構(gòu) Intra3D構(gòu)件庫(kù)的層次結(jié)構(gòu)具有良好的可擴(kuò)展性,表現(xiàn)在橫向擴(kuò)展與縱向擴(kuò)展兩方面。橫向擴(kuò)展有兩種:一是每層各自增加新構(gòu)件,如圖1.10(a)所示;二是兩個(gè)已存在的構(gòu)件庫(kù)合并成一個(gè)更大的構(gòu)件庫(kù),如圖

43、1.10(b)所示。縱向擴(kuò)展是指在Intra3D之上再擴(kuò)展新的開(kāi)發(fā)工具,縱向擴(kuò)展模型如圖1.11所示。R1R 2S1S2G1G2B1B2R2S2G2B2R1S1G1B1r1,r 2 s1,s2 g1,g2b1,b2r1,r2,r3 .s1,s2,s3.g1,g2,g3.b1,b2,b3. . 圖1.10(a) 每層各自增加新構(gòu)件 圖1.10(b) 兩個(gè)構(gòu)件庫(kù)合并成一個(gè)構(gòu)件庫(kù)R2 S2 G2 B23D 開(kāi)發(fā)工具 2 = R1 S1 G1 B13D 開(kāi)發(fā)工具 1 = 圖1.11 構(gòu)件庫(kù)縱向擴(kuò)展模型1.4.3 模塊設(shè)計(jì)原理在設(shè)計(jì)好軟件的體系結(jié)構(gòu)后,就已經(jīng)在宏觀上了解到各個(gè)模塊應(yīng)具有什么功能,應(yīng)放在體

44、系結(jié)構(gòu)的哪個(gè)位置。我們習(xí)慣地從功能上劃分模塊,保持“功能獨(dú)立”是模塊化設(shè)計(jì)的基本原則。因?yàn)椋肮δ塥?dú)立”的模塊可以降低開(kāi)發(fā)、測(cè)試、維護(hù)等階段的代價(jià)。但是“功能獨(dú)立”并不意味著模塊之間保持絕對(duì)的孤立。一個(gè)系統(tǒng)要完成某項(xiàng)任務(wù),需要各個(gè)模塊相互配合才能實(shí)現(xiàn),此時(shí)模塊之間就要進(jìn)行信息交流。比如手和腳是兩個(gè)“功能獨(dú)立”的模塊。沒(méi)有腳時(shí),手照樣能干活。沒(méi)有手時(shí),腳仍可以走路。但如果希望跑得快,那么邁左腳時(shí)一定要伸右臂甩左臂,邁右腳時(shí)則要伸左臂甩右臂。在設(shè)計(jì)一個(gè)模塊時(shí)不僅要考慮“這個(gè)模塊就該提供什么樣的功能”,還要考慮“這個(gè)模塊應(yīng)該怎樣與其它模塊交流信息”。有三個(gè)特征因素可以評(píng)價(jià)模塊設(shè)計(jì)的優(yōu)劣:“信息隱藏”

45、、“內(nèi)聚與耦合”和“封閉開(kāi)放性”。一、信息隱藏為了盡量避免某個(gè)模塊的行為去干擾同一系統(tǒng)中的其它模塊,在設(shè)計(jì)模塊時(shí)就要注意信息隱藏。應(yīng)該讓模塊僅僅公開(kāi)必須要讓外界知道的內(nèi)容,而隱藏其它一切內(nèi)容。模塊的信息隱藏可以通過(guò)接口設(shè)計(jì)來(lái)實(shí)現(xiàn)。一個(gè)模塊僅提供有限個(gè)接口(Interface),執(zhí)行模塊的功能或與模塊交流信息必須且只須通過(guò)調(diào)用公有接口來(lái)實(shí)現(xiàn)。如果模塊是一個(gè)C+對(duì)象,那么該模塊的公有接口就對(duì)應(yīng)于對(duì)象的公有函數(shù)。如果模塊是一個(gè)COM對(duì)象,那么該模塊的公有接口就是COM對(duì)象的接口。一個(gè)COM對(duì)象可以有多個(gè)接口,而每個(gè)接口實(shí)質(zhì)上是一些函數(shù)的集合。Rogerson 1999二、內(nèi)聚與耦合 內(nèi)聚(Cohes

46、ion)是一個(gè)模塊內(nèi)部各成分之間相關(guān)聯(lián)程度的度量。耦合(Coupling)是模塊之間依賴程度的度量。內(nèi)聚和耦合是密切相關(guān)的,與其它模塊存在強(qiáng)耦合的模塊通常意味著弱內(nèi)聚,而強(qiáng)內(nèi)聚的模塊通常意味著與其它模塊之間存在弱耦合。模塊設(shè)計(jì)追求強(qiáng)內(nèi)聚,弱耦合。內(nèi)聚按強(qiáng)度從低到高有以下幾種類型:(1)偶然內(nèi)聚。如果一個(gè)模塊的各成分之間毫無(wú)關(guān)系,則稱為偶然內(nèi)聚。(2)邏輯內(nèi)聚。幾個(gè)邏輯上相關(guān)的功能被放在同一模塊中,則稱為邏輯內(nèi)聚。如一個(gè)模塊讀取各種不同類型外設(shè)的輸入。盡管邏輯內(nèi)聚比偶然內(nèi)聚合理一些,但邏輯內(nèi)聚的模塊各成分在功能上并無(wú)關(guān)系,即使局部功能的修改有時(shí)也會(huì)影響全局,因此這類模塊的修改也比較困難。(3)時(shí)

47、間內(nèi)聚。如果一個(gè)模塊完成的功能必須在同一時(shí)間內(nèi)執(zhí)行(如系統(tǒng)初始化),但這些功能只是因?yàn)闀r(shí)間因素關(guān)聯(lián)在一起,則稱為時(shí)間內(nèi)聚。(4)過(guò)程內(nèi)聚。如果一個(gè)模塊內(nèi)部的處理成分是相關(guān)的,而且這些處理必須以特定的次序執(zhí)行,則稱為過(guò)程內(nèi)聚。(5)通信內(nèi)聚。如果一個(gè)模塊的所有成分都操作同一數(shù)據(jù)集或生成同一數(shù)據(jù)集,則稱為通信內(nèi)聚。(6)順序內(nèi)聚。如果一個(gè)模塊的各個(gè)成分和同一個(gè)功能密切相關(guān),而且一個(gè)成分的輸出作為另一個(gè)成分的輸入,則稱為順序內(nèi)聚。(7)功能內(nèi)聚。模塊的所有成分對(duì)于完成單一的功能都是必須的,則稱為功能內(nèi)聚。耦合的強(qiáng)度依賴于以下幾個(gè)因素:(1)一個(gè)模塊對(duì)另一個(gè)模塊的調(diào)用;(2)一個(gè)模塊向另一個(gè)模塊傳遞的

48、數(shù)據(jù)量;(3)一個(gè)模塊施加到另一個(gè)模塊的控制的多少;(4)模塊之間接口的復(fù)雜程度。耦合按從強(qiáng)到弱的順序可分為以下幾種類型:(1)內(nèi)容耦合。當(dāng)一個(gè)模塊直接修改或操作另一個(gè)模塊的數(shù)據(jù),或者直接轉(zhuǎn)入另一個(gè)模塊時(shí),就發(fā)生了內(nèi)容耦合。此時(shí),被修改的模塊完全依賴于修改它的模塊。(2)公共耦合。兩個(gè)以上的模塊共同引用一個(gè)全局?jǐn)?shù)據(jù)項(xiàng)就稱為公共耦合。(3)控制耦合。一個(gè)模塊在界面上傳遞一個(gè)信號(hào)(如開(kāi)關(guān)值、標(biāo)志量等)控制另一個(gè)模塊,接收信號(hào)的模塊的動(dòng)作根據(jù)信號(hào)值進(jìn)行調(diào)整,稱為控制耦合。(4)標(biāo)記耦合。模塊間通過(guò)參數(shù)傳遞復(fù)雜的內(nèi)部數(shù)據(jù)結(jié)構(gòu),稱為標(biāo)記耦合。此數(shù)據(jù)結(jié)構(gòu)的變化將使相關(guān)的模塊發(fā)生變化。(5)數(shù)據(jù)耦合。模塊間

49、通過(guò)參數(shù)傳遞基本類型的數(shù)據(jù),稱為數(shù)據(jù)耦合。(6)非直接耦合。模塊間沒(méi)有信息傳遞時(shí),屬于非直接耦合。如果模塊間必須存在耦合,就盡量使用數(shù)據(jù)耦合,少用控制耦合,限制公共耦合的范圍,堅(jiān)決避免使用內(nèi)容耦合。三、封閉開(kāi)放性如果一個(gè)模塊可以作為一個(gè)獨(dú)立體被其它程序引用,則稱模塊具有封閉性。如果一個(gè)模塊可以被擴(kuò)充,則稱模塊具有開(kāi)放性。從字面上看,讓模塊具有“封閉開(kāi)放性”是矛盾的,但這種特征在軟件開(kāi)發(fā)過(guò)程中是客觀存在的。當(dāng)著手一個(gè)新問(wèn)題時(shí),我們很難一次性解決問(wèn)題。應(yīng)該先縱觀問(wèn)題的一些重要方面,同時(shí)作好以后補(bǔ)充的準(zhǔn)備。因此讓模塊存在“開(kāi)放性”并不是壞事情?!胺忾]性”也是需要的,因?yàn)槲覀儾荒艿鹊酵耆莆战鉀Q問(wèn)題的

50、信息后再把程序做成別人能用的模塊。模塊的“封閉開(kāi)放性”實(shí)際上對(duì)應(yīng)于軟件質(zhì)量因素中的可復(fù)用性和可擴(kuò)充性。采用面向過(guò)程的方法進(jìn)行程序設(shè)計(jì),很難開(kāi)發(fā)出既具有封閉性又具有開(kāi)放性的模塊。采用面向?qū)ο笤O(shè)計(jì)方法可以較好地解決這個(gè)問(wèn)題。1.4.4 Intra3D 2.0的主要模塊與功能一、基礎(chǔ)對(duì)象與函數(shù)層(1)定義了用于對(duì)象引用計(jì)數(shù)的內(nèi)存管理基類;(2)矢量、矩陣與四元組運(yùn)算,鼠標(biāo)跟蹤球算法;(3)點(diǎn)陣字體與三維矢量字體輸出,常用于數(shù)據(jù)可視化圖形的數(shù)據(jù)標(biāo)注;(4)圖像輸入輸出以及紋理映射,支持BMP、GIF、JPEG、SGI、TGA等圖像格式;(5)常用幾何圖元的繪制,如錐、柱、球、環(huán)等,并支持Swept形體

51、,螺旋體的繪制;(6)提供450余種材質(zhì),在第四層中可以交互式編輯這些材質(zhì)。二、圖形對(duì)象層圖形對(duì)象能將數(shù)據(jù)轉(zhuǎn)化為幾何模型并可以繪制出來(lái)。Intra3D 2.0版提供了三類圖形對(duì)象:(1)常用幾何對(duì)象,如長(zhǎng)方體、錐體、圓柱體、球體、圓環(huán)體、Swept形體等;(2)多邊形模型對(duì)象,用于繪制Autodesk公司.3ds模型和Wavefront公司的.obj模型;(3)商業(yè)統(tǒng)計(jì)圖形對(duì)象,如柱形圖、帶狀圖、條形圖、折線圖、面積圖、餅圖、塔形圖、曲線圖、曲面圖、進(jìn)程圖、股票圖等。圖形對(duì)象的開(kāi)發(fā)與應(yīng)用問(wèn)題密切相關(guān),用戶可以使用繼承方法擴(kuò)充新的圖形對(duì)象,而不會(huì)影響到其它三層的構(gòu)件。三、場(chǎng)景圖與節(jié)點(diǎn)層場(chǎng)景圖(S

52、cene Graph)是有向無(wú)環(huán)圖,Scene Graph的主要節(jié)點(diǎn)有:(1)SceneNode是所有節(jié)點(diǎn)的基類。在SceneNode中定義了局部坐標(biāo)系以及相應(yīng)的圖形變換,這樣便于第四層以同樣的操作方式實(shí)現(xiàn)三維交互。(2)相機(jī)節(jié)點(diǎn)(CameraNode)支持平行投影與透視投影,支持多個(gè)相機(jī)切換。(3)光源節(jié)點(diǎn)有三種:平行光源節(jié)點(diǎn)(DirLightNode)、點(diǎn)光源節(jié)點(diǎn)(PointLightNode)和錐光源節(jié)點(diǎn)(SpotLightNode)。(4)形體節(jié)點(diǎn)(ShapeNode)用于引用圖形對(duì)象,有關(guān)圖形對(duì)象的三維交互均由ShapeNode處理。四、繪制與交互層Intra3D 2.0的交互分兩類

53、:一類是對(duì)形體、光源和相機(jī)的直接操作,另一類是真實(shí)感屬性的編輯。Intra3D的場(chǎng)景視窗構(gòu)件(SceneView)封裝了交互式繪制的所有細(xì)節(jié),如消息處理、場(chǎng)景節(jié)點(diǎn)的遍歷繪制、多重采樣消鋸齒、鼠標(biāo)交互等。為了便于編輯真實(shí)感屬性,Intra3D 2.0定制了一些常用對(duì)話:矢量字體對(duì)話(FontDialog)、顏色對(duì)話(ColorDialog)、材質(zhì)庫(kù)對(duì)話(MaterialLibDialog)、材質(zhì)對(duì)話(MaterialDialog)與光源對(duì)話(DirLightDialog, PointLightDialog, SpotLightDialog)。Intra3D 2.0 主要模塊對(duì)應(yīng)的C+類與COM對(duì)

54、象列表如下:模塊(.h, .cpp)C+ 類或函數(shù)COM 對(duì)象功能一、 基 礎(chǔ) 對(duì) 象 與 函 數(shù) 層Vector類VECTOR無(wú)矢量運(yùn)算Matrix函數(shù)無(wú)矩陣運(yùn)算Rotation類ROTATION無(wú)四元組與旋轉(zhuǎn)運(yùn)算Trackball類Trackball無(wú)鼠標(biāo)跟蹤球算法BitmapFont函數(shù)BitmapFont三種點(diǎn)陣字體與繪制Text3D類Text3DText3D矢量字體與繪制ImageIO函數(shù)無(wú)數(shù)字圖像輸入輸出Primitive函數(shù)Primitive繪制錐、柱、球、環(huán)等形體Material類MaterialMaterial含400余種材質(zhì)Texture2D類Texture2DTexture2D紋理映射二、 圖 形 對(duì) 象 層GraphicalObject類GraphicalObjectGraphicalObject圖形對(duì)象的基類Model3DS類Model3DSModel3DSAutodesk 公司的3DS 模型ModelOB

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論