【正文】
計(jì)算機(jī)學(xué)院 /軟件學(xué)院 設(shè)計(jì)方法的發(fā)展 ? 復(fù)雜性 單機(jī) —— 〉 網(wǎng)絡(luò) ? 應(yīng)用領(lǐng)域 廣泛;差異大 ? 集成度 軟硬件協(xié)同 ? 更新速度 重用 ? 通用方法 多種起因: 60 計(jì)算機(jī)學(xué)院 /軟件學(xué)院 1. 軟硬件協(xié)同設(shè)計(jì) 系 統(tǒng) 需 求 規(guī) 格 說 明系 統(tǒng) 軟 硬 件 劃 分性 能 評(píng) 估硬 件 綜 合 、 軟 件 編 譯 、 接 口 設(shè) 計(jì)軟 硬 件 集 成軟 硬 件 協(xié) 同 仿 真系 統(tǒng) 評(píng) 估 、 設(shè) 計(jì) 驗(yàn) 證設(shè) 計(jì) 完 成NY61 計(jì)算機(jī)學(xué)院 /軟件學(xué)院 2. 構(gòu)件化設(shè)計(jì) 系 統(tǒng) 需 求 規(guī) 格 說 明基 于 構(gòu) 件 庫 選 擇 構(gòu) 件N存 在生 成 系 統(tǒng)構(gòu) 件 設(shè) 計(jì)加 入 構(gòu) 件 庫Y標(biāo) 識(shí) 所 需 要 的 構(gòu) 件62 計(jì)算機(jī)學(xué)院 /軟件學(xué)院 3. 基于中間件的設(shè)計(jì) O R B C o r e G I O P / I I O PI D L S t u bO R B 接 口P O AI D L S k e l e t o n服 務(wù)I D L 編 譯 器客 戶O R B : 對(duì) 象 請(qǐng) 求 代 理P O A : 可 移 植 對(duì) 象 適 配 器I D L : 接 口 定 義 語 言G I O P : 通 用 O R B 間 協(xié) 議I I O P : 互 聯(lián) 網(wǎng) O R B 間 協(xié) 議63 計(jì)算機(jī)學(xué)院 /軟件學(xué)院 基本設(shè)計(jì)原則 ? 盡量簡單 ? 使用靜態(tài)表 ? 盡量減少動(dòng)態(tài)性 ? 恰當(dāng)?shù)娜蝿?wù)數(shù)目 ? 使用有限狀態(tài)自動(dòng)機(jī)輔助設(shè)計(jì) ? 面向?qū)ο笤O(shè)計(jì) ? 減少預(yù)留接口 64 計(jì)算機(jī)學(xué)院 /軟件學(xué)院 盡量簡單 ? 不存在完善方法 任何的設(shè)計(jì)都只能盡量好,不可能最優(yōu)。 r e t u r n 1 。 / * 計(jì) 數(shù) 器 和 轉(zhuǎn) 換 用 臨 時(shí) 變 量 * / / * 以 二 進(jìn) 制 只 讀 方 式 打 開 文 件 并 判 斷 是 否 成 功 * / i f ( ( f i n = f o p e n ( “ c a t . p i c ” , “ r b ” ) ) = = N U L L ) { / * 如 果 打 開 失 敗 則 顯 示 出 錯(cuò) 信 息 * / p u t s ( “ 打 開 文 件 出 錯(cuò) ” ) 。}s t a t i c i n t _ ( i n t _ 1 , i n t _ 2 ) { r e t u r n _ 1 = = _ 2 ? _ 1 + + + _ 2 : _ 1 _ 2 。 / / 真 正 讀 入 ? ?}81 計(jì)算機(jī)學(xué)院 /軟件學(xué)院 小結(jié) ① 任何語法規(guī)則都可能被濫用 ② 風(fēng)格的優(yōu)劣取決于是否是正確的選擇 ③ 選擇的前提:代碼是否更為簡潔、高效、易維護(hù) 82 計(jì)算機(jī)學(xué)院 /軟件學(xué)院 二、 內(nèi)存使用 程序內(nèi)存異常的兩種情況 1. 持續(xù)的 內(nèi)存泄漏 造成內(nèi)存不足 2. 非法內(nèi)存訪問 如普通用戶訪問系統(tǒng)區(qū) 83 計(jì)算機(jī)學(xué)院 /軟件學(xué)院 1. 內(nèi)存泄漏 V C 程 序i n t m a i n ( ) { i n t * * m a t r i x 。 r e t u r n 0 。 ) m a t r i x = n e w i n t [ 1 0 0 ] [ 1 0 0 ] 。}問題示例 已經(jīng)說明使用方法: 經(jīng)常失效??! 86 計(jì)算機(jī)學(xué)院 /軟件學(xué)院 小結(jié) ① 分配的內(nèi)存一定要釋放 ② 所有可能的出口都需要釋放完全 ③ 如果沒有特別原因,永遠(yuǎn)不要假定別人會(huì)彌補(bǔ)你的錯(cuò)誤 ④ 內(nèi)存不足對(duì)不同系統(tǒng)影響不同 87 計(jì)算機(jī)學(xué)院 /軟件學(xué)院 2. 非法訪問 c l a s s C r a s h H o u r { p u b l i c : C r a s h H o u r ( c o n s t c h a r * n a m e ) { i f ( s t r l e n ( n a m e ) = M A X _ L E N ) { m y _ n a m e = n e w c h a r [ M A X _ L E N ) 。 } p r o t e c t e d : c h a r * m y _ n a m e 。 s u m = 1 。 f o r j = 1 t o 2 * i d o f a c t o r = f a c t o r * j 。 s u m = 1 。 f a c t o r = f a c t o r * ( 1 ) 。 ① 系統(tǒng)是否需要多線程機(jī)制 ② 是用 多線程 還是用 多任務(wù) ③ 使用多線程機(jī)制會(huì)增加系統(tǒng)的復(fù)雜度 錯(cuò)誤增加,是否能保證系統(tǒng)穩(wěn)定可靠 97 計(jì)算機(jī)學(xué)院 /軟件學(xué)院 多進(jìn)程的特點(diǎn) ① 傳統(tǒng)的多任務(wù)處理均用多進(jìn)程方式實(shí)現(xiàn) fork()、 exec()、 signal()、wait()、 …… ② 每個(gè)進(jìn)程有獨(dú)立的內(nèi)存空間 可以放心使用,不必?fù)?dān)心共享沖突 ③ 缺陷 不同進(jìn)程之間共享資源和通信困難,進(jìn)程切換開銷大,耗時(shí) 98 計(jì)算機(jī)學(xué)院 /軟件學(xué)院 輕量級(jí)進(jìn)程的特點(diǎn) ① 一種折衷的線程實(shí)現(xiàn)方式 Solaris ② 應(yīng)用程序創(chuàng)建的輕量級(jí)進(jìn)程與應(yīng)用程序在同一地址空間運(yùn)行 共享內(nèi)存和資源 ③ 每個(gè)輕量級(jí)進(jìn)程綁定在一個(gè)內(nèi)核線程上 實(shí)際線程操作在內(nèi)核完成 ④ 缺點(diǎn) 涉及內(nèi)核態(tài)與用戶態(tài)的切換,必須做(用戶與內(nèi)核)邊界檢查 99 計(jì)算機(jī)學(xué)院 /軟件學(xué)院 線程的特點(diǎn) ① 用戶線程通過線程庫實(shí)現(xiàn),在用戶進(jìn)程的地址空間和保護(hù)模式下運(yùn)行 Windows、 Linux、Unix、 …… ② 同一進(jìn)程的多個(gè)線程共享同一地址空間 共享全局?jǐn)?shù)據(jù) ③ 缺點(diǎn) 對(duì)共享數(shù)據(jù)的讀寫容易引起沖突,如死鎖 100 計(jì)算機(jī)學(xué)院 /軟件學(xué)院 小結(jié) ① 只有在必要情況下才使用多線程 ② 多線程代碼中應(yīng)盡量避免使用全局?jǐn)?shù)據(jù)或共享資源 ③ 切記使用線程同步機(jī)制 對(duì)共享 ④ 類的 靜態(tài)變量 與全局變量一樣危險(xiǎn) 對(duì)多線程環(huán)境 101 計(jì)算機(jī)學(xué)院 /軟件學(xué)院 四、 版本管理 DLL使用問題: 永遠(yuǎn)不清楚哪個(gè) DLL才擁有版本向后兼容的能力 COM問題、 OCX問題、 Java Class問題、 …… 102 計(jì)算機(jī)學(xué)院 /軟件學(xué)院 解決方案 ① 盡量保持可重用組件的兼容性 ② 將特定版本組件與特定版本應(yīng)用程序捆綁在一起 ③ 用全新組件實(shí)現(xiàn)新增功能 ④ 在軟件安裝時(shí),先檢查版本沖突問題 103 計(jì)算機(jī)學(xué)院 /軟件學(xué)院 版本演化示例 ① 版本 ② 增加功能,得到版本 ③ 版本 bug, 修改但未賦予新的版本號(hào) ④ 在修改版本 ,得到版本 (無 GUI) ⑤ 在原版本 ,得到版本 ( 增加 GUI) ⑥ 不斷進(jìn)一步完善功能 以前文檔丟失 104 計(jì)算機(jī)學(xué)院 /軟件學(xué)院 版本管理基本原則 ① 所有程序員從一個(gè)地方獲取工作代碼 ② 復(fù)制代碼等于復(fù)制錯(cuò)誤 ③ 有效的版本編碼 ④ 避免不必要的版本分支 ⑤ 注意備份 ⑥ 不允許從備份處獲取工作代碼 只用于修復(fù)新引入的錯(cuò)誤 105 計(jì)算機(jī)學(xué)院 /軟件學(xué)院 五、 系統(tǒng)設(shè)計(jì) 產(chǎn) 品 經(jīng) 理 A : 編 一 個(gè) 程 序 , 將 1 0 0 個(gè) 正 整 數(shù) 按 遞 增 順 序 排 列 。 110 計(jì)算機(jī)學(xué)院 /軟件學(xué)院 六、 典型方法的比較 ? 典型的 SA和 OO方法 ? 方法的比較 ? 由頂向下的分解 要說明的問題: 111 計(jì)算機(jī)學(xué)院 /軟件學(xué)院 1) 系統(tǒng)描述 ? 典型應(yīng)用 航空公司訂票系統(tǒng) ? 可能的情況 – 用戶驗(yàn)證 – 查詢航班 指定日期 – 查詢座位 指定航班 – 查詢預(yù)訂 ? 每種情況下,可能的操作 – 顯示面板 – 用戶填表(需求) – 系統(tǒng)處理 一致性檢查、修改 DB、 進(jìn)一步處理(另一情況)、 … 112 計(jì)算機(jī)學(xué)院 /軟件學(xué)院 操作界面 — 查 查 查 查 —航 航 航 航航 航 航 航航 航 航 航 航航 航 航 航6 航 1 0 航 6 航 1 2 航航 航 航 航 航航 航 航 航 航 航 航 航 航 航 航 航 航 航航 航 航 航 航 航 航 航 航 航 航 航 航 航航 航 航 航 航 航 航 航 航 航 x x x x D e p 9 : 0 0 A r r 1 1 : 2 0航 航 航 航 x x x x D e p 1 3 : 0 0 A r r 1 5 : 2 0航 航 航 航 航 航 航0 — — 航 航1 — — 航 航2 — — 航 航 航 航 航3 — — 航 航 航 航 航113 計(jì)算機(jī)學(xué)院 /軟件學(xué)院 任務(wù)狀態(tài)圖 幫 助初 始化幫 助認(rèn) 可預(yù) 訂查 詢航 班查 詢座 位幫 助幫 助 幫 助1111112311幫 助113211322323114 計(jì)算機(jī)學(xué)院 /軟件學(xué)院 2) 問題求解要點(diǎn) ? 盡可能多的一般性和靈活性 ? 狀態(tài)圖可能很大 一個(gè)應(yīng)用可以有數(shù) 百個(gè)狀態(tài) ? 結(jié)構(gòu)可能改變 設(shè)計(jì)者無法預(yù)見所 有可能的狀態(tài)和轉(zhuǎn)換,完成后需要 改變 ? 應(yīng)用多樣 最小的航空公司訂票系 統(tǒng)是一個(gè)范例,但各公司的需求不 同,因此需要可適合不同應(yīng)用的復(fù) 用模塊集 115 計(jì)算機(jī)學(xué)院 /軟件學(xué)院 3) 第一個(gè)方法 ? 直接的、不精確的程序模式 ? 由許多模塊組成 ,每個(gè)模塊處理系統(tǒng)中的 一個(gè)狀態(tài) B查詢、 B預(yù)訂、 B取消、 … ? 模塊結(jié)構(gòu)(非 OO觀點(diǎn)) B查詢 Repeat ‘在訂票面板上顯示查詢’ Read 用戶輸入 C for 下一步 If C非法 Then ?輸入合適信息’ End Until C合法 Case C Of ‘處理輸入’ C0 : goto Exi