【正文】
Do state := initial Repeat display(s) read(s, →a) ok := correct(s, a) If not ok Then message(s,a) End Until ok End process(s, a) c := next_choice(a) End 127 計算機學院 /軟件學院 相關操作 ? display(s) 輸出到與狀態(tài) s有關的面板 ? read(s, →a) 將狀態(tài) s的顯示面板上的用戶輸入讀到 a中 ? correct(s, a) 返回 true的充要條件是 a為正確輸入 ? 必須正確處理第一級的特性 – display、 read、 correct、 message、 … 128 計算機學院 /軟件學院 方案評述 ? 一個較好的方案,不完全滿意 – 比?第一個方法?好 – 無法滿足可擴展性和可復用性 ? 狀態(tài) – 表面上與應用無關 – 實際上模塊間、與應用間緊耦合 ? 主要問題 系統(tǒng)的數(shù)據(jù)變遷結(jié)構(gòu) – 狀態(tài) s到處都用 – 真正的程序結(jié)構(gòu)必然涉及?數(shù)據(jù)? 129 計算機學院 /軟件學院 程序結(jié)構(gòu) 執(zhí) 行 會 話初 始 化 狀 態(tài) 變 遷 執(zhí) 行 狀 態(tài) 終 止顯 示讀驗 證 信 息 處 理第 一 級第 二 級第 三 級數(shù) 據(jù) 流s t a。 C1 : goto BHelp C2 : goto B預訂 … End 116 計算機學院 /軟件學院 存在的問題 ? Goto語句的使用 ? 分支語句結(jié)構(gòu)確切反映了狀態(tài)轉(zhuǎn)換圖 的結(jié)構(gòu) – 軟件設計脆弱 任何簡單的改變 (增加狀態(tài)、改變狀態(tài)變遷等)必須 改變系統(tǒng)的整個結(jié)構(gòu) ? 無法復用 117 計算機學院 /軟件學院 4) 結(jié)構(gòu)化解決方案 ? 由低級的、基于 goto的結(jié) 構(gòu)進化成由頂向下的、層 次組織的結(jié)構(gòu) —— 結(jié)構(gòu) 化方法 ? OO方法一定是結(jié)構(gòu)化方 法 118 計算機學院 /軟件學院 任務狀態(tài)圖 幫 助初 始化幫 助認 可預 訂查 詢航 班查 詢座 位幫 助幫 助 幫 助1111112311幫 助113211322323119 計算機學院 /軟件學院 狀態(tài)變遷功能 ? 狀態(tài)變遷僅僅是系統(tǒng)的性質(zhì),不應控 制所有事情 – 將狀態(tài)變遷從算法中剝離出來 – 狀態(tài)變遷依賴于具體應用 ? 狀態(tài)變遷圖的定義 二元組 – 狀態(tài) – 用戶選擇 ? 軟件級實現(xiàn) 兩種方法 – 由一個子程序(函數(shù))實現(xiàn) – 數(shù)組一類的數(shù)據(jù)結(jié)構(gòu) 120 計算機學院 /軟件學院 狀態(tài)變遷表 選擇→↓狀態(tài)1 (初始化) 1 0 5 22 (航班) 0 1 33 (座位) 0 2 44 (訂票) 0 3 55 (認證) 0 4 16 (幫助) r e t u r n 7 (終止) 0 0 1 32注意: ⑴ 狀態(tài) return返回調(diào)用狀態(tài) ⑵ 狀態(tài) 1為終止狀態(tài) 121 計算機學院 /軟件學院 程序結(jié)構(gòu) 執(zhí) 行 會 話初 始 化 狀 態(tài) 變 遷 執(zhí) 行 狀 態(tài) 終 止顯 示讀驗 證 信 息 處 理航 航 航航 航 航航 航 航航 航 航 航航 航 航 航122 計算機學院 /軟件學院 程序結(jié)構(gòu)描述 ? 選擇系統(tǒng)的 Top(主程序) – ―執(zhí)行會話?模塊 – 描述怎樣執(zhí)行一個完整的交互會話 ? 直接下級 與狀態(tài)有關的操作 – 定義初始、終止狀態(tài) – 狀態(tài)變遷結(jié)構(gòu) – 描述每個狀態(tài)上可執(zhí)行操作的?執(zhí)行狀態(tài)? ? 最低級 構(gòu)成?執(zhí)行狀態(tài)?的操作 – 顯示屏幕等 ? 完整的軟件結(jié)構(gòu)?鏡像?了應用結(jié)構(gòu) – 涉及狀態(tài)、基本操作等 123 計算機學院 /軟件學院 “Execute_Session” ? 盡可能與實際應用無關 ? 執(zhí)行一個完全的交互系統(tǒng)會話 local state, choice : INTEGER do state := initial repeat execute_state( state, →next ) —— 修改下一個狀態(tài)的值 state := transition(state, next) until is_final(state) end end 124 計算機學院 /軟件學院 “Execute_Session”描述 ? 一個典型的狀態(tài)變遷圖算法 – 每個階段,都處于一個狀態(tài) – 狀態(tài)由? initial‖開始,以? is_final‖結(jié)束 – 對非結(jié)束狀態(tài),執(zhí)行? execute_state‖ ? ―execute_state‖技術不適合于 OOD – 改變本身變量的值 state ? 不顯示與任何特殊應有關的信息 – 必須在第二級填寫應用相關的信息 – 變遷函數(shù)、初始化狀態(tài)、終止檢查 125 計算機學院 /軟件學院 “Execute_State”描述 ? 精練? execute_state‖ ? 執(zhí)行與狀態(tài) s相關的 操作 ? 返回用戶選擇的下 一個狀態(tài) c 126 計算機學院 /軟件學院 “Execute_State” execute_state(in s:Integer, out c:integer) local a : Answer?!? P u b l i c S u b M y S o r t ( B y R e f p ( ) a s I n t e g e r , B y R e f q ( ) a s I n t e g e r ) F o r i = 1 t o 1 0 0 i f p ( i ) = 0 T h e n E x i t s u b N e x t i F o r i = 1 t o 1 0 0 q ( i ) = i N e x t i E n d S u bA、 B、 C各自負責哪類工作?編碼正確? 106 計算機學院 /軟件學院 各自的職責 ① A在項目中負責需求分析工作,提出 《 需求說明書 》 ② B在項目中負責規(guī)格說明工作,給出 《 規(guī)格說明書 》 ③ C在項目中負責編碼工作,或許還包括設計工作 107 計算機學院 /軟件學院 各自的工作階段 ① A的工作屬于需求階段 ② B的工作屬于規(guī)格說明階段 ③ C的工作屬于設計實現(xiàn)階段 108 計算機學院 /軟件學院 各自的失誤 ① A的 描述不完整 :沒有指出客戶需求是一個可執(zhí)行程序、一個 DLL或一個靜態(tài)函數(shù);沒有說明輸入輸出方式 ② B給出了錯誤的規(guī)格說明書 :技術上不嚴謹,導致開發(fā)過程遠離目標 ③ C過于迷信和盲從 :完全未考慮程序代碼的意義和用途 109 計算機學院 /軟件學院 小結(jié) 完善、嚴謹?shù)囊?guī)格說明是開發(fā)出合格軟件的必要條件。項 目 經(jīng) 理 B : 輸 入 P [ 1 0 0 ] , 滿 足 P [ i ] 均 為 正 整 數(shù) , 要 求 輸 出 Q [ 1 0 0 ] ,滿 足 Q [ i ] = Q [ j ] , i j 。}去掉內(nèi)層循環(huán)和條件判斷 95 計算機學院 /軟件學院 小結(jié) ① 改進算法可以顯著提高速度 重點在反復調(diào)用的代碼上 ② 使用更快的存儲介質(zhì) ③ 硬盤和內(nèi)存數(shù)據(jù)交換會極大影響速度 特別是出現(xiàn)異常時 ④ 編譯優(yōu)化不保證提高速度 96 計算機學院 /軟件學院 四、多線程 在程序中使用多線程是一種好的思路,但必須考慮相關代價。 s u m = s u m + i t e m _ x / f a c t o r 。 f o r i = 1 t o M A X N U M d o { t e m p _ x = t e m p _ x * x * x f a c t o r = f a c t o r * ( 2 * i ) * ( 2 * i – 1 ) 。 t e m p _ x = 1 。 i n t i , j 。 i f ( i m o d 2 ) = 0 t h e n s u m = s u m + i t e m / f a c t o r e l s e s u m = s u m – i t e m / f a c t o r } r e t u r n s u m 。 f a c t o r = 1 。 f o r i = 1 t o M A X N U M d o { i t e m = 1 。 i n t i , j 。}① 輸入?yún)?shù)無效 ② 沒有分配空間 ③ 可能大于最大長度 ④ 分配可能失敗 88 計算機學院 /軟件學院 解決方案 ① 必須對輸入?yún)?shù)進行有效性檢查 ② 必須保證 my_name足夠長 避免字符串結(jié)束符? \0‖丟失 ③ name長度大于 MAX_LEN時必須處理 避免空指針濫用 ④ my_name分配失敗必須處理 各個分支 89 計算機學院 /軟件學院 附帶問題 構(gòu)造函數(shù)內(nèi)內(nèi)存分配失敗 ① 如何將失敗信息通告使用者 對OO編程,構(gòu)造函數(shù)無返回值 ② 解決方案 在構(gòu)造函數(shù)中不進行內(nèi)存分配 —— 初始化函數(shù)負責 90 計算機學院 /軟件學院 小結(jié) ① 非法內(nèi)存訪問是最常出現(xiàn)的錯誤之一 ② C、 C++類特別易發(fā)生 ③ 避免的方法 好的編程規(guī)范、語言和工具的選擇、有效測試等 91 計算機學院 /軟件學院 三、 運行速度 只在非常有限的幾種情況下,才會首先考慮程序的執(zhí)行速度。 } c h a r * G e t N a m e ( ) { r e t u r n m y _ n a m e 。