第6章 詳細設計程序員
詳細設計的目標:算法
得出對目標系統的精確描述,從而在編碼階段能夠把這個描述直接翻譯成用某種程序設計語言書寫的程序。數據結構
對目標系統的精確描述:工具
•詳細的算法佈局
•數據表示和數據結構post
•實施的功能和使用的數據之間的關係學習
詳細設計的任務:測試
• 邏輯上正確地實現每一個模塊的功能。編碼
• 設計出的處理過程應該儘量簡明易懂。(更重要)spa
面向過程的詳細設計是基於結構化的程序設計技術,結構化程序設計技術是面向過程的詳細設計的邏輯基礎。
結構化程序設計技術是實現上述任務的關鍵技術。
•E.W.Dijkstra在60年代中期提出結構程序設計的概念
•結構化程序設計技術:採用自頂向下逐步求精的設計方法和單入口單出口的控制結構,而且只包含順序、選擇和循環三種結構。
•C.Bohm和G.Jacopini在數學上證實了只用「順序」、「選擇」和「循環」這三種基本的控制結構能夠實現任何單入口和單出口的程序
6.1 3種基本的控制結構
• 經典的結構程序設計:只容許使用順序、IF-THEN-ELSE型分支和DO-WHILE型循環這3種基本控制結構;
• 擴展的結構程序設計:除了上述3種基本控制結構以外,還容許使用DO-CASE型多分支結構和DO-UNTIL型循環結構;
• 修正的結構程序設計:除上述結構之外,還容許使用LEAVE(或BREAK)結構。
結構程序設計是儘量少用GO TO語句的程序設計方法。僅在檢測出錯誤時才使用GO TO語句,並且老是使用前向GO TO語句。
圖6.2 其餘經常使用的控制結構
程序流程圖(程序框圖):描述過程設計的方法,也是用得最混亂的一種方法。
優勢:對控制流程的描繪很直觀,便於初學者掌握。
缺點:
(1) 不是逐步求精的好工具,它誘使程序員過早地考慮程序的控制流程,而不去考慮程序的全局結構。
(2) 用箭頭表明控制流,程序員不受任何約束,能夠徹底不顧結構程序設計的精神,隨意轉移控制。
(3) 不易表示數據結構。
使用對策:只用結構程序設計容許的五種圖示結構
一種不容許違背結構程序設計精神的圖形工具。又稱爲N-S圖。它有下述特色:
(1) 功能域(做用域)明確,能夠從盒圖上一眼就看出來。
(2) 不可能任意轉移控制。
(3) 很容易肯定局部和全程數據的做用域。
(4) 很容易表現嵌套關係,也能夠表示模塊的層次結構。
看圖6.4
盒圖沒有箭頭,所以不容許隨意轉移控制。
圖6.4 盒圖的基本符號
PAD是問題分析圖(problem analysis diagram) 。
它用二維樹形結構的圖來表示程序的控制流。
圖6.5給出PAD圖的基本符號。
圖6.5 PAD圖的基本符號
PAD圖的主要優勢以下:
(1) 使用PAD符號設計的程序必然是結構化程序。(2) PAD圖所描繪的程序結構十分清晰。
最左面的豎線是程序的主線,即第一層結構。
隨着程序層次的增長,PAD圖逐漸向右延伸。
每增長一個層次,圖形向右擴展一條豎線。圖中豎線的總條數就是程序的層次數。
(3) PAD圖表現的程序邏輯,易讀、易懂、易記。
程序從圖中最左豎線上端的結點開始執行,自上而下,從左向右順序執行,遍歷全部結點。
(4) 容易將PAD圖轉換成高級語言源程序,這種轉換可用軟件工具自動完成。
(5) 便可表示程序邏輯,也可描繪數據結構。
(6) 支持自頂向下、逐步求精方法的使用。
開始時能夠定義一個抽象的程序,隨着設計的深刻,使用def符號逐步增長細節,直至完成詳細設計,如圖6.6所示。
圖6.6 使用PAD圖提供的定義功能來逐步求精的例子
示例
適於表示複雜的條件組合與應作的動做之間的對應關係。
一張斷定表由如下四部分組成:
(1)左上部列出全部條件。
(2)左下部是全部可能的動做。
(3)右上部是表示各類條件組合的一個矩陣。
(4)右下部是和每種條件組合相對應的動做。
斷定表右半部的每一列實際上就是一個規則,規定了與特定的條件組合相對應的動做。
示例:
假設某大學要從學生中挑選男子籃球隊隊員,
基本條件是:
各門課程的平均分在70分以上,
身高超過1.80米,
體重超過75千克。
須要從學生登記表中挑選出符合上述條件的男同窗,並列出他們的姓名和住址,以便進一步選拔。
用斷定表表示上述條件和動做之間的關係。
以行李託運費的算法爲例:
假設某航空公司規定,乘客能夠免費託運重量不超過30kg的行李。
當行李重量超過30kg時,
對頭等艙的國內乘客超重部分每公斤收費4元,
對其餘艙的國內乘客超重部分每公斤收費6元,
對外國乘客超重部分每公斤收費比國內乘客多一倍,
對殘疾乘客超重部分每公斤收費比正常乘客少一半。
用斷定表能夠清楚地表示與上述每種條件組合相對應的計算行李費的算法。見書118頁表6.1 。
初次接觸斷定表的人理解它須要一個簡短的學習過程。
斷定樹是斷定表的變種,也能清晰地表示覆雜的條件組合與應作的動做之間的對應關係。
斷定樹的優勢:
形式簡單到不需任何說明,一眼就能夠看出其含義,易於掌握和使用。
圖6.7 用斷定樹表示計算行李費的算法
過程設計語言(PDL)也稱爲僞碼。
它是用正文形式表示數據和處理過程的設計工具。
PDL的優勢:
• 能夠做爲註釋直接插在源程序中間。
• 可使用普通的正文編輯程序或文字處理系統,方便地完成書寫和編輯工做。
• 已經有自動處理程序存在,能夠自動生成程序代碼。
PDL的缺點:
• 是不如圖形工具形象直觀,
• 描述複雜的條件組合與動做間的對應關係時,不如斷定表清晰簡單。
類程序設計語言(PDL)
LOOP:Set I to (START+FINISH)/2 If TABLE(I)=ITEM got FOUND If TABLE(I)<ITEM Set START to (I+1) If TABLE(I)>ITEM Set FINISH to (I-1) If(FINISH-START)>1 goto LOOP If TABLE(START)=ITEM got FOUND If TABLE(FINISH)=ITEM got FOUND Set FLAG to 0 Goto DONE FOUND:Set FLAG to 1 DONE:Exit
數據元素彼此間的邏輯關係只有順序、選擇和重複3類,所以,邏輯數據結構也只有這3類。
1. 順序結構
順序結構的數據:由一個或多個數據元素組成,每一個元素按肯定次序出現一次。
圖6.8
圖6.8 A由B、C、D 3個元素順序組成
2. 選擇結構
選擇結構的數據:包含兩個或多個數據元素,每次使用這個數據時按必定條件從這些數據元素中選擇一個。
圖6.9
圖6.9 根據條件A是B或C或D中的某一個
3. 重複結構
重複結構的數據:根據使用時的條件由一個數據元素出現零次或屢次構成。
圖6.10
圖6.10 A由B出現N次(N≥0)組成
上一小節介紹的Jackson圖的缺點是:
• 表示選擇或重複結構時,選擇條件或循環結束條件不能直接在圖上表示出來;
• 框間連線爲斜線,不易在行式打印機上輸出。
改進Jackson圖
見圖6.11
圖6.11 改進的Jackson圖
Jackson圖和描繪軟件結構的層次圖形式相似,可是含義卻很不相同:
• 層次圖中的一個方框一般表明一個模塊;
• Jackson圖的一個方框只表明幾個語句。
• 層次圖表現的是調用關係,一般一個模塊除了調用下級模塊外,還完成其餘操做;
•Jackson圖表現的是組成關係,一個方框中包括的操做僅僅由它下層框中的那些操做組成。
Jackson結構程序設計方法基本上由下述5個步驟組成。
(1) 分析並肯定輸入數據和輸出數據的邏輯結構,並用Jackson圖描繪這些數據結構。
(2) 找出輸入數據結構和輸出數據結構中有對應關係的數據單元。
(3) 用下述3條規則從描繪數據結構的Jackson圖導出描繪程序結構的Jackson圖。
① 爲每對有對應關係的數據單元,按照它們在數據結構圖中的層次在程序結構圖的相應層次畫一個處理框
② 根據輸入數據結構中剩餘的每一個數據單元所處的層次,在程序結構圖的相應層次分別爲它們畫上對應的處理框。
③ 根據輸出數據結構中剩餘的每一個數據單元所處的層次,在程序結構圖的相應層次分別爲它們畫上對應的處理框。
(4) 列出全部操做和條件(包括分支條件和循環結束條件),而且把它們分配到程序結構圖的適當位置。
(5) 用僞碼錶示程序。
Jackson方法中使用的僞碼和Jackson圖是徹底對應的,下面是和3種基本結構對應的僞碼。
順序結構
A seq
B
C
D
A end
選擇結構
A select cond1
B
A or cond2
C
A or cond3
D
A end
重複結構
A iter until(或while) cond
B
A end
下面結合一個具體例子進一步說明Jackson結構程序設計方法。
例:一個正文文件由若干個記錄組成,每一個記錄是一個字符串。要求統計每一個記錄中空格字符的個數,以及文件中空格字符的總個數。要求的輸出數據格式是,每複製一行輸入字符串以後,另起一行印出這個字符串中的空格數,最後印出文件中空格的總個數。
輸入和輸出數據的結構很容易肯定,用Jackson圖描繪的輸入輸出數據結構
導出描繪程序結構的Jackson圖
統計空格個數須要的所有操做和條件以下:
(1)中止 (2) 打開文件
(3) 關閉文件 (4) 印出字符串
(5) 印出空格數目 (6) 印出空格總數
(7) sum∶=sum+1 (8) totalsum∶=totalsum+sum
(9) 讀入字符串 (10) sum∶=0
(11) totalsum∶=0 (12) pointer∶=1
(13) pointer∶=pointer+1 I(1) 文件結束
I(2) 字符串結束 S(3) 字符是空格
通過簡單分析不難把這些操做和條件分配到程序結構圖的適當位置:
統計空格seq 打開文件 讀入字符串totalsum∶=0 程序體iter until文件結束 處理字符串seq 印字符串seq 印出字符串 印字符串end sum∶=0 pointer∶=1 分析字符串iter until字符串結束 分析字符select字符是空格 處理空格Seq sum∶=sum+1 pointer∶=pointer+1 處理空格end 分析字符or字符不是空格 處理非空格seq pointer∶=pointer+1 處理非空格end 分析字符end 分析字符串end 印空格數seq 印出空格數目 印空格數end totalsum∶=totalsum+sum 讀入字符串 處理字符串end 程序體end 印總數seq 印出空格總數 印總數end 關閉文件 中止 統計空格end
•定量度量的意義:把程序的複雜程度乘以適當常數便可估算出軟件中錯誤的數量以及軟件開發須要用的工做量,定量度量的結果能夠用來比較兩個不一樣的設計或兩個不一樣算法的優劣;程序的定量的複雜程度能夠做爲模塊規模的精確限度。
度量方法:
McCabe
Halstead
•程序的環形複雜度:McCabe方法根據程序控制流的複雜程度定量度量程序的複雜程度,這樣度量出的結果稱爲程序的環形複雜度。
•流圖:退化的程度流程圖,僅僅描繪程序的控制流程,徹底不表現對數據的具體操做以及分支或循環的具體條件。
•計算環形複雜度的方法
•環形複雜度的用途
•圓表示結點,表明一條或者多條語句。
程序流程圖中一個順序的處理框序列和一個菱形斷定框能夠映射成流圖中的一個結點。
•箭頭線稱爲邊,表明控制流。
一條邊必須終止於一個結點。
•區域,邊和結點圍成的面積。
計算區域數時應該包括圖外部未被圍起來的區域。
圖6.16 由PDL翻譯成的流圖
圖6.17 由包含複合條件的PDL映射成的流圖
2. 計算環形複雜度的方法
3種方法:
•V(G) = D
D,區域數
•V(G) = P + 1
P,斷定結點的數目
•V(G) = E – N + 2
E,邊的條數
N,結點數
3. 環形複雜度的用途
•預測測試難度
•預測軟件可靠性
•V(G)高的程序難於實現,容易出錯
•模塊規模參考V(G)≤10
人機界面設計是接口設計的一個重要的組成部分。其設計質量,直接影響用戶對軟件產品的評價,從而影響軟件產品的競爭力和壽命。
存在的4個問題:
系統響應時間;
用戶幫助設施;
出錯信息處理;
命令交互。
1. 系統響應時間
系統響應時間:指從用戶完成某個控制動做(例如,按回車鍵或點擊鼠標),到軟件給出預期的響應(輸出信息或作動做)之間的這段時間。
系統響應時間的兩個重要屬性:長度和易變性。
長度:
響應時間過長:用戶就會感到緊張和沮喪。
響應時間太短:加快用戶操做節奏,易犯錯誤。
易變性:指系統響應時間相對於平均響應時間的誤差。易變性低有助於用戶創建起穩定的工做節奏。
2. 用戶幫助設施
應提供聯機幫助設施,這使得用戶無須離開用戶界面就能解決本身的問題。
常見的幫助設施可分爲:
•集成的:設計在軟件裏面,它對用戶工做內容是敏感的,能夠縮短用戶得到幫助的時間,增長界面的友好性。
•附加的:在系統建成後再添加到軟件中的,其實是一種查詢能力有限的聯機用戶手冊。
集成的優於附加的。
3. 出錯信息處理
出錯信息或警告信息應具備的屬性:
(1) 用用戶能夠理解的術語描述問題;
(2) 提供有助於從錯誤中恢復的建設性意見;
(3) 指出錯誤可能致使哪些負面後果(例如,破壞數據文件);
(4) 伴隨聽覺或視覺給與提示。例如,在危險操做時發出警告鈴聲。
(5) 不能帶有指責色彩。
4. 命令交互
可提供二種操做方式:菜單,鍵盤。
是一個迭代的過程。
先建立設計模型,
再用原型實現這個設計模型,
由用戶試用和評估,
根據用戶意見進行修改。
1. 通常交互指南
• 在執行有較大破壞性的動做以前要求用戶確認。
• 容許取消絕大多數操做。應能方便地取消已完成的操做。
• 減小在兩次操做之間必須記憶的信息量。
• 提升對話、移動和思考的效率。應該儘可能減小用戶擊鍵的次數,設計屏幕布局時應該考慮儘可能減小鼠標移動的距離,儘可能避免出現用戶問「這是什麼意思?」的狀況。
• 提供對用戶工做內容敏感的幫助設施。
2. 信息顯示指南
• 只顯示與當前工做內容有關的信息。
• 用直觀的方式來表示數據。例如,用圖形或圖表來取代龐大的表格。
3. 數據輸入指南
• 保持信息顯示和數據輸入之間的一致性
• 使在當前動做語境中不適用的命令不起做用。這可以使得用戶不去作那些確定會致使錯誤的動做。
• 對全部輸入動做都提供幫助。
• 消除冗餘的輸入。不要求用戶指定輸入數據的單位;儘量提供默認值。