官术网_书友最值得收藏!

1.2 任務二:結構化程序設計

程序設計是軟件開發的核心,是指處理事情的先后次序。在計算機語言中,程序定義為完成特定任務的計算機指令的集合。程序設計的方法有多種,本書選用最容易理解的結構化設計方法。

任務描述

工欲善其事,必先利其器!開發軟件必須樹立正確的開發觀念和基本的程序開發技巧,為今后專業化開發打好基礎。

任務分析與設計

了解結構化程序設計的理念在軟件開發中的重要地位,掌握結構化程序設計的精髓和技巧,選擇最恰當的入門語言。

任務實現

1.結構化設計方法(Structured Design,SD)

從系統設計的角度出發,軟件設計方法可以分為三大類。第一類是根據系統的數據流進行設計,稱為面向數據流的設計或者過程驅動的設計,以結構化設計方法為代表。第二類是根據系統的數據結構進行設計,稱為面向數據結構的設計或者數據驅動的設計,以LCP(程序邏輯構造)方法、Jackson系統開發方法和數據結構化系統開發(DSSD)方法為代表。第三類是面向對象的設計。

結構化設計方法是在模塊化、自頂向下細化、結構化程序設計等程序設計技術的基礎上發展起來的。該方法實施的要點是:建立數據流的類型,指明流的邊界,將數據流圖映射到程序結構,用“因子化”方法定義控制的層次結構,用設計測量和一些啟發式規則對結構進行細化。

2.軟件設計的原則

1)抽象化

對軟件進行模塊設計時,可以有不同的抽象層次。在最高的抽象層次上,可以使用問題所處環境的語言描述問題的解法;而在較低的抽象層次上,則采用過程化的方法。

(1)過程的抽象:在軟件工程過程中,從系統定義到實現,每進展一步都可以看做是對軟件解決方案的抽象化過程的一次細化。在軟件計劃階段,軟件被當做整個計算機系統中的一個元素來看待。在軟件需求分析階段,用“問題所處環境的為大家所熟悉的術語”來描述軟件的解決方法。在從概要設計到詳細設計的過程中,抽象化的層次逐次降低。當產生源程序時,到達最低的抽象層次。

(2)數據抽象:數據抽象與過程抽象一樣,允許設計人員在不同層次上描述數據對象的細節。例如,可以定義一個數據對象student,并將它規定為一個抽象的數據類型,用它的構成元素來定義它的內部細節。

student的抽象:student { name;age;sex;}

此時,數據抽象student本身由另外一些數據“name(名字)、age(年齡)、sex(性別)”抽象構成。在定義student為一個抽象的數據類型之后,可以引用它來定義其他用數據對象,如“Rose,John”,而不必涉及student的內部細節。

使用student定義其他數據對象:student Rose,John。

(3)控制抽象:與過程抽象和數據抽象一樣,控制抽象可以包含一個程序控制機制而無須規定其內部細節。控制抽象的例子就是在操作系統中用以協調某些活動的同步信號。

2)自頂向下,逐步細化

將軟件的體系結構按自頂向下方式,對各個層次的過程細節和數據細節逐步細化,直到用程序設計語言的語句能夠實現為止,從而最后確立整個的體系結構。最初的說明只是概念性地描述了系統的功能或信息,但并未提供有關功能的內部實現機制或有關信息的內部結構的任何信息。設計人員對初始說明仔細推敲,進行功能細化或信息細化,給出實現的細節,劃分出若干成分。然后再對這些成分施行同樣的細化工作。隨著細化工作的逐步展開,設計人員就能得到越來越多的細節。

3)模塊化

模塊又稱構件,是能夠單獨命名并獨立地完成一定功能的程序語句的集合。例如,高級語言中的過程、函數、子程序等都可作為模塊。

模塊化是軟件的一個重要屬性。模塊化的特性提供了人們處理復雜問題的一種方法,同時也使得軟件能夠被有效地管理。

軟件系統的層次結構正是模塊化的具體體現。也就是說,整個軟件被劃分成若干單獨命名和可編址的部分,稱為模塊。這些模塊可以被組裝起來以滿足整個問題的需求。

模塊和其他用模塊之間的接口應盡可能獨立。

(1)系統設計通常分為結構設計和過程設計兩個階段。

① 結構設計:確定系統由哪些模塊組成,以及這些模塊之間的相互關系。結構設計是總體設計階段的任務。

② 過程設計:確定每個模塊的處理過程。過程設計是詳細設計階段的任務。

(2)設計的后處理:在確定系統的軟件結構以后,還必須做好下述工作。

① 為每個模塊開發一份功能說明。

② 為每個模塊提供一份接口說明。

③ 定義局部的和全程的數據結構。

④ 給出所有的設計限制或約束。

⑤ 進行總體設計評審。

⑥ 如果需要和可能,則進行設計“優化”。

(3)模塊的獨立性與信息隱蔽原理。每個模塊的實現細節(過程和數據)對于其他模塊來說應該是隱蔽的,即包含在模塊中的信息(過程或數據)對于其他不需要這些信息的模塊來說,是不能訪問的,或者是“不可見”的。

有效的模塊化可以通過定義來實現,模塊間的通信對于軟件功能來說是必要的。通過信息隱蔽,可以實施對模塊的過程細節和局部數據結構的限制。

模塊的獨立性是軟件質量的關鍵:模塊化程度較高的軟件容易開發,模塊化程度較高的軟件也比較容易測試和維護。

4)控制層次

控制層次也稱為程序結構,它表明了程序構件(模塊)的組織情況。控制層次往往用程序的層次(樹形或網狀)結構來表示。

(1)程序結構的深度:程序結構的層次數稱為結構的深度,反映了程序的規模和復雜程度。

(2)程序結構的寬度:同層次結構中的最大模塊個數稱為結構的寬度。

(3)模塊的扇入和扇出:扇出表示一個模塊直接調用(或控制)的其他用模塊數目。扇入定義為調用(或控制)一個給定模塊的模塊個數。多扇出意味著需要控制和協調許多下屬模塊。多扇入的模塊通常是公用模塊。

5)結構的劃分

程序結構可以按水平方向或垂直方向進行劃分。

(1)水平劃分按程序功能定義模塊各分支。頂層模塊是控制模塊,用來協調程序各個功能之間的通信和運行;其下級模塊的最簡單的水平劃分方法是建立三個分支:輸入、處理(數據變換)和輸出。優點是:主要的功能相互分離,易于修改、擴充。缺點是:模塊接口傳遞更多的數據,程序流的整體控制復雜。

(2)垂直劃分也稱為因子劃分。工作自頂向下逐層分布:頂層模塊執行控制功能,而低層模塊完成實際輸入、計算和輸出操作。優點是:低層模塊的修改副作用小,程序控制結構修改的可能性小,便于維護。

6)數據結構

數據結構是數據元素間邏輯關系的表示。典型的數據種類是有限的,它們是構成一些更復雜結構的基本構件塊。

7)軟件過程

程序結構描述了整個程序的控制層次關系和各個部分的接口情況,而圖1.6所示的模塊A的軟件過程則著重描述各個模塊的處理細節。

軟件過程必須提供詳細的操作說明,如事件的順序、正確的判定點、重復的操作等。程序結構與軟件過程有關。模塊的處理必須指明其上下級環境。軟件過程也是層次化的。

圖1.6 模塊A的軟件過程

3.編程語言

編程是一種行為,是根據用戶制定的步驟用“程序語言”表示給計算機,“指揮”計算機完成任務。

算法是程序的邏輯描述,結構是邏輯的數據實體。設計出算法、描述出結構程序就有了雛形。

1)程序設計語言的分類

程序設計語言分為以下3類。

(1)機器語言。

(2)匯編語言。

(3)高級語言。

2)語言的選擇

從描述客觀系統的角度看,程序設計語言還可以分為:

(1)面向過程語言。

      數據結構+算法    (首推C語言)

(2)面向對象語言。

      對象+消息     (代表為C++、Java語言)

語言只是工具,編程語言的底層都是相似的,其差別主要是適用范圍。

由于C語言是結構化的程序語言,適用于自頂向下的軟件開發方法,在編碼之前能幫助用戶了解程序整體結構和操作,適合解決數據處理領域的實際問題。我們選擇結構嚴謹、使用靈活的C語言作為我們的開發語言。該方法采自頂向下、逐步細化的設計方法,主要有確定問題、分析、設計算法、實現、測試、維護6個步驟。

引導文獻

1.程序類型

源程序:用戶編寫的程序稱為源程序。

目標程序:源程序通過翻譯形成目標程序(.OBJ文件)。

運行程序:將目標程序與函數庫連接后,形成運行程序(.EXE文件)。

程序設計:指用戶通過編寫源程序,翻譯源程序作為目標程序,連接目標程序與函數庫,形成運行程序并整理設計文檔的全過程。

2.工程

把代碼寫到一個文件里,會使查找和修改不再麻煩,單元(Unit)文件是一個不錯的選擇。

3.模塊與函數

要把大一些的任務分成小塊,再分成更小的塊,一個模塊對應一個單元(函數)。這樣的分工可以分散源代碼,多人同步完成各個單元的代碼,這就是結構化編程。在C語言中,各個模塊一般體現為“函數”。函數是C語言中最基本的編程單位。

4.程序的設計風格

1)程序內部的文檔

程序內部的文檔包括標志符(變量和標號)、程序的注釋、程序的視覺組織。

2)標志符

標志符包括模塊名、變量名、常量名、標號名、子程序名以及數據區名、緩沖區名等。這些名字應含義鮮明、能正確地提示代表的實體且符合語言的命名規范。

3)程序的注釋

程序的注釋分為兩種:序言性注釋和功能性注釋。

(1)序言性注釋通常安排在每個程序模塊的起始部分,它是對程序的整體說明。

(2)功能性注釋嵌入在源程序體內,用以描述其后的語句或程序段的處理功能。

4)程序的視覺組織

程序中代碼的布局對程序的可讀性有很大的影響。適當地利用空格、空行和移行能使程序的邏輯結構更加清晰。空格的合理應用還可以突出運算的優先性,避免發生運算錯誤。

5)數據說明

為了使數據更容易理解和維護,數據說明應遵循一些簡單、規范的原則。

6)輸入/輸出

以交互式輸入/輸出方式為主。對所有輸入數據都進行校驗,要指明可選擇的值或界限,以保證每個數據的有效性/合法性;為輸出加注釋,并設計輸出格式。

7)效率

效率是一個性能要求,應該在需求分析階段提出要求;好的設計可提高效率;程序的效率和程序的簡明程度是一致的。

5.概要設計與詳細設計

軟件設計是一個把軟件需求變換成軟件表示的過程。最初,這種表示只是描繪出軟件的總框架,然后進一步細化,把它加工成在程序細節上非常接近于源程序的軟件表示。從工程管理的角度來看,軟件設計分兩步完成:

(1)概要設計,將軟件需求轉化為數據結構和軟件的系統結構。

(2)詳細設計,即過程設計。通過對結構表示進行細化,得到軟件的詳細的數據結構和算法。

概要設計建立起整個系統的體系結構框架,并給出了系統中的全局數據結構和數據庫接口,人機接口,與其他硬、軟件連接的接口。此外,還從系統全局的角度,考慮處理方式、運行方式、容錯方式以及系統維護等方面的問題,并給出了度量和評價軟件質量的方法。它奠定了整個系統實現的基礎。若沒有概要設計,直接考慮程序設計,則不能從全局把握軟件系統的結構和質量,實現活動處于一種無序狀態,程序結構劃分不合理,導致系統處于一種不穩定的狀態,稍做改動就會失敗。因此,不能沒有概要設計。

6.完成良好的軟件設計應遵循的原則

軟件設計既是過程又是模型。設計過程是一系列迭代的步驟,使設計人員能夠描述被開發軟件的方方面面。設計模型體現了自頂向下、逐步細化的思想,首先構造事物的整體;然后逐步細化,引導設計人員構造各種細節。為了給軟件設計人員提供一些指導,Davis于1995年提出如下一系列軟件設計的原則,其中有些已被修改和補充。

(1)設計過程不應受“隧道視野”的限制。一位好的設計者應當考慮一些替代的手段。根據問題的要求,可以用基本的設計概念,如抽象、逐步求精、模塊化、軟件體系結構、控制層次、結構分解、數據結構、軟件過程、信息隱蔽等,來決定完成工作的資源。

(2)設計應能追溯到分析模型。由于設計模型中的每一單個成分常常可追溯到多個需求上,因此有必要對設計模型如何滿足需求進行追蹤。

(3)設計不應當從頭做起。系統是使用一系列設計模式構造起來的,很多模式很可能以前就遇到過。這些模式通常被稱為可復用的設計構件。可以使用它們代替那些從頭開始做的方法。時間短暫而資源有限!將應當設計時間投入到表示真正的新思想和集成那些已有的設計模式上。

(4)設計應當縮短軟件和現實世界中問題的“智力差距”,也就是說,軟件設計的結果應盡可能模擬問題領域的結構。

(5)設計應具有一致性和集成性。如果一個設計從整體上看像是一個人完成的,那么它就是一致的。在設計工作開始之前,設計小組應當定義風格和格式的規則。如果仔細定義了設計構件之間的接口,則該設計就是集成的。

(6)使用上述基本的設計概念,將設計構造得便于將來的修改。

(7)應將設計構造得即使遇到異常的數據、事件或操作條件,也能平滑地、輕松地降級。設計良好的計算機程序應當永不“徹底停工”,它應能適應異常的條件,并且當它必須中止處理時也能以從容的方式結束。

(8)設計不是編碼,編碼也不是設計。即使在建立程序構件的詳細的過程設計時,設計模型的抽象級別也比源代碼高。在編碼級別上做出的唯一設計決策是描述如何將過程性設計轉換為程序代碼的小的實現細節。

(9)在開始著手設計時,就應當能夠評估質量,而不是在事情完成之后。利用上述基本的設計概念和已有的設計方法,可以幫助設計者評估質量。

(10)應當堅持設計評審以減少概念上(語義上)的錯誤。有時,人們在設計評審時傾向于注重細節,只見樹木不見森林。在關注設計模型的語法之前,設計者應能確保設計的主要概念上的成分(遺漏、含糊、不一致)都已檢查過。

主站蜘蛛池模板: 东乡族自治县| 龙游县| 乌鲁木齐县| 滦南县| 太仆寺旗| 嘉义县| 神池县| 石嘴山市| 达州市| 宜川县| 镇康县| 桐柏县| 长春市| 中超| 商南县| 龙州县| 河间市| 孝感市| 视频| 平江县| 宜兰市| 安达市| 渝中区| 武邑县| 兰西县| 西华县| 阿城市| 衡山县| 西畴县| 建昌县| 呼和浩特市| 莆田市| 祁东县| 南丹县| 穆棱市| 宿松县| 南陵县| 虹口区| 芜湖市| 翼城县| 大埔区|