軟件工程思想5
綜合能力考核表詳細(xì)內(nèi)容
軟件工程思想5
第五章 系 統(tǒng) 設(shè) 計(jì) 系統(tǒng)設(shè)計(jì)是把需求轉(zhuǎn)化為軟件系統(tǒng)的最重要的環(huán)節(jié)。系統(tǒng)設(shè)計(jì)的優(yōu)劣在根本上決定了 軟件系統(tǒng)的質(zhì)量。就象“一切帝國(guó)主義都是紙老虎”那樣可以斷定“差的系統(tǒng)設(shè)計(jì)必定產(chǎn)生 差的軟件系統(tǒng)。”所以我們要努力保證系統(tǒng)設(shè)計(jì)“根正苗紅”,把一切左傾、右傾的設(shè)計(jì)思 潮消滅在萌芽狀態(tài)。 Windows NT的一位系統(tǒng)設(shè)計(jì)師擁有8輛法拉利跑車,讓Microsoft公司的一些程序員十分眼紅。但 你只能羨慕而不能憤恨,因?yàn)椴⒉皇敲總€(gè)程序員都有本事成為復(fù)雜軟件系統(tǒng)的設(shè)計(jì)師。 系統(tǒng)設(shè)計(jì)要比純粹的編程困難得多。即便你清楚客戶的需求,卻未必知道應(yīng)該設(shè)計(jì)什么 樣的軟件系統(tǒng)——既能掙最多的錢又能讓客戶滿意?!疤煜挛骱蠲朗呛贾荨?,千 年前蘇東坡大學(xué)士對(duì)西湖精采絕倫的系統(tǒng)設(shè)計(jì),使杭州榮升為“天堂”,讓后人只剩下贊 嘆和破壞的份了。 本章講述系統(tǒng)設(shè)計(jì)的四方面內(nèi)容:體系結(jié)構(gòu)設(shè)計(jì)、模塊設(shè)計(jì)、數(shù)據(jù)結(jié)構(gòu)與算法設(shè)計(jì)、 用戶界面設(shè)計(jì)。如果將軟件系統(tǒng)比喻為人體,那么: (1)體系結(jié)構(gòu)就如同人的骨架。如果某個(gè)家伙的骨架是猴子,那么無(wú)論怎樣喂養(yǎng)和美容 ,這家伙始終都是猴子,不會(huì)成為人。 (2)模塊就如同人的器官,具有特定的功能。人體中最出色的模塊設(shè)計(jì)之一是手,手只 有幾種動(dòng)作,卻能做無(wú)限多的事情。人體中最糟糕的模塊設(shè)計(jì)之一是嘴巴,嘴巴將最有 價(jià)值但毫無(wú)相干的幾種功能如吃飯、說(shuō)話、親吻混為一體,使之無(wú)法并行處理,真乃人 類之不幸。 (3)數(shù)據(jù)結(jié)構(gòu)與算法就如同人的血脈和神經(jīng),它讓器官具有生命并能發(fā)揮功能。數(shù)據(jù)結(jié) 構(gòu)與算法分布在體系結(jié)構(gòu)和模塊中,它將協(xié)調(diào)系統(tǒng)的各個(gè)功能。人的耳朵和嘴巴雖然是 相對(duì)獨(dú)立的器官,但如果耳朵失聰了,嘴巴就只能發(fā)出“啊”“嗚”的聲音,等于喪失了說(shuō) 話的功能(所以聾子天生就是啞巴),可人們卻又能用手勢(shì)代替說(shuō)話。人體的數(shù)據(jù)結(jié)構(gòu) 與算法設(shè)計(jì)真是十分神奇并且十分可笑。 (4)用戶界面就如同人的外表,最容易讓人一見(jiàn)鐘情或一見(jiàn)惡心。象人類追求心靈美和 外表美那樣,軟件系統(tǒng)也追求(內(nèi)在的)功能強(qiáng)大和(外表的)界面友好。但隨著生活 節(jié)奏的加快,人們已少有興趣去品味深藏不露的內(nèi)在美。如果把Unix系統(tǒng)比作是健壯的 漢子和婦人,那么Windows系統(tǒng)就象嫵媚的小白臉和狐貍精。想不到Windows系統(tǒng)竟然能 興風(fēng)作浪,占去大半市場(chǎng)。有鑒于此,我們應(yīng)該鼓勵(lì)女士多買化妝品(男士付錢)以獲 得更好的界面。 在進(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ì)把好事搞砸了。據(jù)說(shuō)上帝把所有的女士都設(shè)計(jì)成天 使,可是天使們?cè)谙路矔r(shí)有些雙腳先著地,有些臉先著地。上帝的這一疏忽讓很多女孩 傷透了心。我們?cè)陂_(kāi)發(fā)軟件時(shí),一定要吸取這個(gè)教訓(xùn)。 5.1 體系結(jié)構(gòu)設(shè)計(jì) 楊叔子院子曾這樣指點(diǎn)其弟子: 文學(xué)中有科學(xué),音樂(lè)中有數(shù)學(xué),漫畫中有現(xiàn)代數(shù)學(xué)的拓?fù)鋵W(xué)。漫畫家可以“幾筆”就把 一個(gè)人畫出來(lái),不管怎么美化或丑化,就是活像。為什么?因?yàn)槟恰皫坠P”不是別的,而 是拓?fù)鋵W(xué)中的特征不變量,這是事物最本質(zhì)的東西。 體系結(jié)構(gòu)是軟件系統(tǒng)中最本質(zhì)的東西: (1)體系結(jié)構(gòu)是對(duì)復(fù)雜事物的一種抽象。良好的體系結(jié)構(gòu)是普遍適用的,它可以高效地 處理多種多樣的個(gè)體需求。一提起“房子”,我們的腦中馬上就會(huì)出現(xiàn)房子的印象(而不 是地洞的印象)。“房子”是人們對(duì)住宿或辦公環(huán)境的一種抽象。不論是辦公樓還是民房 ,同一類建筑物(甚至不同類的建筑物)之間都具有非常相似的體系結(jié)構(gòu)和構(gòu)造方式。 如果13億中國(guó)人民每個(gè)人都要用特別的方式構(gòu)造奇異的房子,那么960萬(wàn)平方公里的土地 將會(huì)變得千瘡百孔,終日不得安寧。 (2)體系結(jié)構(gòu)在一定的時(shí)間內(nèi)保持穩(wěn)定。只有在穩(wěn)定的環(huán)境下,人們才能干點(diǎn)事情,社 會(huì)才能發(fā)展??茖W(xué)告訴我們,宇宙間萬(wàn)物無(wú)時(shí)無(wú)刻不在運(yùn)動(dòng)、飛行。由于我們的生活環(huán) 境在地球上保持相對(duì)穩(wěn)定,以致于我們可以無(wú)憂無(wú)慮地吃飯和睡覺(jué),壓根就意識(shí)不到自 己是活生生的導(dǎo)彈。軟件開(kāi)發(fā)最怕的就是需求變化,但“需求會(huì)發(fā)生變化”是個(gè)無(wú)法逃避 的現(xiàn)實(shí)。人們希望在需求發(fā)生變化時(shí),最好只對(duì)軟件做些皮皮毛毛的修改,可千萬(wàn)別改 動(dòng)軟件的體系結(jié)構(gòu)。就如人們對(duì)住宿的需求也會(huì)變動(dòng),你可以經(jīng)常改變房間的裝璜和擺 設(shè),但不會(huì)在每次變動(dòng)時(shí)都要去折墻、拆柱、挖地基。如果當(dāng)需求發(fā)生變化時(shí),程序員 不得不去修改軟件的體系結(jié)構(gòu),那么這個(gè)軟件的系統(tǒng)設(shè)計(jì)是失敗的。 良好的體系結(jié)構(gòu)意味著普適、高效和穩(wěn)定。本節(jié)將論述兩種非常通用的軟件體系結(jié)構(gòu) :層次結(jié)構(gòu)和客戶機(jī)/服務(wù)器(Client/Server)結(jié)構(gòu)。 5.1.1 層次結(jié)構(gòu) 層次結(jié)構(gòu)表達(dá)了這么一種常識(shí):有些事情比較復(fù)雜,我們沒(méi)法一口氣干完,就把事情 分為好幾層,一層一層地去做。高層的工作總是建立在低層的工作之上。層次關(guān)系主要 有兩種:上下級(jí)關(guān)系和順序相鄰關(guān)系。 一、上下級(jí)關(guān)系的層次結(jié)構(gòu) 我們從小學(xué)一直讀到博士研究生畢業(yè),要讀20多年,可以分為五個(gè)層次。而范進(jìn)的知 識(shí)結(jié)構(gòu)只有兩層:“私塾”和“秀才”,但讀了五十多年,如圖5.1所示。一般地處于較高層 次的學(xué)生應(yīng)該懂得所有低層次的知識(shí),而處于低層次學(xué)生無(wú)法懂得所有高層次的知識(shí)。 圖5.1的層次結(jié)構(gòu)存在上下級(jí)關(guān)系,如同在軍隊(duì)中,上級(jí)可以命令下級(jí),而下級(jí)不能命令 上級(jí)。如果把圖5.1的層次結(jié)構(gòu)當(dāng)成是一個(gè)軟件系統(tǒng)的結(jié)構(gòu),那么上層子系統(tǒng)可以使用下 層子系統(tǒng)的功能,而下層子系統(tǒng)不能夠使用上層子系統(tǒng)的功能。 二、順序相鄰關(guān)系的層次結(jié)構(gòu) 順序相鄰關(guān)系的層次結(jié)構(gòu)表明通訊只能在相鄰兩層之間發(fā)生,信息只能被一層一層地 順序傳遞。這種層次結(jié)構(gòu)的經(jīng)典之作是計(jì)算機(jī)網(wǎng)絡(luò)的OSI參考模型,如圖5.2所示。為了 減少設(shè)計(jì)的復(fù)雜性,大多數(shù)網(wǎng)絡(luò)都按層(Layer)或級(jí)(Level)的方式組織。每一層的 目的都是向它的上一層提供一定的服務(wù),而把如何實(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ù)和控制信息 逐層向上傳遞。 每一對(duì)相鄰層之間都有接口。接口定義了下層提供的原語(yǔ)操作和服務(wù)。當(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] 考上“舉人”時(shí)已五十多歲了 復(fù)習(xí)報(bào)考“舉人”用了幾十年 圖5.1(a)從小學(xué)讀到博士存在的五個(gè)學(xué)習(xí)階段 圖5.1(b)范進(jìn)的知識(shí)結(jié)構(gòu) 圖5.2 計(jì)算機(jī)網(wǎng)絡(luò)的OSI參考模型 三、其它的層次結(jié)構(gòu) 目前在大型商業(yè)應(yīng)用軟件系統(tǒng)中還流行一種包含中間件(Middleware)的層次結(jié)構(gòu), 如圖5.3所示[Jacobson 1997]。中間件支持與平臺(tái)無(wú)關(guān)的分布式計(jì)算,可以用DCOM和CORBA對(duì)象來(lái)實(shí)現(xiàn)。 圖5.3 包含中間件的層次結(jié)構(gòu) 5.1.2 客戶機(jī)/服務(wù)器結(jié)構(gòu) 讓我們先回顧一下早期的電話系統(tǒng)。貝爾(Alexander Graham Bell)于1876年申請(qǐng)了電話專利。那時(shí)期的電話必須一對(duì)一對(duì)地賣,用戶自己在兩個(gè)電 話之間拉一根線。如果一個(gè)電話用戶想和其它幾個(gè)電話用戶通話,他必須拉n根單獨(dú)的線 到每個(gè)人的房子里。于是在很短的時(shí)間內(nèi),城市里到處都是穿過(guò)房屋和樹(shù)木的混亂的電 話線。很明顯,企圖把所有的電話完全互聯(lián)(如圖5.4(a)所示)是行不通的。 貝爾電話公司在1878年開(kāi)辦了第一個(gè)交換局。公司為每個(gè)客戶架設(shè)一條線。打電話時(shí) ,客戶搖動(dòng)電話的曲柄使電話公司辦公室的鈴響起來(lái),操作員聽(tīng)到鈴聲以后根據(jù)要求將 呼叫方和被呼叫方用跳線手工連接起來(lái)。這種集中交換式的模型如圖5.4(b)所示。很 快地,貝爾系統(tǒng)的交換局就出現(xiàn)在各地。人們又要求能打城市間的長(zhǎng)途電話,就出現(xiàn)了 二級(jí)交換局,以后進(jìn)一步發(fā)展為多個(gè)二級(jí)交換局。[Tanenbaum 1998] 5.4(a)完全互聯(lián)的電話系統(tǒng) 5.4(b)集中交換式的電話系統(tǒng) 如果將圖5.4(b)中的電話看成是客戶程序,將中心的交換局看成是服務(wù)程序,那么 圖5.4(b)就是典型的客戶機(jī)/服務(wù)器結(jié)構(gòu)。注意這里客戶機(jī)和服務(wù)器都是指軟件而不是 指硬件(一臺(tái)計(jì)算機(jī)可以放多個(gè)客戶機(jī)和服務(wù)器軟件)。 客戶機(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ù)器而獲得所需的信息。 客戶機(jī)和服務(wù)器之間的通訊以“請(qǐng)求——響應(yīng)”的方式進(jìn)行??蛻魴C(jī)先向服務(wù)器發(fā)起“請(qǐng) 求”(Request),服務(wù)器再響應(yīng)(Response)這個(gè)請(qǐng)求,如圖5.5所示。 請(qǐng)求 響應(yīng) 圖5.5 Client和Server之間的通訊以“請(qǐng)求——響應(yīng)”的方式進(jìn)行 采用“請(qǐng)求——響應(yīng)”這種通訊方式的基本動(dòng)機(jī)是為了解決“聚集”(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) 求”,因此就形成了“請(qǐng)求——響應(yīng)”的通訊方式。 在Internet/Intranet領(lǐng)域,目前“瀏覽器—Web 服務(wù)器—數(shù)據(jù)庫(kù)服務(wù)器” 結(jié)構(gòu)是一種非常流行的客戶機(jī)/服務(wù)器結(jié)構(gòu),如圖5.6所示。這種結(jié)構(gòu)最大的優(yōu)點(diǎn)是:客 戶機(jī)統(tǒng)一采用瀏覽器,這不僅讓用戶使用方便,而且使得客戶機(jī)端不存在維護(hù)的問(wèn)題。 當(dāng)然,軟件開(kāi)發(fā)布和維護(hù)的工作不是自動(dòng)消失了,而是轉(zhuǎn)移到了Web 服務(wù)器端。在Web 服務(wù)器端,程序員要用腳本語(yǔ)言編寫響應(yīng)頁(yè)面。例如用Microsoft的ASP語(yǔ)言查詢數(shù)據(jù)庫(kù) 服務(wù)器,將結(jié)果保存在Web 頁(yè)面中,再由瀏覽器顯示出來(lái)。 HTTP 請(qǐng)求 查詢 HTTP 響應(yīng) 圖5.6 “瀏覽器—Web 服務(wù)器—數(shù)據(jù)庫(kù)服務(wù)器”結(jié)構(gòu) 5.2 模 塊 設(shè) 計(jì) 在設(shè)計(jì)好軟件的體系結(jié)構(gòu)后,就已經(jīng)在宏觀上明確了各個(gè)模塊應(yīng)具有什么功能,應(yīng)放 在體系結(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)該怎樣與其它模塊交流信息”。 本節(jié)將論述評(píng)價(jià)模塊設(shè)計(jì)優(yōu)劣的三個(gè)特征因素:“信息隱藏”、“內(nèi)聚與耦合”和“封閉— —開(kāi)放性”。 5.2.1 信息隱藏 在一節(jié)不和諧的課堂里,老師嘆氣道:“要是坐在后排聊天的同學(xué)能象中間打牌的同學(xué) 那么安靜,就不會(huì)影響到前排睡覺(jué)的同學(xué)?!?這個(gè)故事告訴我們,如果不想讓壞事傳播開(kāi)來(lái),就應(yīng)該把壞事隱藏起來(lái),“家丑不可外 揚(yáng)”就是這個(gè)道理。為了盡量避免某個(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] 美國(guó)也許是世界上丑聞最多的國(guó)家,因?yàn)樗非竺裰?,不懂得“隱藏信息”。但美國(guó)又 是軟件產(chǎn)業(yè)最發(fā)...
軟件工程思想5
第五章 系 統(tǒng) 設(shè) 計(jì) 系統(tǒng)設(shè)計(jì)是把需求轉(zhuǎn)化為軟件系統(tǒng)的最重要的環(huán)節(jié)。系統(tǒng)設(shè)計(jì)的優(yōu)劣在根本上決定了 軟件系統(tǒng)的質(zhì)量。就象“一切帝國(guó)主義都是紙老虎”那樣可以斷定“差的系統(tǒng)設(shè)計(jì)必定產(chǎn)生 差的軟件系統(tǒng)。”所以我們要努力保證系統(tǒng)設(shè)計(jì)“根正苗紅”,把一切左傾、右傾的設(shè)計(jì)思 潮消滅在萌芽狀態(tài)。 Windows NT的一位系統(tǒng)設(shè)計(jì)師擁有8輛法拉利跑車,讓Microsoft公司的一些程序員十分眼紅。但 你只能羨慕而不能憤恨,因?yàn)椴⒉皇敲總€(gè)程序員都有本事成為復(fù)雜軟件系統(tǒng)的設(shè)計(jì)師。 系統(tǒng)設(shè)計(jì)要比純粹的編程困難得多。即便你清楚客戶的需求,卻未必知道應(yīng)該設(shè)計(jì)什么 樣的軟件系統(tǒng)——既能掙最多的錢又能讓客戶滿意?!疤煜挛骱蠲朗呛贾荨?,千 年前蘇東坡大學(xué)士對(duì)西湖精采絕倫的系統(tǒng)設(shè)計(jì),使杭州榮升為“天堂”,讓后人只剩下贊 嘆和破壞的份了。 本章講述系統(tǒng)設(shè)計(jì)的四方面內(nèi)容:體系結(jié)構(gòu)設(shè)計(jì)、模塊設(shè)計(jì)、數(shù)據(jù)結(jié)構(gòu)與算法設(shè)計(jì)、 用戶界面設(shè)計(jì)。如果將軟件系統(tǒng)比喻為人體,那么: (1)體系結(jié)構(gòu)就如同人的骨架。如果某個(gè)家伙的骨架是猴子,那么無(wú)論怎樣喂養(yǎng)和美容 ,這家伙始終都是猴子,不會(huì)成為人。 (2)模塊就如同人的器官,具有特定的功能。人體中最出色的模塊設(shè)計(jì)之一是手,手只 有幾種動(dòng)作,卻能做無(wú)限多的事情。人體中最糟糕的模塊設(shè)計(jì)之一是嘴巴,嘴巴將最有 價(jià)值但毫無(wú)相干的幾種功能如吃飯、說(shuō)話、親吻混為一體,使之無(wú)法并行處理,真乃人 類之不幸。 (3)數(shù)據(jù)結(jié)構(gòu)與算法就如同人的血脈和神經(jīng),它讓器官具有生命并能發(fā)揮功能。數(shù)據(jù)結(jié) 構(gòu)與算法分布在體系結(jié)構(gòu)和模塊中,它將協(xié)調(diào)系統(tǒng)的各個(gè)功能。人的耳朵和嘴巴雖然是 相對(duì)獨(dú)立的器官,但如果耳朵失聰了,嘴巴就只能發(fā)出“啊”“嗚”的聲音,等于喪失了說(shuō) 話的功能(所以聾子天生就是啞巴),可人們卻又能用手勢(shì)代替說(shuō)話。人體的數(shù)據(jù)結(jié)構(gòu) 與算法設(shè)計(jì)真是十分神奇并且十分可笑。 (4)用戶界面就如同人的外表,最容易讓人一見(jiàn)鐘情或一見(jiàn)惡心。象人類追求心靈美和 外表美那樣,軟件系統(tǒng)也追求(內(nèi)在的)功能強(qiáng)大和(外表的)界面友好。但隨著生活 節(jié)奏的加快,人們已少有興趣去品味深藏不露的內(nèi)在美。如果把Unix系統(tǒng)比作是健壯的 漢子和婦人,那么Windows系統(tǒng)就象嫵媚的小白臉和狐貍精。想不到Windows系統(tǒng)竟然能 興風(fēng)作浪,占去大半市場(chǎng)。有鑒于此,我們應(yīng)該鼓勵(lì)女士多買化妝品(男士付錢)以獲 得更好的界面。 在進(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ì)把好事搞砸了。據(jù)說(shuō)上帝把所有的女士都設(shè)計(jì)成天 使,可是天使們?cè)谙路矔r(shí)有些雙腳先著地,有些臉先著地。上帝的這一疏忽讓很多女孩 傷透了心。我們?cè)陂_(kāi)發(fā)軟件時(shí),一定要吸取這個(gè)教訓(xùn)。 5.1 體系結(jié)構(gòu)設(shè)計(jì) 楊叔子院子曾這樣指點(diǎn)其弟子: 文學(xué)中有科學(xué),音樂(lè)中有數(shù)學(xué),漫畫中有現(xiàn)代數(shù)學(xué)的拓?fù)鋵W(xué)。漫畫家可以“幾筆”就把 一個(gè)人畫出來(lái),不管怎么美化或丑化,就是活像。為什么?因?yàn)槟恰皫坠P”不是別的,而 是拓?fù)鋵W(xué)中的特征不變量,這是事物最本質(zhì)的東西。 體系結(jié)構(gòu)是軟件系統(tǒng)中最本質(zhì)的東西: (1)體系結(jié)構(gòu)是對(duì)復(fù)雜事物的一種抽象。良好的體系結(jié)構(gòu)是普遍適用的,它可以高效地 處理多種多樣的個(gè)體需求。一提起“房子”,我們的腦中馬上就會(huì)出現(xiàn)房子的印象(而不 是地洞的印象)。“房子”是人們對(duì)住宿或辦公環(huán)境的一種抽象。不論是辦公樓還是民房 ,同一類建筑物(甚至不同類的建筑物)之間都具有非常相似的體系結(jié)構(gòu)和構(gòu)造方式。 如果13億中國(guó)人民每個(gè)人都要用特別的方式構(gòu)造奇異的房子,那么960萬(wàn)平方公里的土地 將會(huì)變得千瘡百孔,終日不得安寧。 (2)體系結(jié)構(gòu)在一定的時(shí)間內(nèi)保持穩(wěn)定。只有在穩(wěn)定的環(huán)境下,人們才能干點(diǎn)事情,社 會(huì)才能發(fā)展??茖W(xué)告訴我們,宇宙間萬(wàn)物無(wú)時(shí)無(wú)刻不在運(yùn)動(dòng)、飛行。由于我們的生活環(huán) 境在地球上保持相對(duì)穩(wěn)定,以致于我們可以無(wú)憂無(wú)慮地吃飯和睡覺(jué),壓根就意識(shí)不到自 己是活生生的導(dǎo)彈。軟件開(kāi)發(fā)最怕的就是需求變化,但“需求會(huì)發(fā)生變化”是個(gè)無(wú)法逃避 的現(xiàn)實(shí)。人們希望在需求發(fā)生變化時(shí),最好只對(duì)軟件做些皮皮毛毛的修改,可千萬(wàn)別改 動(dòng)軟件的體系結(jié)構(gòu)。就如人們對(duì)住宿的需求也會(huì)變動(dòng),你可以經(jīng)常改變房間的裝璜和擺 設(shè),但不會(huì)在每次變動(dòng)時(shí)都要去折墻、拆柱、挖地基。如果當(dāng)需求發(fā)生變化時(shí),程序員 不得不去修改軟件的體系結(jié)構(gòu),那么這個(gè)軟件的系統(tǒng)設(shè)計(jì)是失敗的。 良好的體系結(jié)構(gòu)意味著普適、高效和穩(wěn)定。本節(jié)將論述兩種非常通用的軟件體系結(jié)構(gòu) :層次結(jié)構(gòu)和客戶機(jī)/服務(wù)器(Client/Server)結(jié)構(gòu)。 5.1.1 層次結(jié)構(gòu) 層次結(jié)構(gòu)表達(dá)了這么一種常識(shí):有些事情比較復(fù)雜,我們沒(méi)法一口氣干完,就把事情 分為好幾層,一層一層地去做。高層的工作總是建立在低層的工作之上。層次關(guān)系主要 有兩種:上下級(jí)關(guān)系和順序相鄰關(guān)系。 一、上下級(jí)關(guān)系的層次結(jié)構(gòu) 我們從小學(xué)一直讀到博士研究生畢業(yè),要讀20多年,可以分為五個(gè)層次。而范進(jìn)的知 識(shí)結(jié)構(gòu)只有兩層:“私塾”和“秀才”,但讀了五十多年,如圖5.1所示。一般地處于較高層 次的學(xué)生應(yīng)該懂得所有低層次的知識(shí),而處于低層次學(xué)生無(wú)法懂得所有高層次的知識(shí)。 圖5.1的層次結(jié)構(gòu)存在上下級(jí)關(guān)系,如同在軍隊(duì)中,上級(jí)可以命令下級(jí),而下級(jí)不能命令 上級(jí)。如果把圖5.1的層次結(jié)構(gòu)當(dāng)成是一個(gè)軟件系統(tǒng)的結(jié)構(gòu),那么上層子系統(tǒng)可以使用下 層子系統(tǒng)的功能,而下層子系統(tǒng)不能夠使用上層子系統(tǒng)的功能。 二、順序相鄰關(guān)系的層次結(jié)構(gòu) 順序相鄰關(guān)系的層次結(jié)構(gòu)表明通訊只能在相鄰兩層之間發(fā)生,信息只能被一層一層地 順序傳遞。這種層次結(jié)構(gòu)的經(jīng)典之作是計(jì)算機(jī)網(wǎng)絡(luò)的OSI參考模型,如圖5.2所示。為了 減少設(shè)計(jì)的復(fù)雜性,大多數(shù)網(wǎng)絡(luò)都按層(Layer)或級(jí)(Level)的方式組織。每一層的 目的都是向它的上一層提供一定的服務(wù),而把如何實(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ù)和控制信息 逐層向上傳遞。 每一對(duì)相鄰層之間都有接口。接口定義了下層提供的原語(yǔ)操作和服務(wù)。當(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] 考上“舉人”時(shí)已五十多歲了 復(fù)習(xí)報(bào)考“舉人”用了幾十年 圖5.1(a)從小學(xué)讀到博士存在的五個(gè)學(xué)習(xí)階段 圖5.1(b)范進(jìn)的知識(shí)結(jié)構(gòu) 圖5.2 計(jì)算機(jī)網(wǎng)絡(luò)的OSI參考模型 三、其它的層次結(jié)構(gòu) 目前在大型商業(yè)應(yīng)用軟件系統(tǒng)中還流行一種包含中間件(Middleware)的層次結(jié)構(gòu), 如圖5.3所示[Jacobson 1997]。中間件支持與平臺(tái)無(wú)關(guān)的分布式計(jì)算,可以用DCOM和CORBA對(duì)象來(lái)實(shí)現(xiàn)。 圖5.3 包含中間件的層次結(jié)構(gòu) 5.1.2 客戶機(jī)/服務(wù)器結(jié)構(gòu) 讓我們先回顧一下早期的電話系統(tǒng)。貝爾(Alexander Graham Bell)于1876年申請(qǐng)了電話專利。那時(shí)期的電話必須一對(duì)一對(duì)地賣,用戶自己在兩個(gè)電 話之間拉一根線。如果一個(gè)電話用戶想和其它幾個(gè)電話用戶通話,他必須拉n根單獨(dú)的線 到每個(gè)人的房子里。于是在很短的時(shí)間內(nèi),城市里到處都是穿過(guò)房屋和樹(shù)木的混亂的電 話線。很明顯,企圖把所有的電話完全互聯(lián)(如圖5.4(a)所示)是行不通的。 貝爾電話公司在1878年開(kāi)辦了第一個(gè)交換局。公司為每個(gè)客戶架設(shè)一條線。打電話時(shí) ,客戶搖動(dòng)電話的曲柄使電話公司辦公室的鈴響起來(lái),操作員聽(tīng)到鈴聲以后根據(jù)要求將 呼叫方和被呼叫方用跳線手工連接起來(lái)。這種集中交換式的模型如圖5.4(b)所示。很 快地,貝爾系統(tǒng)的交換局就出現(xiàn)在各地。人們又要求能打城市間的長(zhǎng)途電話,就出現(xiàn)了 二級(jí)交換局,以后進(jìn)一步發(fā)展為多個(gè)二級(jí)交換局。[Tanenbaum 1998] 5.4(a)完全互聯(lián)的電話系統(tǒng) 5.4(b)集中交換式的電話系統(tǒng) 如果將圖5.4(b)中的電話看成是客戶程序,將中心的交換局看成是服務(wù)程序,那么 圖5.4(b)就是典型的客戶機(jī)/服務(wù)器結(jié)構(gòu)。注意這里客戶機(jī)和服務(wù)器都是指軟件而不是 指硬件(一臺(tái)計(jì)算機(jī)可以放多個(gè)客戶機(jī)和服務(wù)器軟件)。 客戶機(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ù)器而獲得所需的信息。 客戶機(jī)和服務(wù)器之間的通訊以“請(qǐng)求——響應(yīng)”的方式進(jìn)行??蛻魴C(jī)先向服務(wù)器發(fā)起“請(qǐng) 求”(Request),服務(wù)器再響應(yīng)(Response)這個(gè)請(qǐng)求,如圖5.5所示。 請(qǐng)求 響應(yīng) 圖5.5 Client和Server之間的通訊以“請(qǐng)求——響應(yīng)”的方式進(jìn)行 采用“請(qǐng)求——響應(yīng)”這種通訊方式的基本動(dòng)機(jī)是為了解決“聚集”(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) 求”,因此就形成了“請(qǐng)求——響應(yīng)”的通訊方式。 在Internet/Intranet領(lǐng)域,目前“瀏覽器—Web 服務(wù)器—數(shù)據(jù)庫(kù)服務(wù)器” 結(jié)構(gòu)是一種非常流行的客戶機(jī)/服務(wù)器結(jié)構(gòu),如圖5.6所示。這種結(jié)構(gòu)最大的優(yōu)點(diǎn)是:客 戶機(jī)統(tǒng)一采用瀏覽器,這不僅讓用戶使用方便,而且使得客戶機(jī)端不存在維護(hù)的問(wèn)題。 當(dāng)然,軟件開(kāi)發(fā)布和維護(hù)的工作不是自動(dòng)消失了,而是轉(zhuǎn)移到了Web 服務(wù)器端。在Web 服務(wù)器端,程序員要用腳本語(yǔ)言編寫響應(yīng)頁(yè)面。例如用Microsoft的ASP語(yǔ)言查詢數(shù)據(jù)庫(kù) 服務(wù)器,將結(jié)果保存在Web 頁(yè)面中,再由瀏覽器顯示出來(lái)。 HTTP 請(qǐng)求 查詢 HTTP 響應(yīng) 圖5.6 “瀏覽器—Web 服務(wù)器—數(shù)據(jù)庫(kù)服務(wù)器”結(jié)構(gòu) 5.2 模 塊 設(shè) 計(jì) 在設(shè)計(jì)好軟件的體系結(jié)構(gòu)后,就已經(jīng)在宏觀上明確了各個(gè)模塊應(yīng)具有什么功能,應(yīng)放 在體系結(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)該怎樣與其它模塊交流信息”。 本節(jié)將論述評(píng)價(jià)模塊設(shè)計(jì)優(yōu)劣的三個(gè)特征因素:“信息隱藏”、“內(nèi)聚與耦合”和“封閉— —開(kāi)放性”。 5.2.1 信息隱藏 在一節(jié)不和諧的課堂里,老師嘆氣道:“要是坐在后排聊天的同學(xué)能象中間打牌的同學(xué) 那么安靜,就不會(huì)影響到前排睡覺(jué)的同學(xué)?!?這個(gè)故事告訴我們,如果不想讓壞事傳播開(kāi)來(lái),就應(yīng)該把壞事隱藏起來(lái),“家丑不可外 揚(yáng)”就是這個(gè)道理。為了盡量避免某個(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] 美國(guó)也許是世界上丑聞最多的國(guó)家,因?yàn)樗非竺裰?,不懂得“隱藏信息”。但美國(guó)又 是軟件產(chǎn)業(yè)最發(fā)...
軟件工程思想5
[下載聲明]
1.本站的所有資料均為資料作者提供和網(wǎng)友推薦收集整理而來(lái),僅供學(xué)習(xí)和研究交流使用。如有侵犯到您版權(quán)的,請(qǐng)來(lái)電指出,本站將立即改正。電話:010-82593357。
2、訪問(wèn)管理資源網(wǎng)的用戶必須明白,本站對(duì)提供下載的學(xué)習(xí)資料等不擁有任何權(quán)利,版權(quán)歸該下載資源的合法擁有者所有。
3、本站保證站內(nèi)提供的所有可下載資源都是按“原樣”提供,本站未做過(guò)任何改動(dòng);但本網(wǎng)站不保證本站提供的下載資源的準(zhǔn)確性、安全性和完整性;同時(shí)本網(wǎng)站也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的損失或傷害。
4、未經(jīng)本網(wǎng)站的明確許可,任何人不得大量鏈接本站下載資源;不得復(fù)制或仿造本網(wǎng)站。本網(wǎng)站對(duì)其自行開(kāi)發(fā)的或和他人共同開(kāi)發(fā)的所有內(nèi)容、技術(shù)手段和服務(wù)擁有全部知識(shí)產(chǎn)權(quán),任何人不得侵害或破壞,也不得擅自使用。
我要上傳資料,請(qǐng)點(diǎn)我!
管理工具分類
ISO認(rèn)證課程講義管理表格合同大全法規(guī)條例營(yíng)銷資料方案報(bào)告說(shuō)明標(biāo)準(zhǔn)管理戰(zhàn)略商業(yè)計(jì)劃書市場(chǎng)分析戰(zhàn)略經(jīng)營(yíng)策劃方案培訓(xùn)講義企業(yè)上市采購(gòu)物流電子商務(wù)質(zhì)量管理企業(yè)名錄生產(chǎn)管理金融知識(shí)電子書客戶管理企業(yè)文化報(bào)告論文項(xiàng)目管理財(cái)務(wù)資料固定資產(chǎn)人力資源管理制度工作分析績(jī)效考核資料面試招聘人才測(cè)評(píng)崗位管理職業(yè)規(guī)劃KPI績(jī)效指標(biāo)勞資關(guān)系薪酬激勵(lì)人力資源案例人事表格考勤管理人事制度薪資表格薪資制度招聘面試表格崗位分析員工管理薪酬管理績(jī)效管理入職指引薪酬設(shè)計(jì)績(jī)效管理績(jī)效管理培訓(xùn)績(jī)效管理方案平衡計(jì)分卡績(jī)效評(píng)估績(jī)效考核表格人力資源規(guī)劃安全管理制度經(jīng)營(yíng)管理制度組織機(jī)構(gòu)管理辦公總務(wù)管理財(cái)務(wù)管理制度質(zhì)量管理制度會(huì)計(jì)管理制度代理連鎖制度銷售管理制度倉(cāng)庫(kù)管理制度CI管理制度廣告策劃制度工程管理制度采購(gòu)管理制度生產(chǎn)管理制度進(jìn)出口制度考勤管理制度人事管理制度員工福利制度咨詢?cè)\斷制度信息管理制度員工培訓(xùn)制度辦公室制度人力資源管理企業(yè)培訓(xùn)績(jī)效考核其它
精品推薦
- 1暗促-酒店玫瑰靜悄悄地開(kāi) 369
- 2終端陳列十五大原則 381
- 3專業(yè)廣告運(yùn)作模式 342
- 4****主營(yíng)業(yè)務(wù)發(fā)展戰(zhàn)略設(shè)計(jì) 375
- 5中小企業(yè)物流發(fā)展的對(duì)策 394
- 6主顧開(kāi)拓 482
- 7主動(dòng)推進(jìn)的客戶服務(wù) 342
- 8專業(yè)媒體策劃與購(gòu)買 372
- 9中遠(yuǎn)電視廣告CF 417
下載排行
- 1社會(huì)保障基礎(chǔ)知識(shí)(ppt) 16695
- 2安全生產(chǎn)事故案例分析(ppt 16695
- 3行政專員崗位職責(zé) 16695
- 4品管部崗位職責(zé)與任職要求 16695
- 5員工守則 16695
- 6軟件驗(yàn)收?qǐng)?bào)告 16695
- 7問(wèn)卷調(diào)查表(范例) 16695
- 8工資發(fā)放明細(xì)表 16695
- 9文件簽收單 16695