軟體開發的基本知識
韓慧健
一、軟體的概念
1、軟體:是電腦系統中與硬體相互依存的部分,它包括程式、資料及相關文檔的完整集合。其中
Ø 程式-是按照事先設計的功能和效能的要求執行的指令序列
Ø 資料-是使程式正常操縱資訊的資料結構
Ø 文檔-是程式開發、維護和使用有關的圖文資料
2、軟體分類(按功能劃分)
Ø 系統軟體:如作業系統、資料庫管理系統、裝置驅動程式等
Ø 支撐軟體:協助使用者開發軟體的工具性軟體,如微軟可視化開發平台工具
Ø 應用軟體:為特定目的服務的軟體,如財務管理軟體。
二、軟體工程和軟體開發
1、 軟體工程
Ø 一系列完善的工程化原則。
軟體工程是為經濟地獲得能夠在實際機器上有效啟動並執行可靠軟體而建立和使用的一系列完善的工程化原則。
Ø 軟體工程是開發、運行、維護和修複軟體的系統方法。
1983年,IEEE(電氣和電子工程師學會)作出定義,軟體工程是開發、運行、維護和修複軟體的系統方法。軟體定義程式為:電腦程式、方法、規則、相關的文檔資料以及在電腦上運行時所必須的資料。
Ø 主要思想是強調軟體開發過程需要英語工程化的原則。
2、 軟體的生存周期
按照軟體工程的過程(plan, do,check, action)即軟體規格說明、軟體開發、軟體確認,軟體演化,進一步展開,軟體的生存周期包括6個階段
(1) 制定計劃
(2) 需求分析
(3) 軟體設計
(4) 程式編寫
(5) 軟體測試
(6) 運行和維護
3、 軟體開發
開發階段有三個相互關聯的步驟組成,即設計、實現(編碼)、測試。
三、各個階段的目標和主要工作
制定計劃
管理層面的內容。
Ø 制定待開發軟體系統的總目標,給出它的功能、效能、可靠性以及介面等方面的要求;
Ø 研究完成該項軟體任務的可行性,探討解決問題的可能方案;
Ø 制定開發實施計劃,可行性研究報告。
需求分析
對待開發軟體提出的需求進行分析並給詳細定義出
需求分析的目標:
Ø 是深入描述軟體的功能和效能,確定軟體設計的約束、軟體同其它系統元素的介面細節,
Ø 分析階段只確定軟體系統要“做什麼”,
Ø “怎麼做’有後續的設計階段完成。對演算法的詳細描述也是在設計階段給出。
Ø 定義軟體的其它有效性需求。
需求分析的任務:
Ø 通過與使用者的合作,瞭解使用者對待開發系統的要求;
Ø 根據使用者的要求的系統所在的資訊域的調查、分析,確定系統的邏輯模型;
Ø 對求解的問題做適當的分解,使之適合於電腦求解。
需求分析工作的內容:
資料建模:
包括3種相互關聯的資訊,即資料對象、描述對象的屬性、描述對象間相互連結的關係。用資料流圖描述系統資料流的變換和流向,用資料詞典定義資料流圖中出現的資料流、資料檔案、加工和處理,用判定表表示複雜條件和動作組合情況。
功能建模和資料流:
目標系統被表示成“輸入資訊-》目標系統-》輸出資訊”,系統的功能體現在核心資料變換中。功能建模的思想就是用抽象模型的概念,按照軟體內部資料傳遞、變換的關係,自頂向下逐層分解,直到找到滿足功能要求的所有可實現的軟體為止。功能建模表達資料的運動情況和資料流的變換。
行為建模:給出需求分析方法的所有操作原則。描述系統或對象的狀態、導致狀態改變的事件,從而描述系統的行為。
軟體設計•需求轉換成體繫結構,對每個模組具體描述。
Ø 需求轉換成體繫結構,對每個模組具體描述。
軟體設計是一個把軟體需求變換為軟體表示的過程。把已確定的各項需求轉換成相應的體繫結構,進而對每個模組需完成的工作進行具體描述。最初這個表示只是描述出可直接反映功能、資料、行為需求的軟體的總架構,然後進一步細化,在此架構中填入細節,把它加工成程式細節上非常接近與來源程式的軟體表示。
Ø 軟體設計是解決“怎麼做“的問題。
軟體分析階段已經完全弄清楚了軟體的各種需求,軟體設計是解決“怎麼做“的問題。
Ø 軟體設計的內容
根據分析模型中用資料、功能、行為模型所表示的需求,採用相應設計方法進行概要設計(資料設計、體繫結構設計、介面設計)和詳細設計(過程設計)。
n 概要設計:
將軟體需求轉化為資料結構和軟體的系統結構,並建立介面,建立整個系統的體繫結構架構,並給出了系統中的全域資料結構和資料庫介面、人-機介面,與其它的硬體、軟體的介面。
此外還從系統全域的角度,考慮處理方式、運行方式、容錯方式以及系統維護等方面的問題,奠定整個系統實現的基礎,沒有概要設計直接考慮程式設計,就不能從全域把握軟體系統的結構和品質,容易造成程式結構劃分不合理,導致系統處於一種不穩定的狀態。這個階段應著重解決實現需求的程式模組劃分問題。(資料設計、體繫結構設計、介面設計)
資料設計:
把需求中的對象和關係,以及資料詞典中描述的詳細資料內容轉化為資料結構的定義。
資料設計的過程:
1、為在需求分析階段所確定的資料對象選擇邏輯表示,需要對不同的結構進行演算法分析,以便選擇一個最有效設計方案。
2、確定對邏輯資料結構所必須的操作模組,以便限制或確定各個資料設計決策的影響範圍。
資料設計的原則:
1、考慮幾種不同的資料方案,考慮給後期設計帶來的影響
2、確定所有的資料結構和每種資料結構上施加的操作
3、應當建立一個資料詞典。即表示資料項目和控制項的特性,明確定義各種資訊項。
比如
存摺=戶名+所號+帳號+開戶日+性質
戶名=2{字母}24 //至少出現2個字母,最多出現24個
所號=’’001”..”999”//儲蓄所編碼規定為3位元
開戶日=年+月+日
性質=’1’..”6”//1表示普通使用者,5表示工資使用者等等
4、 逐步細化方法應用於資料設計
底層資料的設計延遲到設計過程的後期,將逐步細化方法應用於資料設計,即需求分析階段確定總體資料群組織,概要設計階段加以細化,詳細設計階段才規定具體細節。
5、程式設計語言應當支援資料類型的定義和實現。
清晰的資訊定義是軟體開發成功的關鍵。
附 資料設計相關內容講解
在電腦發展的初期,電腦主要用於數值計算,處理的是數值資料,而且資料量小,結構簡單,形式統一。隨著電腦技術的發展,電腦應用領域的擴大,越來越多的非數值資料需要處理,資料的概念也被大大推廣,數字、字元、映像、聲音都可屬於資料的範疇。與數值資料相比,非數值資料的結構比較複雜,其電腦表示也比較麻煩。
只有對資料內部的結構關係以及資料在電腦內如何儲存和操作進行深入的研究,才能設計出高效可靠的程式,實現對資料的有效處理。
1、 數學模型
用電腦解決一個實際問題,首先必須從具體問題抽象出一個適當的數學模型,用這個數學模型應能得出該問題的精確或近似解。然後確定數學模型的計算方法,根據問題的具體要求,可在已知的各種演算法中選擇一種合適的演算法或另設計一種新的演算法。接下來就是用某種程式設計語言為確定的演算法編製電腦程式,同時準備好作為程式處理對象的各種資料。再接下來就開始程式的調試運行,用一些典型的資料和描述邊界條件的資料對程式進行測試,以便發現和糾正程式中的錯誤,錯誤的糾正可能導致前面步驟的多次反覆。最後,在程式調試達到所要求的品質標準之後,就可正式投入運行,最終在電腦上得出問題的解。
建立實際問題的數學模型是電腦應用必須首先進行的工作,也是一項很重要的工作。
常見的數學模型可分為數值計算和非數值計算兩大類。許多實際問題數學抽象的結果是數學方程。這些數學方程可以用解析的方法求出精確解,或者用類比的方法求出近似解。但是更多的實際問題無法用數學方程來描述,這些問題所求的不是某個數值,而是某種檢索的結果,某種排列的狀態,某種轉換後的形式,某種設計的表示……這些問題的數學模型不是用數學方程,而是用一種資料結構來描述資料以及資料之間的相互關係。
2、資料結構的概念
資料是對客觀事物的名稱、數量、特徵、性質的描述形式(即編碼),是電腦所能處理的一切符號的總稱。資料既是電腦加工的對象,又是電腦的產品(計算結果)。例如,一個利用數值分析方法解代數方程的程式,其處理對象是整數和實數;一個編譯器或者文文書處理程式的處理對象是字串。因此,對電腦科學來講,資料的含義很廣泛,比形、圖象、色彩和聲音等都可以通過編碼而歸於資料的範疇。
一般,我們對那些單個的孤立的資料並不感興趣,而著重研究由眾多資料元素組成的資料集合,研究集合中資料元素之間存在怎樣的內在聯絡,通常需要對資料和資料集合進行哪些運算(即對資料進行的處理),如何提高運算效率等等,這就引出了資料結構。
資料結構裡包括一批資料,是資料的一個集合。這個集合中的每一個資料個體稱為資料元素,它是資料的基本單位。一個資料元素又叫做一個資料結點,簡稱結點。
資料類型是指程式設計語言中所允許的變數的種類,也就是變數可以取的值和可以進行的運算的集合。可以把資料類型看成是在程式設計語言中已經實現了的資料結構。
一個資料元素可以是簡單的,只有一個資料項目,例如一個數,一個字元,一個名字等;也可以是複雜的,由若干資料項目組成,一個資料結點由用來描述一個獨立事物的名稱、數量、特徵、性質的一組相關資訊組成。例如,在設計處理學產生績問題的程式時,每個學生有關的資料項目(域)構成一個資料結點,可能包括學生的姓名、學號、各科考試成績等等,學號可以作為結點的關鍵字。在處理庫存商品問題時,一個資料結點對應一種商品的相關資料項目,包括商品編號和名稱、規格、數量、生產廠家、單價、入庫日期等,商品編號可以作為關鍵字。
資料結構是帶有結構特性的資料元素的集合,它研究的是資料的邏輯結構和資料的儲存結構以及它們之間的相互關係,並對這種結構定義相適應的運算,設計出相應的演算法。
體繫結構設計:
――定義軟體系統中各主要成分之間的關係。
事實上,軟體總是有體繫結構的,不存在沒有體繫結構的軟體。體繫結構(Architecture)一詞在英文裡就是"建築"的意思。把軟體比作一座樓房,從整體上講,是因為它有基礎、主體和裝飾,即作業系統之上的基礎設施軟體、實現計算邏輯的主體應用程式、方便使用的使用者介面程式。從細節上來看每一個程式也是有結構的。
Ø 結構化程式就是以語句組成模組,模組的聚集和嵌套形成層層調用的程式結構,也就是體繫結構。
Ø 主要有三要素:程式構件(模組)的階層、構件之間的互動方式,及資料的結構。
雖然軟體體繫結構已經在軟體工程領域中有著廣泛的應用,但迄今為止還沒有一個被大家所公認的定義。許多專家學者從不同角度和不同側面對軟體體繫結構進行了刻畫,
Ø 軟體設計的一個目標就是建立軟體的體繫結構表示。
體繫結構經曆了一個由低級到進階的發展過程,有資料流系統、調用-返回系統、獨立構建系統、虛擬機器等等。我們用C語言編製的軟體結構採用一種調用-返回式的。
Ø 解決了模組劃分問題
軟體體繫結構不僅指定了系統的組織圖和拓撲結構,並且顯示了系統需求和構成系統的元素之間的對應關係,提供了一些設計決策的基本原理
介面設計:
――根據資料流圖定義軟體內部各成分之間、軟體與其它協同系統之間以及軟體與使用者之間的互動機制。
n 詳細設計:
即過程設計(也叫程式設計),通過對結構表示進行細化,得到軟體的詳細資料結構和演算法。要決定概要設計階段每個模組的具體演算法。
程式設計(過程設計):
Ø 把結構成分轉化為軟體的過程性描述,滿足在編碼階段能夠根據過程性描述產生來源程式代碼。
Ø 程式設計的任務:需要對程式採用的演算法的邏輯關係進行分析,設計出全部必要的過程細節,並給予清晰的表達,使之成為編碼的依據。
Ø 程式設計不同於編碼或編程。設計不是編碼,編碼也不是設計。
Ø 任何設計模型的抽象層級都比原始碼要高,在編碼階段做的唯一設計決策就是描述如何將過程設計轉換為程式碼的小的實現細節。相當於將一段漢語精確譯成英語的過程。
Ø 程式設計要決定軟體各個模組的實現演算法,並精確地表達這些演算法。
各個模組的演算法涉及到軟體的功能和演算法的設計,精確表達這些演算法涉及到演算法的描述和表達工具。
四、結構化程式設計
為了有效地進行程式設計,不僅要掌握一門程式設計語言,還應該學會針對各類問題擬定出有效解題方法和步驟——即演算法設計。有了正確的演算法,才能夠編製程式。演算法的好壞,決定了程式的優劣,因此,程式設計的核心任務之一就是設計演算法。
(一) 什麼是演算法?
1算 法-程式的靈魂
Ø 廣義地講--演算法是為完成一項任務所應當遵照的一步一步的規則的、精確的、無歧義的描述,它的總步數是有限的。
Ø 狹義地講-- 演算法是解決一個問題採取的方法和步驟的描述。
簡單地說,演算法就是解決問題的辦法,是對特定問題求解步驟的詳細描述。所謂電腦能執行是指一個演算法能不斷地被細化,最終能用電腦所能識別的命令來表達,進而被執行。所以,從電腦應用的角度來說,演算法是用於求解某個特定問題的一些指令的集合。具體地說,我們用電腦所能實現的操作或指令,來描述問題的求解過程,(編碼)我們就得到了這一特定問題的電腦演算法。
Ø 演算法解決的是“做什麼”和“怎麼做”的問題
Ø 演算法是靈魂,資料結構是加工對象 ,語言是工具
Ø 電腦演算法設計:設計出電腦解決具體問題的詳細步驟,並且將全部的解題過程用某種電腦工具完整地描述出來。
隨著應用問題求解的目標不同以及解決具體應用問題的基本思路的不同,演算法設計的思路也不同,即演算法設計的基本方法不同。
Ø 演算法的分類:數值演算法和非數值演算法
數值演算法解決的是數值計算問題,包括方程和方程組的求解,微分積分的計算等;
非數值演算法解決的是電腦或日常生活中的資訊調度和管理問題,包括資訊的組織與管理、資訊優選等。
Ø 程式=演算法+資料結構
我們利用電腦解決各種問題,演算法是至關重要的。沒有演算法或沒有電腦演算法,我們對要解決的問題就無從下手。
電腦解決問題不但要依賴於演算法,而且會涉及到大批資料。資料的組織和儲存會直接影響演算法的實現方式和效率。
人們在處理複雜問題時,總要利用抽象這個思維工具。抽象是抓住問題的實質,而忽略問題的次要部分;注意事物的普遍規律,或共性的東西。
演算法和資料結構是人們用電腦解題時所作的兩種抽象:演算法是從電腦的操作角度對解題過程的抽象;資料結構是從如何組織處理操作對象的角度進行的抽象。這兩種抽象互相依賴、互相補充,最大限度地減低問題的複雜性。
在這兩個方面的基礎上,人們開發出運行效率較高的各種應用程式。因此,在—定意義上,人們認為:程式=演算法+資料結構
Ø 程式設計=演算法+資料結構+程式設計方法+程式設計開發工具
除了演算法和資料結構之外,程式設計方法對程式設計也是重要的,它影響到程式設計的成敗及程式設計品質。隨著電腦解決的問題越來越複雜,電腦本身的運算速度越來越快,記憶體容量也越來越大,程式設計已決不是程式員個人技巧的“手工藝品”。程式設計要遵循一定的開發方法及思想,如結構化設計方法,模組化程式設計方法、自頂向下的逐步細化的方法、物件導向的程式設計方法等,要按照工程管理的方法去進行軟體開發,即用軟體工程的思想及方法去進行軟體開發。所以可以進一步說:程式設計=演算法+資料結構+程式設計方法+程式設計開發工具
(二)為什麼程式需要控制?
Ø 有非常明確的預期,順序的擬訂步驟
生活中我們如果對整個事情的處理過程有非常明確的預期沒有任何意外發生的話,就不需要任何判斷,我們可以分為幾個順序的擬訂步驟依次完成而達到目標。
Ø 如果沒有確定的目標,需要給出判斷條件來控制電腦去執行確定的任務,這就是為什麼電腦有分枝的理由。
如果沒有確定的目標,我們可能就發生的情況作出下一步行動的判斷,如乘公用汽車到火車站,不知道公用汽車在哪裡,到一個路口沒找到,會到另一個路口找。
作為電腦在處理複雜而變化的問題時,由於它不能自己判斷隨即發生的情況而修改自己的行為,它只是按照人事先作出嚴謹的設計,給出判斷條件來控制電腦去執行確定的任務,這就是為什麼電腦有分枝的理由。分支就是就需要編程者事先估計到各種可能性的發生,讓程式接下來有什麼樣的走向和選擇,要求程式員要料事如神而不是程式料事如神,所以程式設計人員需要嚴謹的素質。
Ø 電腦擅長的是邏輯推理和計算,我們很多問題需要反反覆複的重複工作才能解決,枯燥而浪費時間,電腦卻能以極高的速度把人們從繁重的腦力勞動中解放出來。
無論是選擇運行還是重複運行,都需要設計程式者實現對程式步驟進行判斷控制,
在結構化設計方法之前,這種控制流程的轉向是任意性的,用傳統流程圖表示(p23,圖 2.13)這種演算法稱為BS型演算法
在程式語言中是用GOTO語句實現控制路徑,
轉向的任意性使得GOTO語句泛濫使用,程式路徑複雜而混亂,難以理解演算法的邏輯。
為了從程式的控制結構入手消除不適應的容易混亂的GOTO語句。
1965年E.W.Dijkstra在一次會議上提出應該把GOTO語句從進階語言中去掉,
1966年,Bohra和jacopini證明了任何單入口單出口沒有死迴圈的程式都可以由三種基本的控制結構構造出來。這三種基本結構就是(1)順序就構(2)選擇結構(包括單選擇if…else型和多選擇case型) (3)重複結構(包括當型while ..do型和直到型do..while型),使用這三種控制結構的程式叫結構化程式。
(三)、演算法的描述
圖形工具、表格工具、語言工具等3類
Ø 圖形工具包括:程式流程圖、NS圖、PAD圖、HIPO圖(Hierarchy plus input process output)等
Ø 表格工具:判定表
Ø 語言工具:PDL(program design language)偽碼、自然語言
1、程式流程圖
程式流程圖描述程式中,控制流程的情況,即程式中處理(指令)的執行順序和執行序列所依賴的條件,有向線段(流線)表示的是控制流程,從一個處理走到另一個處理。
程式流程圖比較適合於組合語言的編程。
流程圖描述非結構化程式(傳統程式流程圖)
流程圖獨立於程式設計語言,直觀、清晰、易於學習,但也有一些缺點,表示程式控制流程程的箭頭可以不受約束隨意轉移控制。
流程圖中的符號(見投影片)
流程圖描述結構化程式(結構化程式流程圖)
為使流程圖描述結構化程式,只使用以下五種控制結構。見投影片,舉例從10個數中選出最大的數見投影片
2、N-S圖(盒圖)
美國學者Nassi和Shneiderman提出,結構見投影片圖,舉例從10個數中選擇最大的數,見投影片。
3、 代碼錶示法
虛擬碼是介於自然語言和電腦語言之間的文字和符號來表示演算法。如同一篇文章,自上而下地寫下來,每一行或幾行表示一個基本操作。用虛擬碼
不用圖形符號,一般電腦語言中具有語句關鍵詞可用英文表示,其它可用漢語或英語表示,總之便於書寫和閱讀為原則,用虛擬碼寫演算法一般沒有固定的嚴格的文法要求,只要意思表達清楚,這是目前常用的方式,特別是學會c語言後,可以適當按照c語言的文法規則先概略描述,然後逐步細化描述,時間長了,能夠訓練自己達到“Thinking in C”的思維能力。
4、電腦語言表示演算法
即程式編寫(編碼),已經不是“設計”的範圍,而是實現的階段,要嚴格遵循使用的電腦語言的文法規則,如用C語言編寫程式要遵循C語言的文法規則,這些規則正是本課程的學習內容。
演算法的描述方法綜述(見投影片)
(四)、結構化程式設計
1、結構化程式設計主要包括兩方面:
(1) 在編寫程式時,強調使用幾種基本控制結構,通過組合嵌套,形成程式的控制結構。儘可能避免使用GOTO語句。
(2) 在程式設計過程中,盡量採用自頂向下和逐步細化的原則,由粗到細,一步步展開。
表現在詳細設計和編碼階段,應當採取自頂向下、逐步求精的方法,把一個模組的功能逐步分解,細化為一系列具體的步驟,進而翻譯成一系列用程式語言寫成的程式。
對“自頂向下和逐步細化的原則,由粗到細,一步步展開”的理解
對於程式的描述而言(無論是前面給出的日常生活執行個體中的非形式的“程式”,還是希
望電腦去執行的程式),還有幾個重要的問題值得提出:
可以寫在程式裡的基本“指令”包括哪些?洗臉、查書目等是前面日常生活中的“程式”
裡的基本動作。在編寫需要電腦去執行的程式時,其中的基本動作應該是電腦能完成的
事項。例如,要寫前面那樣的二進位代碼形式的程式,就需要按照具體電腦指令系統的規
定寫出一條條指令。用一種進階語言寫程式時,同樣必須基於這種語言所支援的準系統(基
本命令等等)。學慣用進階語言寫程式,一個最基本的方面就是瞭解語言所提供的準系統,
瞭解它們的描述形式和所完成的操作效果。
對於描述程式的語言有什麼要求?描述前面有關日常生活的“程式”時採用的是漢語,
是我們日常用於人際交流的“自然語言”。自然語言詞彙豐富,有極強的表達能力。但在許
多地方要依賴於接受者的知識和常識。如果,要求孔子按照前面給出的程式到圖書館去借書,他不可能理解其中的動作,也無法執行它去把書借來。自然語言的描述常常很不精確,許多
疏漏需要靠接受者用自己的知識去填補。這種情況可以大大提高資訊的傳遞效率,但也帶來
誤解的可能性。送給電腦使用的程式必須採用電腦能處理的記法形式,其描述工具(語
言)必須是精確的,無歧義的。程式設計語言都必須滿足這些要求。
一個程式可能在不同的層次上描述。看看有關刷牙的例子。前面只用一個詞描述這一動作。但如果仔細想想,刷牙也是一個很複雜的過程。例如,我們還可以進一步將其分解描述為取杯子、裝水、取牙刷、擠牙膏、漱口、刷牙、清洗牙齒等一系列細節動作。還可以進一步將這一層面上的每個動作分解為一系列的肌肉伸縮動作。
應當將程式的細節分解到哪個層次,一方面要看程式語言所提供的準系統。此外,程式的描述方式也要照顧到人的需要。複雜的程式可能需要成千上萬,甚至成百萬或千萬行進階語言代碼。簡單地在進階語言基本層面上描述程式同樣會顯得層次太低,使程式的意義難以把握,難以保證它能實現所預想功能,難以修改程式去滿足新的需要,如此等等。因此,在開發複雜的程式時,我們需要提供更高的描述層次,將程式的功能在各個層次上分解描述。就像我們看到極長的一系列有關肌肉伸縮動作的描述,很難理解這裡所做的是刷牙一樣。隨著程式變得越來越複雜,其組織圖問題也變得更加重要了。
還是用一個生活中的例子來說明問題。對於學生早上起床後的活動,首先應該在很高的
層次上描述,就像前面所給出的:
1,起床;
2,刷牙;
3,洗臉;
4,吃飯;
5,早自習;
這樣就把一個複雜的程式分解成為若干相對簡單一些的部分了。如果需要進一步細節化,那麼我們就降到下一個細節層次,將一個高層動作分解為一系列低層的基本動作。例如,可能將“吃早飯”這一高層動作分解為下面動作序列:
早起活動
起床
吃早飯
洗臉
刷牙
早讀
拿飯碗;
去食堂;
排隊買飯;
吃飯;
刷碗;
離開食堂;
必要時再做進一步分解。例如,將“排隊買飯”分解為“排隊、選飯、選菜、付款”等。在這種分解描述的過程中,我們還應該保留前面構造出的抽象描述的層次。這種階層不但有利於人們理解程式的細節過程,也有利於發現程式中的錯誤,還能使所得程式易於根據需要去修改。例如,學校的食堂改為快餐份飯,由於整個程式被按照分解為一些具有邏輯獨立性的部分,修改起來也就更容易了。
編程式時所需要掌握的恰恰就是這種工作方式。我們需要從問題的要求出發,從高層開
始設計程式,並逐步分解程式功能。當將程式所需功能分解到一定的細節程度之後,就可以
藉助於程式語言的結構,描述程式工作中的細節步驟了。本書將不斷討論這方面的問題。在
學習程式設計的過程中,也必須學習分析和構造程式的正確方法。
具體的電腦程式細化舉例見投影片
2、結構化程式設計的主要原則
n 使用語言中的順序、選擇、重複等有限的基本控制結構表示程式邏輯。
n 選用的控制結構只准許有一個入口和一個出口。
n 程式語句組成容易識別的塊,每塊只有一個入口和一個出口。
n 複雜結構應該用基本控制結構進行組合嵌套來實現。
n 語言中沒有的控制結構,可用一段等價的程式段類比,但要求該程式段在整個系統中應前後一致。
n 嚴格控制GOTO語句,僅在下列情形才可使用:
① 用一個非結構化的程式設計語言去實現一個結構化的構造。
② 若不使用GOTO語句就會使程式功能模糊。
③ 在某種可以改善而不是損害程式可讀性的情況下
五、軟體設計的原則
1抽象化
在進行模組設計的時候可以有不同的抽象層次
(1)過程抽象
從系統定義到實現,每進展一步都可以看作對軟體解決方案的抽象化過程的一次細化。在軟體需求分析階段,“問題所處環境為大家所熟悉的術語”來描述軟體解決方案,然後到概要設計、詳細設計,抽象層次逐步降低。
(2)資料抽象
與過程抽象一樣可以在不同層次上描述資料對象的細節。
(3)控制抽象
控制抽象可以包含一個程式控制機制而無需規定內部細節,如作業系統中,採用同步訊號的方式協調某些活動。
2、自頂向下,逐步細化
這是Niklaus Wirth提出的設計策略,將軟體體繫結構按自頂向下的方式,對各個層次的過程細節和資料細節逐層細化,直到用程式設計語言的語句能夠實現為止。
3、模組化
軟體系統的階層正是模組化的具體體現。就是說,整個軟體被劃分為若干單獨命名和可編址的部分,成為模組。
對於一個大問題總體複雜,把它分解成為一些獨立的小問題易於處理。但當模組數增加,模組間的聯絡就會加大。把模組串連起來的工作量就會加大,要尋找平衡。
4、控制層次(程式結構)
往往用程式的階層來表示,位於最上層是頂層模組是主模組,下面的是下屬模組,一層層分下去。
程式結構的深度:程式結構的層次數,反映了程式結構的規模和複雜程度
程式結構的寬度:同一層模組的最大模組個數
模組的扇入和扇出:扇出表示一個模組直接調用其它模組的數目,扇入是一個給定模組有模組來調用它,多扇入的模組一般設計成公用模組。
5、結構劃分
程式結構可以按照水平方向或垂直方向進行劃分。
水平方向劃分按照主要的程式功能來定義模組結構的各個分支。頂層模組(M)作為控制模組,控制協調下面的功能模組之間的通訊和運行,下級模組(A、B、C)簡單的功能劃分是建立:輸入-》處理(資料變換)-》輸出。
6、資料結構
資料結構是資料之間邏輯關係的一種表示,資料結構設計應確定資料的組織、存取方式、資訊的不同處理方法。資料結構的組織方式和複雜程度靈活多樣,但典型的資料結構種類是有限的,它們是構成那些更複雜結構的基本構件。
(1)標量:最簡單的一種資料結構,標量項就是單個的資料元素,入布爾量、整數、實數或字串。可以通過名字對它們進行儲存。
(2)順序向量(一維數組):若干個標量項組織成一個表或者串連成一個組,可以擴充為二維、三維、四維…..n維
(3)鏈表:是一種更靈活的資料結構,它把物理上不相鄰的標量項、向量、或空間結構用指標連結起來。
(4)組合資料結構:把上述的標量項、向量或n維空間可以構造結構體資料,也可以把各種資料結構用多重鏈表建立分層結構和網路結構。
7、軟體過程
Ø 就是模組內的詳細設計過程,
程式結構描述了程式的控制層次關係,和各個部分的介面情況,這裡著重描述各個模組的處理細節。
Ø 它也是層次化的。
8、資訊隱藏
如何分解一個軟體才能得到最佳的模組組合,?需要瞭解資訊隱藏。是指,每個模組的實現細節對於其它模組來說是隱藏的。所以有效模組化是通過獨立的模組來實現,就是模組之間資料上功能上沒有太大的聯絡,衡量獨立性的標準是模組間的耦合和內聚。