版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
第5章軟件的總體設(shè)計(jì)
5.1總體設(shè)計(jì)的目標(biāo)和任務(wù)5.2設(shè)計(jì)的概念和原則5.3描繪軟件結(jié)構(gòu)的圖形工具5.4結(jié)構(gòu)化設(shè)計(jì)5.5數(shù)據(jù)庫(kù)設(shè)計(jì)及設(shè)計(jì)原則5.6接口設(shè)計(jì)5.7總體設(shè)計(jì)說(shuō)明書(shū)的編寫(xiě)5.8實(shí)戰(zhàn)訓(xùn)練
5.1總體設(shè)計(jì)的目標(biāo)和任務(wù)
5.1.1總體設(shè)計(jì)的目標(biāo)
在軟件設(shè)計(jì)階段應(yīng)達(dá)到的目標(biāo)是提高可靠性、可維護(hù)性、可理解性和效率,如圖5.1所示。圖5.1軟件設(shè)計(jì)的目標(biāo)軟件設(shè)計(jì)的目標(biāo)必須達(dá)到以下要求:
(1)軟件實(shí)體有明顯的層次結(jié)構(gòu),利于軟件元素間的控制。
(2)軟件實(shí)體應(yīng)該是模塊化的,模塊具有獨(dú)立功能。
(3)軟件實(shí)體與環(huán)境的界面清晰。
(4)設(shè)計(jì)規(guī)格說(shuō)明清晰、簡(jiǎn)潔、完整并無(wú)二義性。5.1.2總體設(shè)計(jì)的任務(wù)和步驟
在總體設(shè)計(jì)過(guò)程中要先進(jìn)行系統(tǒng)設(shè)計(jì),復(fù)審系統(tǒng)計(jì)劃與需求分析,確定系統(tǒng)具體的實(shí)施方案,然后進(jìn)行結(jié)構(gòu)設(shè)計(jì),確定軟件結(jié)構(gòu)??傮w設(shè)計(jì)的一般步驟如下:
(1)設(shè)計(jì)系統(tǒng)方案。
(2)選取一組合理的方案。
(3)推薦最佳實(shí)施方案。
(4)功能分解。
(5)設(shè)計(jì)軟件結(jié)構(gòu)。
(6)設(shè)計(jì)數(shù)據(jù)庫(kù)和文件結(jié)構(gòu)。
(7)制定測(cè)試計(jì)劃。
(8)編寫(xiě)概要設(shè)計(jì)文檔。
(9)審查與復(fù)審概要設(shè)計(jì)文檔。圖5.2總體設(shè)計(jì)的流程示意圖 5.2設(shè)計(jì)的概念和原則
5.2.1模塊化
模塊是數(shù)據(jù)說(shuō)明、可執(zhí)行語(yǔ)句等程序?qū)ο蟮募希菃为?dú)命名的,而且可通過(guò)名字來(lái)訪問(wèn)。例如,過(guò)程、函數(shù)、對(duì)象、類等都可作為模塊。
模塊化是指解決一個(gè)復(fù)雜問(wèn)題時(shí)自頂向下,逐步求精,把軟件系統(tǒng)劃分成若干模塊的過(guò)程。為了解決復(fù)雜問(wèn)題,在軟件設(shè)計(jì)中必須把整個(gè)問(wèn)題進(jìn)行分解,將一個(gè)復(fù)雜問(wèn)題變成多個(gè)簡(jiǎn)單的問(wèn)題,這樣便降低了問(wèn)題的復(fù)雜度,使得設(shè)計(jì)過(guò)程較容易,設(shè)計(jì)出的軟件也容易閱讀和理解。模塊化是開(kāi)發(fā)復(fù)雜的大型軟件系統(tǒng)必須采用的方法。模塊化可以使軟件結(jié)構(gòu)清晰,減少開(kāi)發(fā)工作量,降低開(kāi)發(fā)成本,提高軟件生產(chǎn)率,但是“模塊化”并不意味著模塊越多,劃分得越細(xì)就越好。模塊越多,模塊之間的接口就會(huì)越復(fù)雜,從而增加成本,降低效率。因此模塊數(shù)要適中。
事實(shí)上,模塊數(shù)目與成本存在如圖5.3所示的關(guān)系。
為了使復(fù)雜的大型程序能被人的智力所管理,模塊化應(yīng)是軟件必須具備的屬性。一個(gè)大型程序如果僅由一個(gè)模塊組成,將很難被人所理解。實(shí)際上,模塊化的依據(jù)是把復(fù)雜問(wèn)題分解成許多容易解決的小問(wèn)題,從而使原來(lái)的問(wèn)題變得容易解決。如果無(wú)限地分割軟件,最后為了開(kāi)發(fā)軟件而需要的工作量也就小得可以忽略了。但是還有一個(gè)因素在起作用,從而使得上述結(jié)論不能成立。如圖5.3所示,當(dāng)模塊數(shù)目增加時(shí)每個(gè)模塊的規(guī)模將減小,開(kāi)發(fā)單個(gè)模塊需要的成本(工作量)確實(shí)減少了。但是,隨著模塊的增加,設(shè)計(jì)模塊間接口所需要的工作量也將增加。根據(jù)這兩個(gè)因素得出圖5.3中的總成本曲線。從圖中可見(jiàn),每個(gè)程序相應(yīng)地有一個(gè)最適當(dāng)?shù)哪K數(shù)目M,使得系統(tǒng)的開(kāi)發(fā)成本最小。雖然目前還不能精確地決定M的數(shù)值,但是在考慮模塊化的時(shí)候總成本曲線確實(shí)是有用的指南。圖5.3軟件數(shù)目與模塊成本的關(guān)系模塊化使程序錯(cuò)誤通常局限在有關(guān)的模塊及它們之間的接口中,這使軟件容易測(cè)試和調(diào)試,因而有助于提高軟件的可靠性;修改軟件時(shí)變動(dòng)往往也只涉及少數(shù)模塊,能夠提高軟件的可維護(hù)性。模塊化還有助于軟件開(kāi)發(fā)工程的組織管理,一個(gè)復(fù)雜的大型程序可以由若干程序員分工編寫(xiě)不同的模塊,并可進(jìn)一步分配技術(shù)熟練的程序員編寫(xiě)困難的模塊。5.2.2抽象
人類在認(rèn)識(shí)復(fù)雜現(xiàn)象的過(guò)程中最強(qiáng)有力的思維工具是抽象。人們?cè)趯?shí)踐中認(rèn)識(shí)到,現(xiàn)實(shí)世界中一定事物、狀態(tài)或過(guò)程之間總存在著某些共性。把這些共性集中和概括起來(lái),暫時(shí)忽略它們之間的差異,這就是抽象。
由于人類思維能力的限制,如果每次面臨的因素太多,是不能做出精確思維的。處理復(fù)雜系統(tǒng)的唯一有效的方法是用層次的方式構(gòu)造和分析它。一個(gè)復(fù)雜的動(dòng)態(tài)系統(tǒng)首先可以用一些高級(jí)的抽象概念構(gòu)造和理解,這些高級(jí)概念又可以用一些較低級(jí)的概念構(gòu)造和理解,如此進(jìn)行下去,直至最低層次的具體元素。這種層次式的思維和解題方式必須反映在定義動(dòng)態(tài)系統(tǒng)的程序結(jié)構(gòu)之中,每級(jí)的一個(gè)概念將以某種方式對(duì)應(yīng)于程序的一組成分。當(dāng)考慮對(duì)任何問(wèn)題的模塊化解法時(shí),可以提出許多不同的抽象層次。在最高層次使用問(wèn)題環(huán)境的語(yǔ)言,以概括的方式敘述問(wèn)題的解法。在中間層次采用更過(guò)程化的方法,把面向問(wèn)題術(shù)語(yǔ)和面向?qū)崿F(xiàn)術(shù)語(yǔ)結(jié)合起來(lái)敘述問(wèn)題解法。在最低抽象層次用可以直接實(shí)現(xiàn)的方式敘述問(wèn)題的解法。軟件開(kāi)發(fā)過(guò)程的每一步都是對(duì)軟件解法的抽象層次的一次精化。在問(wèn)題定義研究階段,軟件是系統(tǒng)的一個(gè)完整部件;在需求分析期間,軟件解法是使用在問(wèn)題環(huán)境內(nèi)的方式描述;當(dāng)由總體設(shè)計(jì)向詳細(xì)設(shè)計(jì)過(guò)渡時(shí),抽象的程度也隨之減少了;最后,當(dāng)源程序?qū)懗鰜?lái)以后,也就到達(dá)了抽象的最低層。5.2.3逐步求精
逐步求精與模塊化以及抽象有著密切的聯(lián)系。在問(wèn)題分解過(guò)程中,人們常采用逐步求精的做法。逐步求精既是人類解決復(fù)雜問(wèn)題時(shí)采用的基本技術(shù)之一,也是軟件工程技術(shù)的基礎(chǔ)。所謂逐步求精,是“為了能集中精力解決主要問(wèn)題而盡量推遲問(wèn)題細(xì)節(jié)的考慮”??梢园阎鸩角缶暈橐环N技術(shù),即將在一個(gè)時(shí)期內(nèi)必須解決的各種問(wèn)題按優(yōu)先級(jí)排序的技術(shù)。逐步求精應(yīng)確保每一個(gè)問(wèn)題在適當(dāng)?shù)臅r(shí)候得到解決。5.2.4信息隱藏和局部化
信息隱藏是指:在設(shè)計(jì)和確定模塊時(shí),使得一個(gè)模塊內(nèi)包含的信息(過(guò)程和數(shù)據(jù))對(duì)于不需要這些信息的模塊來(lái)說(shuō)是不能訪問(wèn)的。
軟件設(shè)計(jì)應(yīng)該降低模塊與外部環(huán)境間的連接復(fù)雜性。為此,D.L.Parnas提出了信息隱藏的基本原則,其基本思想是:
(1)模塊內(nèi)部的數(shù)據(jù)和過(guò)程,對(duì)于那些不需要這些信息的模塊不可訪問(wèn);
(2)每一個(gè)模塊只完成一個(gè)相對(duì)獨(dú)立的特定功能;
(3)模塊之間只交換那些完成系統(tǒng)功能必須交換的信息。將信息隱藏作為模塊化系統(tǒng)設(shè)計(jì)的標(biāo)準(zhǔn),為軟件測(cè)試和維護(hù)提供了極大的便利。由于信息被隱藏在模塊內(nèi)部,一個(gè)模塊變更時(shí)所引起的錯(cuò)誤不易傳播到軟件的其他模塊。
局部化的概念和信息隱藏概念是密切相關(guān)的。局部化是指把一些關(guān)系密切的軟件元素物理地放得很近。模塊中使用局部數(shù)據(jù)元素是局部化的一個(gè)例子。顯然,局部化有助于實(shí)現(xiàn)信息隱藏?!半[藏”意味著有效的模塊化可以通過(guò)定義一組獨(dú)立的模塊來(lái)實(shí)現(xiàn),這些獨(dú)立的模塊彼此只交換那些為了完成系統(tǒng)功能而必須交換的信息。5.2.5模塊獨(dú)立性
所謂模塊的獨(dú)立性,是指軟件系統(tǒng)中每個(gè)模塊只涉及軟件要求的具體的子功能,而和軟件系統(tǒng)中其他模塊的接口是簡(jiǎn)單的。若一個(gè)模塊只具有單一的功能且與其他模塊沒(méi)有太多的聯(lián)系,那么,我們則稱此模塊具有模塊獨(dú)立性。
一般采用兩個(gè)準(zhǔn)則度量模塊獨(dú)立性,即模塊的內(nèi)聚性和模塊間的耦合性。
1.內(nèi)聚性
內(nèi)聚性是對(duì)模塊功能強(qiáng)度(一個(gè)模塊內(nèi)部各個(gè)元素彼此結(jié)合的緊密程度)的度量。一個(gè)內(nèi)聚程度高的模塊(在理想情況下)應(yīng)當(dāng)只做一件事。一般模塊的內(nèi)聚性分為七種類型,如圖5.4所示。圖5.4內(nèi)聚性的分類從上面的關(guān)系中可以看到,位于高端的幾種內(nèi)聚類型最好,位于中端的幾種內(nèi)聚類型是可以接受的,但位于低端的內(nèi)聚類型很不好,一般不能使用。因此,人們總是希望一個(gè)模塊的內(nèi)聚類型向高的方向靠。模塊的內(nèi)聚性在系統(tǒng)的模塊化設(shè)計(jì)中是一個(gè)關(guān)鍵的因素。
(1)巧合內(nèi)聚(偶然內(nèi)聚)。當(dāng)幾個(gè)模塊內(nèi)湊巧有一些程序段的代碼相同,又沒(méi)有明確表現(xiàn)出獨(dú)立的功能時(shí),把這些代碼獨(dú)立出來(lái)建立的模塊即為巧合內(nèi)聚模塊。它是內(nèi)聚程度最低的模塊。其缺點(diǎn)是模塊的內(nèi)容不易理解,模塊不易修改和維護(hù)。
(2)邏輯內(nèi)聚。這種模塊把幾種相關(guān)的功能組合在一起,每次被調(diào)用時(shí),由傳送給模塊的控制型參數(shù)來(lái)確定該模塊應(yīng)執(zhí)行哪一種功能。邏輯內(nèi)聚模塊比巧合內(nèi)聚模塊的內(nèi)聚程度要高,因?yàn)樗砻髁烁鞑糠种g在功能上的相關(guān)關(guān)系。
(3)時(shí)間內(nèi)聚(經(jīng)典內(nèi)聚)。這種模塊大多為多功能模塊,但要求模塊的各個(gè)功能必須在同一時(shí)間段內(nèi)執(zhí)行,例如初始化模塊和終止模塊。時(shí)間內(nèi)聚模塊比邏輯內(nèi)聚模塊的內(nèi)聚程度又稍高一些。在一般情況下,時(shí)間內(nèi)聚模塊各部分可以以任意的順序執(zhí)行,所以它的內(nèi)部邏輯更簡(jiǎn)單。
(4)過(guò)程內(nèi)聚。使用流程圖作為工具設(shè)計(jì)程序時(shí),常常通過(guò)流程圖來(lái)確定模塊劃分。把流程圖中的某一部分劃出組成模塊,就得到過(guò)程內(nèi)聚模塊。這類模塊的內(nèi)聚程度比時(shí)間內(nèi)聚模塊的內(nèi)聚程度更強(qiáng)一些。
(5)通信內(nèi)聚。如果一個(gè)模塊內(nèi)各功能部分都使用了相同的輸入數(shù)據(jù)或產(chǎn)生了相同的輸出數(shù)據(jù),則稱之為通信內(nèi)聚模塊。通常,通信內(nèi)聚模塊是通過(guò)數(shù)據(jù)流圖來(lái)定義的,如圖5.5所示。圖5.5通信內(nèi)聚模塊
(6)信息內(nèi)聚(順序內(nèi)聚)。這種模塊完成多個(gè)功能,各個(gè)功能都在同一數(shù)據(jù)結(jié)構(gòu)上操作,每一項(xiàng)功能有一個(gè)唯一的入口點(diǎn)。例如,圖5.6所示的模塊具有4個(gè)功能,由于模塊的所有功能都基于同一個(gè)數(shù)據(jù)結(jié)構(gòu)(符號(hào)表),因此,它是一個(gè)信息內(nèi)聚的模塊。
信息內(nèi)聚模塊可以看成是多個(gè)功能內(nèi)聚模塊的組合,而且達(dá)到了信息的隱藏,即把某個(gè)數(shù)據(jù)結(jié)構(gòu)、資源或設(shè)備隱藏在一個(gè)模塊內(nèi),不為別的模塊所知曉。當(dāng)把程序某些方面的細(xì)節(jié)隱藏在一個(gè)模塊中時(shí),就增加了模塊的獨(dú)立性。圖5.6信息內(nèi)聚模塊
(7)功能內(nèi)聚。若一個(gè)模塊中各個(gè)部分都是為完成一項(xiàng)具體功能而協(xié)同工作、緊密聯(lián)系、不可分割的,則稱該模塊為功能內(nèi)聚模塊。功能內(nèi)聚模塊是內(nèi)聚性最強(qiáng)的模塊。
2.耦合性
耦合性是對(duì)模塊之間的相對(duì)獨(dú)立性(互相連接的緊密程度)的度量。它取決于各個(gè)模塊之間接口的復(fù)雜程度、調(diào)用模塊的方式以及哪些信息通過(guò)接口。
一般模塊之間可能的連接方式有七種,構(gòu)成耦合性的七種類型。不同類型耦合的強(qiáng)弱關(guān)系如圖5.7所示。圖5.7耦合性的分類
(1)內(nèi)容耦合。如果一個(gè)模塊直接訪問(wèn)另一個(gè)模塊的內(nèi)部數(shù)據(jù),或者一個(gè)模塊不通過(guò)正常入口轉(zhuǎn)到另一模塊內(nèi)部,或者兩個(gè)模塊有一部分程序代碼重疊,或者一個(gè)模塊有多個(gè)入口,則兩個(gè)模塊之間就發(fā)生了內(nèi)容耦合。在內(nèi)容耦合的情形下,被訪問(wèn)模塊的任何變更,或者用不同的編譯器對(duì)它再編譯,都會(huì)造成程序出錯(cuò)。這種耦合是模塊獨(dú)立性最弱的耦合。
(2)公共耦合。若一組模塊都訪問(wèn)同一個(gè)公共數(shù)據(jù)環(huán)境,則它們之間的耦合就稱為公共耦合,如圖5.8所示。圖5.8公共耦合
(3)外部耦合。若一組模塊都訪問(wèn)同一全局簡(jiǎn)單變量而不是同一全局?jǐn)?shù)據(jù)結(jié)構(gòu),而且不是通過(guò)參數(shù)表傳遞該全局變量的信息,則這些模塊間的耦合稱為外部耦合。
(4)控制耦合。如果一個(gè)模塊通過(guò)傳送開(kāi)關(guān)、標(biāo)志、名字等控制信息,明顯地控制選擇另一模塊的功能,則它們之間的耦合稱為控制耦合,如圖5.9所示。
(5)標(biāo)記耦合。如果一組模塊通過(guò)參數(shù)表傳遞記錄信息,則它們之間的耦合稱為標(biāo)記耦合。事實(shí)上,這組模塊共享了某一數(shù)據(jù)結(jié)構(gòu)的子結(jié)構(gòu),而不是簡(jiǎn)單變量。這就要求這些模塊都必須清楚該記錄的結(jié)構(gòu),并按結(jié)構(gòu)要求對(duì)記錄進(jìn)行操作。圖5.9控制耦合
(6)數(shù)據(jù)耦合。如果一個(gè)模塊訪問(wèn)另一個(gè)模塊時(shí),彼此之間通過(guò)數(shù)據(jù)參數(shù)(不是控制參數(shù)、公共數(shù)據(jù)結(jié)構(gòu)或外部變量)來(lái)交換輸入、輸出信息,而且交換的信息僅限于數(shù)據(jù),則稱這種耦合為數(shù)據(jù)耦合。數(shù)據(jù)耦合是松散的耦合,模塊之間的獨(dú)立性比較強(qiáng)。
(7)非直接耦合。如果兩個(gè)模塊之間沒(méi)有直接關(guān)系,它們之間的聯(lián)系完全是通過(guò)主模塊的控制和調(diào)用來(lái)實(shí)現(xiàn)的,那它們之間就是非直接耦合。這種耦合的模塊獨(dú)立性最強(qiáng)。
實(shí)際上,開(kāi)始時(shí)兩個(gè)模塊之間的耦合不只是一種類型,而是多種類型的混合。這就要求設(shè)計(jì)人員進(jìn)行分析、比較,逐步加以改進(jìn),以提高模塊的獨(dú)立性。 5.3描繪軟件結(jié)構(gòu)的圖形工具
5.3.1HIPO圖
HIPO圖(HierachicalInputProcessOutput,分層的輸入處理輸出圖)是由IBM公司發(fā)明的,是用于描述軟件結(jié)構(gòu)的圖形工具。它實(shí)質(zhì)上是在描述軟件總體模塊結(jié)構(gòu)的層次圖(H圖)的基礎(chǔ)上,加入了用于描述每個(gè)模塊輸入/輸出數(shù)據(jù)和處理功能的IPO圖,因此它的中文全名為層次圖加輸入/處理/輸出圖。
1.層次圖(H圖)
層次圖(H圖)用于描繪軟件的層次結(jié)構(gòu)。層次圖中的一個(gè)矩形框代表一個(gè)模塊,框間的連線表示調(diào)用關(guān)系,位于上方的矩形框所代表的模塊調(diào)用位于下方的矩形框所代表的模塊。圖5.10是一個(gè)層次圖的例子。為了使HIPO圖具有可追蹤性,在H圖里除了頂層的方框之外,每個(gè)圖框都加了編號(hào)。例如,把圖5.10加了編號(hào)之后得到圖5.11。層次圖適合于在自頂向下設(shè)計(jì)軟件的過(guò)程中使用。圖5.10考務(wù)管理系統(tǒng)的H圖圖5.11加編號(hào)的考務(wù)管理系統(tǒng)的H圖
2.IPO圖
IPO圖是輸入/處理/輸出圖的簡(jiǎn)稱,它是用來(lái)描繪加工說(shuō)明的圖形工具。IPO圖包括三個(gè)矩形框,左邊框列出所有輸入數(shù)據(jù),中間框列出主要處理,右邊框列出輸出數(shù)據(jù),三個(gè)框中間用空心箭頭指出數(shù)據(jù)通信情況。如圖5.12中給出了主文件更新的IPO圖。圖5.12IPO圖實(shí)例
IPO圖能夠方便、清晰地描繪出模塊的輸入數(shù)據(jù)、加工和輸出數(shù)據(jù)之間的關(guān)系。與H圖中的每個(gè)圖框相對(duì)應(yīng),應(yīng)該有一張IPO圖描述這個(gè)圖框代表的模塊的處理過(guò)程,作為對(duì)層次圖中內(nèi)容的補(bǔ)充說(shuō)明。每張IPO圖內(nèi)都應(yīng)該明顯地標(biāo)出它所描繪的模塊在H圖中的編號(hào),以便確定這個(gè)模塊在軟件結(jié)構(gòu)中的位置。
IPO圖的基本形式為:在圖中左邊的框中列出模塊涉及的所有輸入數(shù)據(jù),在中間的框中列出主要的加工,在右邊的框中列出處理后產(chǎn)生的輸出數(shù)據(jù);圖中的箭頭用于指明輸入數(shù)據(jù)、加工和輸出結(jié)果之間的關(guān)系。考務(wù)管理系統(tǒng)中的考務(wù)處理模塊的IPO圖如圖5.13所示。圖5.13考務(wù)管理系統(tǒng)中的考務(wù)處理模塊的IPO圖5.3.2系統(tǒng)結(jié)構(gòu)圖
系統(tǒng)結(jié)構(gòu)圖(SC)是描繪系統(tǒng)結(jié)構(gòu)的圖形工具,它描述了系統(tǒng)由哪些模塊組成、程序中模塊之間的調(diào)用關(guān)系、每個(gè)模塊“做什么”以及每個(gè)模塊的輸入和輸出。結(jié)構(gòu)圖是結(jié)構(gòu)化設(shè)計(jì)中的一個(gè)十分重要的結(jié)果。
系統(tǒng)結(jié)構(gòu)圖中的基本符號(hào)和含義如表5.1所示。
表5.1系統(tǒng)結(jié)構(gòu)圖中的基本符號(hào)和含義 5.4結(jié)?構(gòu)?化?設(shè)?計(jì)
從系統(tǒng)設(shè)計(jì)的角度出發(fā),軟件設(shè)計(jì)方法可以分為三大類:第一類根據(jù)系統(tǒng)的數(shù)據(jù)流進(jìn)行設(shè)計(jì),稱為面向數(shù)據(jù)流的設(shè)計(jì)或者過(guò)程驅(qū)動(dòng)的設(shè)計(jì),以結(jié)構(gòu)化設(shè)計(jì)(StructuredDesign,SD)方法為代表;第二類根據(jù)系統(tǒng)的數(shù)據(jù)結(jié)構(gòu)進(jìn)行設(shè)計(jì),稱為面向數(shù)據(jù)結(jié)構(gòu)的設(shè)計(jì)或者數(shù)據(jù)驅(qū)動(dòng)的設(shè)計(jì),以LCP(程序邏輯構(gòu)造)方法、Jackson系統(tǒng)開(kāi)發(fā)方法和數(shù)據(jù)結(jié)構(gòu)化系統(tǒng)開(kāi)發(fā)(DSSD)方法為代表;第三類設(shè)計(jì)方法即面向?qū)ο蟮脑O(shè)計(jì)。結(jié)構(gòu)化設(shè)計(jì)方法是在模塊化、自頂向下逐步細(xì)化、結(jié)構(gòu)化程序設(shè)計(jì)等程序設(shè)計(jì)技術(shù)基礎(chǔ)上發(fā)展起來(lái)的。該方法實(shí)施的要點(diǎn)是:①建立數(shù)據(jù)流的類型;②指明流的邊界;③將數(shù)據(jù)流圖映射為程序結(jié)構(gòu);④用“因子化”方法定義控制的層次結(jié)構(gòu);⑤用設(shè)計(jì)測(cè)量和一些啟發(fā)式規(guī)則對(duì)結(jié)構(gòu)進(jìn)行細(xì)化。圖5.14面向數(shù)據(jù)流設(shè)計(jì)的流程圖5.4.1系統(tǒng)結(jié)構(gòu)圖中的模塊
在系統(tǒng)結(jié)構(gòu)圖中不能再分解的底層模塊稱為原子模塊。如果一個(gè)軟件系統(tǒng)的全部實(shí)際加工(數(shù)據(jù)計(jì)算或處理)都由底層的原子模塊來(lái)完成,而其他所有非原子模塊僅僅執(zhí)行控制或協(xié)調(diào)功能,這樣的系統(tǒng)就是完全因子分解的系統(tǒng)。如果系統(tǒng)結(jié)構(gòu)圖是完全因子分解的,那該系統(tǒng)就是最好的系統(tǒng)。一般地,在系統(tǒng)結(jié)構(gòu)圖中有4種類型的模塊(見(jiàn)圖5.15):
■傳入模塊:從下屬模塊取得數(shù)據(jù),經(jīng)過(guò)某些處理,再將其傳送給上級(jí)模塊。
■傳出模塊:從上級(jí)模塊獲得數(shù)據(jù),進(jìn)行某些處理,再將其傳送給下屬模塊?!鲎儞Q模塊:加工模塊。它從上級(jí)模塊取得數(shù)據(jù),進(jìn)行特定的處理,轉(zhuǎn)換成其他形式,再傳送回上級(jí)模塊。大多數(shù)計(jì)算模塊(原子模塊)屬于這一類。
■協(xié)調(diào)模塊:對(duì)所有下屬模塊進(jìn)行協(xié)調(diào)和管理的模塊。在系統(tǒng)的輸入/輸出部分或數(shù)據(jù)加工部分可以找到這樣的模塊。在一個(gè)好的系統(tǒng)結(jié)構(gòu)圖中,協(xié)調(diào)模塊應(yīng)在較高層出現(xiàn)。
在實(shí)際系統(tǒng)中,有些模塊屬于上述某一類型,還有一些模塊是上述各種類型的組合。圖5.15系統(tǒng)結(jié)構(gòu)圖的四種模塊類型5.4.2變換型數(shù)據(jù)流與變換型系統(tǒng)結(jié)構(gòu)
變換型數(shù)據(jù)流處理問(wèn)題的工作過(guò)程大致分為三步,即取得數(shù)據(jù)、變換數(shù)據(jù)和給出數(shù)據(jù),如圖5.16所示。這三步反映了變換型問(wèn)題數(shù)據(jù)流的基本思想。其中,變換數(shù)據(jù)是數(shù)據(jù)處理過(guò)程的核心工作,而取得數(shù)據(jù)只不過(guò)是為它做準(zhǔn)備,給出數(shù)據(jù)則是對(duì)變換后的數(shù)據(jù)進(jìn)行處理工作。圖5.16變換型數(shù)據(jù)流變換型系統(tǒng)結(jié)構(gòu)如圖5.17所示,對(duì)應(yīng)于取得數(shù)據(jù)、變換數(shù)據(jù)、給出數(shù)據(jù),系統(tǒng)的結(jié)構(gòu)圖由輸入、中心變換和輸出等三部分組成。圖5.17變換型系統(tǒng)結(jié)構(gòu)圖5.4.3事務(wù)流與事務(wù)型系統(tǒng)結(jié)構(gòu)
事務(wù)型數(shù)據(jù)處理問(wèn)題的工作機(jī)理是接受一項(xiàng)事務(wù),根據(jù)事務(wù)處理的特點(diǎn)和性質(zhì),選擇分派一個(gè)適當(dāng)?shù)奶幚韱卧缓蠼o出結(jié)果。我們把完成選擇分派任務(wù)的部分叫做事務(wù)處理中心或分派部件。這種事務(wù)型數(shù)據(jù)處理問(wèn)題的數(shù)據(jù)流圖如圖5.18所示。其中,輸入數(shù)據(jù)流在事務(wù)中心T處做出選擇,激活某一種事務(wù)處理加工。D1~D4是并列的供選擇的事務(wù)處理加工。
事務(wù)型數(shù)據(jù)流圖所對(duì)應(yīng)的系統(tǒng)結(jié)構(gòu)圖就是事務(wù)型系統(tǒng)結(jié)構(gòu)圖,如圖5.19所示。圖5.18事務(wù)型數(shù)據(jù)流圖圖5.19事務(wù)型系統(tǒng)結(jié)構(gòu)圖在事務(wù)型系統(tǒng)結(jié)構(gòu)圖中,事務(wù)中心模塊按所接收的事務(wù)的類型,選擇某一個(gè)事務(wù)處理模塊執(zhí)行。各個(gè)事務(wù)處理模塊是并列的,依賴于一定的選擇條件,分別完成不同的事務(wù)處理工作。每個(gè)事務(wù)處理模塊可能要調(diào)用若干個(gè)操作模塊,而操作模塊又可能調(diào)用若干個(gè)細(xì)節(jié)模塊。不同的事務(wù)處理模塊可以共享一些操作模塊。同樣,不同的操作模塊又可以共享一些細(xì)節(jié)模塊。
事務(wù)型系統(tǒng)結(jié)構(gòu)圖在數(shù)據(jù)處理中經(jīng)常遇到,但是更多的是變換型與事務(wù)型系統(tǒng)結(jié)構(gòu)圖的結(jié)合。例如,變換型系統(tǒng)結(jié)構(gòu)中的某個(gè)變換模塊本身又具有事務(wù)型的特點(diǎn)。5.4.4變換映射
變換映射是系統(tǒng)結(jié)構(gòu)設(shè)計(jì)的一種策略。運(yùn)用變換映射方法建立初始的變換型系統(tǒng)結(jié)構(gòu)圖,然后對(duì)它做進(jìn)一步的改進(jìn),最后得到系統(tǒng)的最終結(jié)構(gòu)圖。設(shè)計(jì)的步驟如下。
步驟1:復(fù)審基本系統(tǒng)模型(0層數(shù)據(jù)流圖和支持信息)。評(píng)估系統(tǒng)規(guī)格說(shuō)明和軟件需求規(guī)格說(shuō)明。
步驟2:復(fù)審和細(xì)化軟件的數(shù)據(jù)流圖。重畫(huà)數(shù)據(jù)流圖時(shí),可以從物理輸入到物理輸出,或者相反;還可以從頂層加工框開(kāi)始,逐層向下。步驟3:確定數(shù)據(jù)流圖中是含有變換流特征還是含有事務(wù)流特征。通常,系統(tǒng)的信息流總能表示為變換型,但其中也可能遇到明顯的事務(wù)流特征,這時(shí)可采用變換型為主,在局部范圍采用事務(wù)型的設(shè)計(jì)方法。
步驟4:區(qū)分輸入流、輸出流和中心變換部分,即標(biāo)明流的邊界。不同的設(shè)計(jì)人員可能選擇不同的流邊界,這將導(dǎo)致不同的系統(tǒng)結(jié)構(gòu)圖。
步驟5:進(jìn)行一級(jí)“因子化”分解,設(shè)計(jì)頂層和第一層模塊。首先設(shè)計(jì)主模塊,用程序名字為它命名,將它畫(huà)在與中心變換相對(duì)應(yīng)的位置上。作為系統(tǒng)的頂層,它調(diào)用下層模塊,完成系統(tǒng)所要做的各項(xiàng)工作。系統(tǒng)結(jié)構(gòu)第一層的設(shè)計(jì)方針是:為每一個(gè)邏輯輸入設(shè)計(jì)一個(gè)輸入模塊,它為主模塊提供數(shù)據(jù);為每一個(gè)邏輯輸出設(shè)計(jì)一個(gè)輸出模塊,它將主模塊提供的數(shù)據(jù)輸出;為中心變換設(shè)計(jì)一個(gè)變換模塊,它將邏輯輸入轉(zhuǎn)換成邏輯輸出。第一層模塊與主模塊之間傳送的數(shù)據(jù)應(yīng)與數(shù)據(jù)流圖相對(duì)應(yīng)。步驟6:進(jìn)行二級(jí)“因子化”分解,設(shè)計(jì)中、下層模塊。這一步工作是自頂向下、逐層細(xì)化,為每一個(gè)輸入模塊、輸出模塊、變換模塊設(shè)計(jì)它們的從屬模塊。
輸入模塊要向調(diào)用它的上級(jí)模塊提供數(shù)據(jù),因而它必須有兩個(gè)下屬模塊。其中,一個(gè)用來(lái)接收數(shù)據(jù),另一個(gè)用來(lái)把這些數(shù)據(jù)變換成它的上級(jí)模塊所需的數(shù)據(jù)。輸出模塊是從調(diào)用它的上級(jí)模塊接收數(shù)據(jù),用以輸出,因而也應(yīng)當(dāng)有兩個(gè)下屬模塊:一個(gè)用來(lái)將上級(jí)模塊提供的數(shù)據(jù)變換成輸出的形式;另一個(gè)用來(lái)將它們輸出。中心變換模塊的下層模塊沒(méi)有通用的設(shè)計(jì)方法,一般應(yīng)參照數(shù)據(jù)流圖的中心變換部分和功能分解的原則來(lái)考慮如何對(duì)中心變換模塊進(jìn)行分解。步驟7:利用一些啟發(fā)式原則來(lái)改進(jìn)系統(tǒng)的初始結(jié)構(gòu)圖,直到得到符合要求的結(jié)構(gòu)圖為止。這些啟發(fā)式原則大致如下:
(1)模塊功能的完善化。一個(gè)完整的功能模塊不僅應(yīng)能完成指定的功能,而且還應(yīng)當(dāng)能夠告訴使用者完成任務(wù)的狀態(tài)以及不能完成的原因。
(2)消除重復(fù)功能,改善軟件結(jié)構(gòu)。在系統(tǒng)的初始結(jié)構(gòu)圖得出之后,應(yīng)當(dāng)審查、分析這個(gè)結(jié)構(gòu)圖。如果發(fā)現(xiàn)幾個(gè)模塊的功能有相似之處,可以加以改進(jìn)。
(3)模塊的作用范圍應(yīng)在控制范圍之內(nèi)。模塊的控制范圍包括它本身及其所有的從屬模塊。模塊的作用范圍是指模塊內(nèi)一個(gè)判定的作用范圍,凡是受這個(gè)判定影響的所有模塊都屬于這個(gè)判定的作用范圍。如果一個(gè)判定的作用范圍包含在這個(gè)判定所在模塊的控制范圍之內(nèi),則這種結(jié)構(gòu)是簡(jiǎn)單的,否則,它的結(jié)構(gòu)是復(fù)雜的。
(4)盡可能減少高扇出結(jié)構(gòu)。經(jīng)驗(yàn)證明,一個(gè)設(shè)計(jì)得很好的軟件模塊結(jié)構(gòu),通常其上層扇出比較高,中層扇出較少,底層扇入到有高扇入的公用模塊中。
(5)避免或減少使用病態(tài)連接。應(yīng)限制使用直接病態(tài)連接(內(nèi)容耦合)、公共數(shù)據(jù)域病態(tài)連接(公共耦合)和通過(guò)通信模塊連接這三種病態(tài)連接。
(6)模塊的大小要適中。限制模塊的大小是減少?gòu)?fù)雜性的手段之一,因而要求把模塊的大小限制在一定的范圍之內(nèi)。通常規(guī)定其語(yǔ)句行數(shù)在50~100之間,最多不超過(guò)500行。
(7)設(shè)計(jì)功能可預(yù)測(cè)的模塊,但要避免過(guò)分受限制的模塊。一個(gè)功能可預(yù)測(cè)的模塊不論內(nèi)部處理細(xì)節(jié)如何,對(duì)于相同的輸入數(shù)據(jù),總能產(chǎn)生同樣的結(jié)果。但是,如果模塊內(nèi)部蘊(yùn)藏有一些特殊的鮮為人知的功能,這個(gè)模塊就可能是不可預(yù)測(cè)的。對(duì)于這種模塊,如果調(diào)用者不小心使用,其結(jié)果將不可預(yù)測(cè)。調(diào)用者無(wú)法控制這個(gè)模塊的執(zhí)行,或者不能預(yù)知將會(huì)引起什么后果,最終會(huì)造成混亂。為了能夠適應(yīng)將來(lái)的變更,軟件模塊中局部數(shù)據(jù)結(jié)構(gòu)的大小應(yīng)當(dāng)是可控制的,調(diào)用者可以通過(guò)模塊接口上的參數(shù)表或一些預(yù)定義外部參數(shù)來(lái)規(guī)定或改變局部數(shù)據(jù)結(jié)構(gòu)的大小。另外,控制流的選擇對(duì)于調(diào)用者來(lái)說(shuō)應(yīng)當(dāng)是可預(yù)測(cè)的,而與外界的接口應(yīng)當(dāng)是靈活的。也可以用改變某些參數(shù)的值來(lái)調(diào)整接口的信息,以適應(yīng)未來(lái)的變更。
(8)軟件包應(yīng)滿足設(shè)計(jì)約束和可移植性。5.4.5事務(wù)映射
在很多應(yīng)用中,存在某種作業(yè)數(shù)據(jù)流,它可以引發(fā)一個(gè)或多個(gè)處理,這種數(shù)據(jù)流就叫做事務(wù)。與變換映射類似,事務(wù)映射也是從分析數(shù)據(jù)流圖開(kāi)始,自頂向下、逐步分解地建立系統(tǒng)結(jié)構(gòu)圖的,所不同的是它們由數(shù)據(jù)流圖映射成的系統(tǒng)結(jié)構(gòu)圖不同。
步驟1:復(fù)審基本系統(tǒng)模型。
步驟2:復(fù)審和細(xì)化軟件的數(shù)據(jù)流圖。
步驟3:確定數(shù)據(jù)流圖中含有變換流特征還是含有事務(wù)流特征。以上三步與變換映射中的相應(yīng)工作相同。
步驟4:識(shí)別事務(wù)中心和每一條操作路徑上的流特征。事務(wù)中心通常位于幾條操作路徑的起始點(diǎn)上,可以從數(shù)據(jù)流圖上直接找出來(lái)。輸入路徑必須與其他所有操作路徑區(qū)分開(kāi)來(lái)。
步驟5:將數(shù)據(jù)流圖映射到事務(wù)型系統(tǒng)結(jié)構(gòu)圖上。事務(wù)流映射到包含一個(gè)輸入分支和一個(gè)分類事務(wù)處理分支的程序結(jié)構(gòu)上。輸入分支結(jié)構(gòu)的開(kāi)發(fā)與變換流的方法類似。分類事務(wù)處理分支結(jié)構(gòu)包含一個(gè)調(diào)度模塊,它調(diào)度和控制下屬的操作模塊。步驟6:“因子化”分解、細(xì)化該事務(wù)結(jié)構(gòu)和每一條操作路徑的結(jié)構(gòu)。每一條操作路徑的數(shù)據(jù)流圖有它自己的信息流特征,可以是變換流也可以是事務(wù)流。與每一條操作路徑相關(guān)的子結(jié)構(gòu)可以依照前面介紹的設(shè)計(jì)步驟進(jìn)行開(kāi)發(fā)。
步驟7:利用一些啟發(fā)式原則來(lái)改進(jìn)系統(tǒng)的初始結(jié)構(gòu)圖。5.4.6“黑盒”技術(shù)的使用
在設(shè)計(jì)當(dāng)前模塊時(shí),先把這個(gè)模塊的所有下層模塊定義成“黑盒”,并在系統(tǒng)設(shè)計(jì)中利用它們,暫時(shí)不考慮它們的內(nèi)部結(jié)構(gòu)和實(shí)現(xiàn)方法。在這一步定義好的“黑盒”,由于已確定了它的功能和輸入、輸出,在下一步就可以對(duì)它們進(jìn)行設(shè)計(jì)和加工。這樣,又會(huì)導(dǎo)致更多的“黑盒”。最后,全部“黑盒”的內(nèi)容和結(jié)構(gòu)應(yīng)完全被確定。這就是我們所說(shuō)的自頂向下、逐步求精的過(guò)程。使用黑盒技術(shù)的主要好處是使設(shè)計(jì)人員可以只關(guān)心當(dāng)前的有關(guān)問(wèn)題,暫時(shí)不必考慮進(jìn)一步的瑣碎的次要細(xì)節(jié),待進(jìn)一步分解時(shí)才去關(guān)心它們的內(nèi)部細(xì)節(jié)與結(jié)構(gòu)。 5.5數(shù)據(jù)庫(kù)設(shè)計(jì)及設(shè)計(jì)原則
5.5.1數(shù)據(jù)庫(kù)設(shè)計(jì)
數(shù)據(jù)庫(kù)結(jié)構(gòu)的設(shè)計(jì)是信息系統(tǒng)應(yīng)用開(kāi)發(fā)的核心環(huán)節(jié)。數(shù)據(jù)庫(kù)結(jié)構(gòu)若設(shè)計(jì)合理,將會(huì)使操作數(shù)據(jù)庫(kù)的應(yīng)用程序具有穩(wěn)定性、靈活性,因而更容易開(kāi)發(fā)。若設(shè)計(jì)的數(shù)據(jù)庫(kù)結(jié)構(gòu)不合理,在其基礎(chǔ)上開(kāi)發(fā)的應(yīng)用程序?qū)⒕哂信c上述相反的結(jié)論。例如經(jīng)常有人將學(xué)生成績(jī)的關(guān)系模式設(shè)計(jì)為:
成績(jī)(學(xué)號(hào)、姓名、語(yǔ)文、數(shù)學(xué)、英語(yǔ))
1.關(guān)系模式的設(shè)計(jì)
E-R圖用于表示應(yīng)用領(lǐng)域中的實(shí)體及其相互關(guān)系。實(shí)體指的是一切事物,例如學(xué)生、課程、教師、機(jī)器和零件等。聯(lián)系是指現(xiàn)實(shí)世界中事物之間的相互聯(lián)系。在信息領(lǐng)域,將學(xué)生和課程這樣的實(shí)體稱為客觀實(shí)體,而將事物之間的聯(lián)系又稱為聯(lián)系實(shí)體??陀^實(shí)體和聯(lián)系實(shí)體都擁有自己的性質(zhì),被稱為屬性。不論客觀實(shí)體還是聯(lián)系實(shí)體,在關(guān)系模型中都用關(guān)系的一個(gè)元組表示。一旦完成了E-R圖,就能很容易,甚至是機(jī)械地將其變換成關(guān)系模型中的一些關(guān)系模式結(jié)構(gòu)。在E-R圖中,實(shí)體用矩形表示,其中寫(xiě)屬性名。在聯(lián)系上要注明實(shí)體之間的對(duì)應(yīng)關(guān)系是1對(duì)1、1對(duì)多還是多對(duì)多。圖5.20的E-R圖表明一個(gè)學(xué)生只能注冊(cè)在一個(gè)班級(jí),一個(gè)班級(jí)可有多個(gè)學(xué)生;一個(gè)學(xué)生可學(xué)習(xí)多門(mén)功課,而一門(mén)課程可由多個(gè)學(xué)生學(xué)習(xí);一個(gè)教師可講授多個(gè)班級(jí)、多門(mén)課程,而一個(gè)班級(jí)、一門(mén)課程只能由一個(gè)老師講授。圖5.20教學(xué)環(huán)境簡(jiǎn)化的E-R圖
E-R圖轉(zhuǎn)換成關(guān)系模式是機(jī)械式的,例如對(duì)于學(xué)生實(shí)體可得關(guān)系模式如下:
學(xué)生(學(xué)號(hào)、姓名、性別)
其中用下劃線標(biāo)識(shí)的屬性為該關(guān)系的主關(guān)鍵字。對(duì)于聯(lián)系實(shí)體,如學(xué)習(xí)可得關(guān)系模式:
學(xué)習(xí)(學(xué)號(hào)、課號(hào)、學(xué)期、成績(jī))
其中主關(guān)鍵字為學(xué)號(hào)、課號(hào)、學(xué)期,稱為組合關(guān)鍵字,它由參與的實(shí)體的關(guān)鍵字和成績(jī)構(gòu)成。對(duì)于注冊(cè)這個(gè)聯(lián)系,由于其實(shí)體間對(duì)應(yīng)關(guān)系為1對(duì)多,因此該聯(lián)系將不生成一個(gè)獨(dú)立的關(guān)系模式,而是將班級(jí)實(shí)體的關(guān)鍵字加入到學(xué)生關(guān)系中,即在學(xué)生的關(guān)系模式中增加一個(gè)屬性:班號(hào),用以表示這個(gè)聯(lián)系。在繪制E-R圖時(shí)應(yīng)該避免一種明顯的錯(cuò)誤,即不能把計(jì)算或處理的名字作為聯(lián)系的名字?,F(xiàn)實(shí)世界中確實(shí)存在一些實(shí)體,它們之間存在某種計(jì)算的關(guān)系,即通過(guò)某種計(jì)算或處理而得到另一個(gè)實(shí)體。這種關(guān)系不應(yīng)畫(huà)成聯(lián)系,因?yàn)槲覀儫o(wú)法將其變換成一個(gè)關(guān)系,即它們的實(shí)質(zhì)是過(guò)程而不是數(shù)據(jù)。由于現(xiàn)實(shí)世界是復(fù)雜的,現(xiàn)行的E-R圖難以表達(dá)它們,例如學(xué)生中有三好學(xué)生,教師中有先進(jìn)教師,這些數(shù)據(jù)的組織與表達(dá)超出了E-R圖的范圍。
在關(guān)系數(shù)據(jù)庫(kù)結(jié)構(gòu)設(shè)計(jì)過(guò)程中,一個(gè)重要問(wèn)題就是要正確運(yùn)用關(guān)系的規(guī)范化理論,至少保證每個(gè)關(guān)系模式都是第三范式,否則會(huì)導(dǎo)致數(shù)據(jù)庫(kù)中數(shù)據(jù)的不合理冗余,甚至導(dǎo)致數(shù)據(jù)庫(kù)中數(shù)據(jù)的不一致性。
2.共享數(shù)據(jù)庫(kù)設(shè)計(jì)
在信息系統(tǒng)應(yīng)用中,各子系統(tǒng)之間沒(méi)有控制聯(lián)系,各子系統(tǒng)之間的協(xié)調(diào)是通過(guò)對(duì)其共享數(shù)據(jù)庫(kù)的存取實(shí)現(xiàn)的。因此,共享數(shù)據(jù)庫(kù)的設(shè)計(jì)成為各子系統(tǒng)相互協(xié)調(diào)的基礎(chǔ)。共享數(shù)據(jù)庫(kù)設(shè)計(jì)的任務(wù)是在數(shù)據(jù)庫(kù)結(jié)構(gòu)設(shè)計(jì)的基礎(chǔ)上進(jìn)一步確定哪些關(guān)系及屬性應(yīng)該是共享的,由哪個(gè)(或哪些)子系統(tǒng)共享,共享的方式是讀共享還是寫(xiě)共享。這些內(nèi)容將作為用戶視圖設(shè)計(jì)的依據(jù),在實(shí)現(xiàn)階段中為每項(xiàng)需共享數(shù)據(jù)的子系統(tǒng)建立相應(yīng)的用戶視圖。確定共享數(shù)據(jù)庫(kù)的依據(jù)是每個(gè)子系統(tǒng)數(shù)據(jù)流圖的總體圖。在用戶需求分析階段已經(jīng)為每個(gè)子系統(tǒng)生成了用數(shù)據(jù)流圖表示的邏輯模型和物理模型,其中總體圖表明了該子系統(tǒng)與周圍環(huán)境的相互作用??傮w圖中的出弧數(shù)據(jù)流為提供給所指向子系統(tǒng)的共享數(shù)據(jù);入弧數(shù)據(jù)流表示從相應(yīng)子系統(tǒng)取得的共享數(shù)據(jù)。將這些信息綜合起來(lái),去除矛盾的,補(bǔ)充遺漏的,就可以得到該應(yīng)用系統(tǒng)的共享數(shù)據(jù)庫(kù)的全部信息。5.5.2數(shù)據(jù)庫(kù)設(shè)計(jì)的原則
目前,計(jì)算機(jī)技術(shù)已經(jīng)廣泛地應(yīng)用于國(guó)民經(jīng)濟(jì)的各個(gè)領(lǐng)域中,在計(jì)算機(jī)硬件不斷微型化的同時(shí),應(yīng)用系統(tǒng)也逐漸向著復(fù)雜化、大型化的方向發(fā)展。數(shù)據(jù)庫(kù)是整個(gè)系統(tǒng)的核心,它的設(shè)計(jì)直接關(guān)系系統(tǒng)執(zhí)行的效率和系統(tǒng)的穩(wěn)定性。因此在軟件系統(tǒng)開(kāi)發(fā)中,數(shù)據(jù)庫(kù)設(shè)計(jì)應(yīng)遵循必要的數(shù)據(jù)庫(kù)范式理論,以減少冗余,保證數(shù)據(jù)的完整性與正確性。只有在合適的數(shù)據(jù)庫(kù)產(chǎn)品上設(shè)計(jì)出合理的數(shù)據(jù)庫(kù)模型,才能降低整個(gè)系統(tǒng)的編程和維護(hù)難度,提高系統(tǒng)的實(shí)際運(yùn)行效率。雖然對(duì)于小項(xiàng)目或中等規(guī)模的項(xiàng)目,開(kāi)發(fā)人員可以很容易地利用范式理論設(shè)計(jì)出一套符合要求的數(shù)據(jù)庫(kù),但對(duì)于一個(gè)包含大型數(shù)據(jù)庫(kù)的軟件項(xiàng)目,就必須先成立數(shù)據(jù)小組,再按照一套完整的設(shè)計(jì)原則與技巧來(lái)設(shè)計(jì)數(shù)據(jù)庫(kù)。
1.成立數(shù)據(jù)小組
大型數(shù)據(jù)庫(kù)數(shù)據(jù)元素多,在設(shè)計(jì)時(shí)有必要成立專門(mén)的數(shù)據(jù)小組。由于數(shù)據(jù)庫(kù)設(shè)計(jì)者不一定是使用者,對(duì)系統(tǒng)設(shè)計(jì)中的數(shù)據(jù)元素不可能考慮周全,數(shù)據(jù)庫(kù)設(shè)計(jì)出來(lái)后,往往難以找到所需的庫(kù)表,因此數(shù)據(jù)小組最好由熟悉業(yè)務(wù)的項(xiàng)目骨干組成。
數(shù)據(jù)小組的職能并非是設(shè)計(jì)數(shù)據(jù)庫(kù),而是通過(guò)需求分析,在參考其他相似系統(tǒng)的基礎(chǔ)上,提取系統(tǒng)的基本數(shù)據(jù)元素,擔(dān)負(fù)對(duì)數(shù)據(jù)庫(kù)的審核。審核內(nèi)容包括:審核新的數(shù)據(jù)庫(kù)元素是否完全,能否實(shí)現(xiàn)全部業(yè)務(wù)需求;對(duì)舊數(shù)據(jù)庫(kù)(如果存在舊系統(tǒng))的分析及數(shù)據(jù)轉(zhuǎn)換;數(shù)據(jù)庫(kù)設(shè)計(jì)的審核、控制及必要的調(diào)整。
2.設(shè)計(jì)原則
(1)規(guī)范命名。所有的庫(kù)名、表名、域名必須遵循統(tǒng)一的命名規(guī)則,并進(jìn)行必要說(shuō)明,以方便設(shè)計(jì)、維護(hù)、查詢。
(2)控制字段的引用。在設(shè)計(jì)時(shí),可以選擇適當(dāng)?shù)臄?shù)據(jù)庫(kù)設(shè)計(jì)管理工具,以方便開(kāi)發(fā)人員的分布式設(shè)計(jì)和數(shù)據(jù)小組的集中審核管理;采用統(tǒng)一的命名規(guī)則,如果設(shè)計(jì)的字段已經(jīng)存在,可直接引用;否則,應(yīng)重新設(shè)計(jì)。
(3)庫(kù)表重復(fù)控制。在設(shè)計(jì)過(guò)程中,如果發(fā)現(xiàn)庫(kù)表中的大部分字段都已存在,開(kāi)發(fā)人員應(yīng)考慮所設(shè)計(jì)的庫(kù)表是否已存在。通過(guò)對(duì)字段所在庫(kù)表及相應(yīng)設(shè)計(jì)人員的查詢,可以確認(rèn)庫(kù)表是否確實(shí)重復(fù)。
(4)并發(fā)控制。設(shè)計(jì)中應(yīng)進(jìn)行并發(fā)控制,即對(duì)于同一個(gè)庫(kù)表,在同一時(shí)間只有一個(gè)用戶有控制權(quán),其他人只能進(jìn)行查詢。
(5)必要的討論。數(shù)據(jù)庫(kù)設(shè)計(jì)完成后,數(shù)據(jù)小組應(yīng)與相關(guān)人員進(jìn)行討論,通過(guò)討論來(lái)熟悉數(shù)據(jù)庫(kù),從而對(duì)設(shè)計(jì)中存在的問(wèn)題進(jìn)行控制或從中獲取數(shù)據(jù)庫(kù)設(shè)計(jì)的必要信息。
(6)數(shù)據(jù)小組的審核。庫(kù)表的修改和確定最終都要通過(guò)數(shù)據(jù)小組的審核,以保證符合必要的要求。
(7)頭文件處理。每次修改數(shù)據(jù)后,數(shù)據(jù)小組要對(duì)相應(yīng)的頭文件進(jìn)行修改(可由管理軟件自動(dòng)完成),并通知相關(guān)的開(kāi)發(fā)人員,以便進(jìn)行相應(yīng)的程序修改。
3.設(shè)計(jì)技巧
(1)分類拆分?jǐn)?shù)據(jù)量大的表。對(duì)于經(jīng)常使用的表(如某些參數(shù)表或代碼對(duì)照表),由于其使用頻率很高,要盡量減少表中的記錄數(shù)量。例如,若將銀行的戶主賬表設(shè)計(jì)成一張表,雖然可以方便程序的設(shè)計(jì)與維護(hù),但經(jīng)過(guò)分析發(fā)現(xiàn),由于數(shù)據(jù)量太大,會(huì)影響數(shù)據(jù)的迅速定位。而若將戶主賬表分別設(shè)計(jì)為活期戶主賬、定期戶主賬及對(duì)公戶主賬等,則可以大大提高查詢效率。
(2)索引設(shè)計(jì)。對(duì)于大的數(shù)據(jù)庫(kù)表,合理的索引能夠提高整個(gè)數(shù)據(jù)庫(kù)的操作效率。在索引設(shè)計(jì)中,索引字段應(yīng)挑選重復(fù)值較少的字段;在對(duì)建有復(fù)合索引的字段進(jìn)行檢索時(shí),應(yīng)注意按照復(fù)合索引字段建立的順序進(jìn)行。例如,對(duì)一個(gè)有5萬(wàn)多條記錄的流水表,若以日期和流水號(hào)為序建立復(fù)合索引,由于在該表中日期的重復(fù)值接近整個(gè)表的記錄數(shù),用流水號(hào)進(jìn)行查詢所用的時(shí)間接近3秒;而如果以流水號(hào)為索引字段建立索引進(jìn)行相同的查詢,則所用時(shí)間不到1秒。因此在大型數(shù)據(jù)庫(kù)設(shè)計(jì)中,只有進(jìn)行合理的索引字段選擇,才能有效提高整個(gè)數(shù)據(jù)庫(kù)的操作效率。
(3)數(shù)據(jù)操作的優(yōu)化。在大型數(shù)據(jù)庫(kù)中,如何提高數(shù)據(jù)操作效率值得關(guān)注。例如,每在數(shù)據(jù)庫(kù)流水表中增加一筆業(yè)務(wù),就必須從流水控制表中取出流水號(hào),并將其流水號(hào)的數(shù)值加一。正常情況下,單筆操作的反應(yīng)速度尚屬正常,但當(dāng)用它進(jìn)行批量業(yè)務(wù)處理時(shí),速度會(huì)明顯減慢。經(jīng)過(guò)分析發(fā)現(xiàn),每次對(duì)流水控制表中的流水號(hào)數(shù)值加1時(shí)都要鎖定該表,而該表卻是整個(gè)系統(tǒng)操作的核心,有可能在操作時(shí)被其他進(jìn)程鎖定,因而使整個(gè)事務(wù)操作速度變慢。對(duì)這一問(wèn)題的解決辦法是,根據(jù)批量業(yè)務(wù)的總筆數(shù)批量申請(qǐng)流水號(hào),并對(duì)流水控制表進(jìn)行一次更新,即可提高批量業(yè)務(wù)處理的速度。另一個(gè)例子是對(duì)插表的優(yōu)化。對(duì)于大批量的業(yè)務(wù)處理,如果在插入數(shù)據(jù)庫(kù)表時(shí)用普通的Insert語(yǔ)句,速度會(huì)很慢。其原因在于,每次插表都要進(jìn)行一次I/O操作,需花費(fèi)較長(zhǎng)的時(shí)間。改進(jìn)后,可以用Put語(yǔ)句以緩沖區(qū)形式等滿頁(yè)后再進(jìn)行I/O操作,從而提高效率。對(duì)大的數(shù)據(jù)庫(kù)表進(jìn)行刪除時(shí),一般會(huì)直接用Delete語(yǔ)句,這個(gè)語(yǔ)句雖然可以進(jìn)行小表操作,但對(duì)大表操作卻會(huì)因帶來(lái)大事務(wù)而導(dǎo)致刪除速度很慢甚至失敗。簡(jiǎn)單的解決方法是去掉事務(wù),但更有效的辦法是對(duì)表先進(jìn)行Drop操作,再進(jìn)行重建。
(4)數(shù)據(jù)庫(kù)參數(shù)的調(diào)整。數(shù)據(jù)庫(kù)參數(shù)的調(diào)整是一個(gè)經(jīng)驗(yàn)不斷積累的過(guò)程,應(yīng)由有經(jīng)驗(yàn)的系統(tǒng)管理員完成。以Informix數(shù)據(jù)庫(kù)為例,記錄鎖的數(shù)目太少會(huì)造成鎖表的失??;邏輯日志的文件數(shù)目太少會(huì)造成插入大表失敗等,這些問(wèn)題都應(yīng)根據(jù)實(shí)際情況進(jìn)行必要的調(diào)整。
(5)必要的工具。在整個(gè)數(shù)據(jù)庫(kù)的開(kāi)發(fā)與設(shè)計(jì)過(guò)程中,可以先開(kāi)發(fā)一些小的應(yīng)用工具,如自動(dòng)生成庫(kù)表的頭文件、插入數(shù)據(jù)的初始化、數(shù)據(jù)插入的函數(shù)封裝、錯(cuò)誤跟蹤或自動(dòng)顯示等,以此提高數(shù)據(jù)庫(kù)的設(shè)計(jì)與開(kāi)發(fā)效率。
(6)避免長(zhǎng)事務(wù)。對(duì)單個(gè)大表的刪除或插入操作會(huì)帶來(lái)長(zhǎng)事務(wù),解決的辦法是對(duì)參數(shù)進(jìn)行調(diào)整,也可以在插入時(shí)對(duì)文件進(jìn)行分割。對(duì)于一個(gè)由一系列小事務(wù)順序操作共同構(gòu)成的長(zhǎng)事務(wù)(如銀行交易系統(tǒng)的日終交易),可以由一系列操作完成整個(gè)事務(wù),但其缺點(diǎn)是有可能因整個(gè)事務(wù)太大而不能完成,或者由于偶然的意外而使事務(wù)重做所需的時(shí)間太長(zhǎng)。較好的解決方法是,把整個(gè)事務(wù)分解成幾個(gè)較小的事務(wù),再由應(yīng)用程序控制整個(gè)系統(tǒng)的流程。這樣,如果其中某個(gè)事務(wù)不成功,則只需重做該事務(wù),這樣既可節(jié)約時(shí)間,又可避免長(zhǎng)事務(wù)。
(7)適當(dāng)超前。計(jì)算機(jī)技術(shù)發(fā)展日新月異,數(shù)據(jù)庫(kù)的設(shè)計(jì)必須具有一定的前瞻性,不但要滿足當(dāng)前的應(yīng)用要求,還要考慮未來(lái)的業(yè)務(wù)發(fā)展,同時(shí)必須有利于擴(kuò)展或增加應(yīng)用系統(tǒng)的處理功能。 5.6接口設(shè)計(jì)
5.6.1接口設(shè)計(jì)的描述
本節(jié)討論的接口設(shè)計(jì)主要包括以下三個(gè)方面:
(1)軟件構(gòu)件與構(gòu)件之間的接口設(shè)計(jì),例如構(gòu)件之間的參數(shù)傳遞等。
(2)軟件內(nèi)部與協(xié)作系統(tǒng)之間的接口設(shè)計(jì),例如構(gòu)件與其他外部實(shí)體的接口等。
(3)軟件與使用者之間的通信方式,例如用戶界面設(shè)計(jì)等。5.6.2用戶界面設(shè)計(jì)的主要問(wèn)題
在設(shè)計(jì)用戶界面的過(guò)程中,一般總遇到下述四個(gè)問(wèn)題:系統(tǒng)響應(yīng)時(shí)間、用戶幫助設(shè)施、出錯(cuò)信息處理和命令交互。不幸的是,許多設(shè)計(jì)者直到設(shè)計(jì)過(guò)程后期才開(kāi)始考慮這些問(wèn)題,這樣往往導(dǎo)致不必要的反復(fù)、項(xiàng)目延期和用戶產(chǎn)生挫折感。最好在設(shè)計(jì)初期就考慮這些問(wèn)題,這樣易修改,代價(jià)也低。
1.系統(tǒng)響應(yīng)時(shí)間
一般來(lái)說(shuō),系統(tǒng)響應(yīng)時(shí)間指從用戶完成某個(gè)控制動(dòng)作(例如按回車鍵或點(diǎn)擊鼠標(biāo)),到軟件給出預(yù)期的響應(yīng)(輸出或做動(dòng)作)之間的這段時(shí)間。系統(tǒng)響應(yīng)時(shí)間過(guò)長(zhǎng)是許多交互式系統(tǒng)用戶常抱怨的問(wèn)題。
系統(tǒng)響應(yīng)時(shí)間有兩個(gè)重要屬性:長(zhǎng)度和易變性。
如果系統(tǒng)響應(yīng)時(shí)間過(guò)長(zhǎng),用戶就會(huì)感到緊張和沮喪。但是,當(dāng)用戶的工作速度是由人機(jī)界面決定的時(shí)候,系統(tǒng)響應(yīng)時(shí)間過(guò)短,會(huì)迫使用戶加快操作節(jié)奏,從而可能犯錯(cuò)誤。易變性指系統(tǒng)響應(yīng)時(shí)間相對(duì)于平均響應(yīng)時(shí)間的偏差,在許多情況下,這是系統(tǒng)響應(yīng)時(shí)間的更重要的屬性。即使系統(tǒng)響應(yīng)時(shí)間較長(zhǎng),響應(yīng)時(shí)間易變性低也有助于用戶建立起穩(wěn)定的工作節(jié)奏。例如,穩(wěn)定時(shí)間在1s的響應(yīng)時(shí)間比從0.1~2.5s變化的響應(yīng)時(shí)間要好。用戶往往比較敏感,他們總是擔(dān)心響應(yīng)時(shí)間的變化暗示系統(tǒng)工作出現(xiàn)異常。
2.用戶幫助設(shè)施
交互式系統(tǒng)的每個(gè)用戶幾乎都需要幫助,當(dāng)遇到復(fù)雜問(wèn)題時(shí)甚至需要查看用戶手冊(cè)以得到答案。大多數(shù)現(xiàn)代軟件都提供聯(lián)機(jī)幫助設(shè)施,這使得用戶可以不離開(kāi)用戶界面就能解決自己的問(wèn)題。
常見(jiàn)的幫助設(shè)施有兩類:集成的和附加的。集成的幫助設(shè)施從一開(kāi)始就設(shè)計(jì)在軟件里面,它通常對(duì)用戶工作是敏感的,因此用戶可以從與剛剛完成的操作有關(guān)的主題中選擇一個(gè),請(qǐng)求幫助。顯然,這可以縮短用戶獲取幫助的時(shí)間,增加界面的友好性。附加的幫助設(shè)施是在系統(tǒng)建成后再添加到軟件中的,大多數(shù)情況下,它實(shí)際上是一種查詢能力有限的聯(lián)機(jī)用戶手冊(cè)。事實(shí)表明,集成的幫助設(shè)施優(yōu)于附加的幫助設(shè)施。具體設(shè)計(jì)幫助設(shè)施時(shí),必須解決以下一系列問(wèn)題:
(1)在用戶與系統(tǒng)交互期間,是否在任何時(shí)間都能獲得關(guān)于系統(tǒng)任何功能的幫助信息。有兩種選擇:提供部分功能的幫助信息和提供全部功能的幫助信息。
(2)用戶怎樣請(qǐng)求幫助,有三種選擇:幫助菜單、特殊功能鍵和Help命令。
(3)怎樣顯示幫助信息,有三種選擇:在獨(dú)立的窗口中顯示、指出參考某個(gè)文檔(不理想)和在屏幕固定位置顯示簡(jiǎn)短提示。
(4)用戶怎樣返回到正常的交互方式,有兩種選擇:屏幕上的返回按鈕和功能鍵。
(5)怎樣組織幫助信息,有三種選擇:平面結(jié)構(gòu)(所有信息都通過(guò)關(guān)鍵字訪問(wèn))、信息的層次結(jié)構(gòu)(用戶可在該結(jié)構(gòu)中查到更詳細(xì)的信息)和超文本結(jié)構(gòu)。
3.出錯(cuò)信息處理
出錯(cuò)信息和警告信息是出現(xiàn)問(wèn)題時(shí)交互式系統(tǒng)給出的“壞消息”。若出錯(cuò)信息設(shè)計(jì)得不好,將向用戶提供無(wú)用的或誤導(dǎo)的信息,反而會(huì)增加用戶的挫折感。
一般來(lái)說(shuō),交互式系統(tǒng)給出的出錯(cuò)信息或警告信息應(yīng)該具有以下屬性:
●信息應(yīng)該以用戶可以理解的術(shù)語(yǔ)描述問(wèn)題。
●信息應(yīng)該提供有助于從錯(cuò)誤中恢復(fù)的建設(shè)性意見(jiàn)。
●信息應(yīng)該指出錯(cuò)誤可能導(dǎo)致哪些負(fù)面后果(例如破壞數(shù)據(jù)文件),以便用戶檢查是否出現(xiàn)了這些問(wèn)題,并在確實(shí)出現(xiàn)問(wèn)題時(shí)予以改正。●信息應(yīng)該伴隨著聽(tīng)覺(jué)上或視覺(jué)上的提示,也即在顯示信息時(shí)應(yīng)該同時(shí)發(fā)出警告聲,或者用閃爍方式顯示,或者用明顯表示出錯(cuò)的顏色顯示。
●信息不能帶有指責(zé)色彩,即不能指責(zé)用戶。
當(dāng)一旦出現(xiàn)問(wèn)題時(shí),有效的出錯(cuò)信息能夠提高交互式系統(tǒng)的質(zhì)量,減少用戶的挫折感。
4.命令交互
命令行曾是用戶和系統(tǒng)軟件交互的最常用方式,而且也被廣泛地應(yīng)用于各種應(yīng)用軟件中?,F(xiàn)在面向窗口的、點(diǎn)擊和拾取方式的界面已經(jīng)減少了用戶對(duì)命令行的依賴,但許多高級(jí)用戶仍偏愛(ài)面向命令的交互方式。在多數(shù)情況下,用戶既可以從菜單中選擇軟件功能,也可通過(guò)鍵盤(pán)命令序列調(diào)用軟件功能。在提供命令交互方式時(shí),必須考慮以下問(wèn)題:
●是否每個(gè)菜單選項(xiàng)都有對(duì)應(yīng)的命令。
●采用何種命令形式,共有三種選擇:快捷鍵(例如Ctrl+P)、功能鍵和鍵入命令。
●學(xué)習(xí)和記憶命令的難度有多大,忘記了命令怎么辦。
●用戶是否可以定制或縮寫(xiě)命令。在越來(lái)越多的應(yīng)用軟件中,界面設(shè)計(jì)者都提供了“命令宏機(jī)制”,使用這種機(jī)制用戶可以用自己定義的名字代表一個(gè)常用的命令序列。需要使用這個(gè)命令序列時(shí),用戶無(wú)需依次鍵入每個(gè)命令,只需輸入命令宏的名字就可以順序執(zhí)行它所代表的全部命令。
在理想情況下,所有應(yīng)用軟件都有一致的命令使用方法。如果在一個(gè)應(yīng)用軟件中,命令Ctrl+D表示復(fù)制一個(gè)圖形對(duì)象,而在另一個(gè)應(yīng)用軟件中Ctrl+D命令的含義是刪除一個(gè)圖形對(duì)象,這顯然會(huì)使用戶感到困惑,并往往導(dǎo)致錯(cuò)誤。一般情況下,在常用的應(yīng)用軟件中都采用了一致的快捷鍵來(lái)完成相同的功能,如用Ctrl+C表示復(fù)制,Ctrl+V表示粘貼,Ctrl+S表示保存,Ctrl+O表示打開(kāi)。因此,所設(shè)計(jì)的軟件就不要?jiǎng)e出心裁,另搞一套,這樣會(huì)使用戶感到無(wú)所適從。5.6.3人機(jī)界面設(shè)計(jì)過(guò)程
人機(jī)界面設(shè)計(jì)是一個(gè)迭代的過(guò)程,如圖5.21所示。通常先創(chuàng)建設(shè)計(jì)模型,再用原型實(shí)現(xiàn)這個(gè)模型,并由用戶試用和評(píng)估,然后根據(jù)用戶的意見(jiàn)進(jìn)行修改,如此反復(fù)直至最后完成界面設(shè)計(jì)。圖5.21人機(jī)界面設(shè)計(jì)過(guò)程
1.任務(wù)分析與創(chuàng)建設(shè)計(jì)模型
在人機(jī)界面設(shè)計(jì)過(guò)程中先后涉及四個(gè)模型:設(shè)計(jì)者創(chuàng)建的設(shè)計(jì)模型、用戶模型、終端用戶對(duì)系統(tǒng)的假想和系統(tǒng)實(shí)現(xiàn)后的系統(tǒng)映像。這四個(gè)模型之間存在較多差異,設(shè)計(jì)界面時(shí)必須充分協(xié)調(diào),導(dǎo)出一致的界面。建立設(shè)計(jì)模型應(yīng)充分考慮用戶模型中給出的信息,如用戶的年齡、性別、心理情況、所受教育、文化、種族背景、動(dòng)機(jī)、目的和個(gè)性等;系統(tǒng)映像盡量與系統(tǒng)假想相吻合,還必須準(zhǔn)確地反映系統(tǒng)的語(yǔ)法和語(yǔ)義信息。設(shè)計(jì)模型源于設(shè)計(jì)者對(duì)人機(jī)界面設(shè)計(jì)任務(wù)的分析。逐步求精和面向?qū)ο蟮姆治黾夹g(shù)亦適用于人機(jī)界面設(shè)計(jì)的任務(wù)分析。逐步求精技術(shù)可把任務(wù)不斷劃分為子任務(wù),直至對(duì)每個(gè)任務(wù)的要求都十分清楚;而面向?qū)ο蠓治隹勺R(shí)別出與應(yīng)用有關(guān)的所有客觀的對(duì)象以及與對(duì)象關(guān)聯(lián)的動(dòng)作。
一旦每個(gè)任務(wù)或動(dòng)作定義清楚,界面設(shè)計(jì)即可開(kāi)始。界面設(shè)計(jì)首先要完成下列工作:
(1)確定任務(wù)的目標(biāo)和含義。
(2)將每個(gè)目標(biāo)/含義映射為一系列特定的動(dòng)作。
(3)說(shuō)明這些動(dòng)作將來(lái)在界面上執(zhí)行的順序。
(4)指明各個(gè)系統(tǒng)狀態(tài),即上述各動(dòng)作序列中每個(gè)動(dòng)作在界面上執(zhí)行時(shí)界面呈現(xiàn)的
形式。
(5)定義控制機(jī)制,以便用戶修改系統(tǒng)狀態(tài)的一些設(shè)置和操作。
(6)說(shuō)明控制機(jī)制怎樣作用于系統(tǒng)狀態(tài)。
(7)指明用戶應(yīng)怎樣根據(jù)界面上反映出的信息解釋系統(tǒng)的狀態(tài)。
2.利用工具構(gòu)造原型
確定了界面設(shè)計(jì)模型,就可利用原型開(kāi)發(fā)工具創(chuàng)建原型。這些工具被稱為用戶界面工具箱或用戶界面開(kāi)發(fā)系統(tǒng)(UIDS),它們?yōu)楹?jiǎn)化窗口、菜單、設(shè)備交互、出錯(cuò)信息、命令及交互環(huán)境的許多其他元素的創(chuàng)建提供了各種例程或?qū)ο?。這些工具所提供的功能
溫馨提示
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024事業(yè)單位聘用合同糾紛處理與法律適用總結(jié)3篇
- 2024年多功能設(shè)備維護(hù)合作協(xié)議2篇
- 2024年度數(shù)據(jù)保密與信息安全認(rèn)證協(xié)議3篇
- 2025年拉薩貨運(yùn)上崗證考試題庫(kù)1387題
- 洛陽(yáng)文化旅游職業(yè)學(xué)院《黑臭水體治理技術(shù)》2023-2024學(xué)年第一學(xué)期期末試卷
- 科技創(chuàng)新資金撥付管理
- 甘肅省隴南市2024-2025學(xué)年高一上學(xué)期期中考試歷史試卷(解析版)
- 信息技術(shù)部門(mén)組織結(jié)構(gòu)
- 城市綠化監(jiān)控系統(tǒng)安裝合同
- 2024年廢棄水塘承包合同最長(zhǎng)期限3篇
- 波譜色譜學(xué)智慧樹(shù)知到期末考試答案章節(jié)答案2024年沈陽(yáng)農(nóng)業(yè)大學(xué)
- 創(chuàng)業(yè)投資管理智慧樹(shù)知到期末考試答案章節(jié)答案2024年武漢科技大學(xué)
- 監(jiān)理投標(biāo)文件范本
- 小學(xué)勞動(dòng)教育實(shí)施三年規(guī)劃(2024-2026)
- 網(wǎng)課智慧樹(shù)知道《英漢口譯(四川大學(xué))》章節(jié)測(cè)試答案
- 小學(xué)三年級(jí)上冊(cè)道德與法治期末測(cè)試卷及答案(各地真題)
- 2024年高考語(yǔ)文二輪復(fù)習(xí)各地??甲魑臎_刺匯編(八)含范文
- (高清版)JTT 617.4-2018 危險(xiǎn)貨物道路運(yùn)輸規(guī)則 第4部分:運(yùn)輸包裝使用要求(第1號(hào)修改單)
- 人教部編版八年級(jí)數(shù)學(xué)上冊(cè)期末考試卷及答案一
- 哲學(xué)與人生第12課《實(shí)現(xiàn)人生價(jià)值》12.2
- (附答案)2024公需課《百縣千鎮(zhèn)萬(wàn)村高質(zhì)量發(fā)展工程與城鄉(xiāng)區(qū)域協(xié)調(diào)發(fā)展》試題廣東公需科
評(píng)論
0/150
提交評(píng)論