《應用軟件設計教程》講述了:“軟件設計”是學習如何設計一個軟件,是“軟件工程’’中的重要一環(huán)。但是要說清楚如何設計一個軟件卻不是一件很容易的事。在應用軟件方面軟件的類型實在太多了.按開發(fā)規(guī)模分類,有個人、3人左右的小團隊、5-10人的中等團隊、企業(yè)式團隊(幾十人)等;按網(wǎng)絡方式分類,有單機、C/S(客戶機/服務器)、B/S(瀏覽器/服務器)等類型;按項目來源分類,則有自創(chuàng)自用型、科研型、內部使用型、商業(yè)型等;按適用范圍可分為訂做、通用型、行業(yè)型,等等。由于各種類型軟件的要求不同,實現(xiàn)的目標不同,對軟件開發(fā)的質量不同,當然,編寫方式也是不同的。軟件設計課程通常會告訴你編制軟件所要遵循的原則,軟件開發(fā)需要經歷哪些工程。但不能期望學完了軟件設計,什么軟件都能設計了。應該說,通常軟件設計這個課程屬于方法論范疇,而不是如同電路設計、程序語言設計那樣讓你學會一項技能。
“軟件設計”是學習如何設計一個軟件,是“軟件工程’’中的重要一環(huán)。但是要說清楚如何設計一個軟件卻不是一件很容易的事。在應用軟件方面軟件的類型實在太多了.按開發(fā)規(guī)模分類,有個人、3人左右的小團隊、5-10人的中等團隊、企業(yè)式團隊(幾十人)等;按網(wǎng)絡方式分類,有單機、C/S(客戶機/服務器)、B/S(瀏覽器/服務器)等類型;按項目來源分類,則有自創(chuàng)自用型、科研型、內部使用型、商業(yè)型等;按適用范圍可分為獨家訂做、通用型、行業(yè)型,等等。由于各種類型軟件的要求不同,實現(xiàn)的目標不同,對軟件開發(fā)的質量不同,當然,編寫方式也是不同的。軟件設計課程通常會告訴你編制軟件所要遵循的原則,軟件開發(fā)需要經歷哪些工程。但不能期望學完了軟件設計,什么軟件都能設計了。應該說,通常軟件設計這個課程屬于方法論范疇,而不是如同電路設計、程序語言設計那樣讓你學會一項技能。
很多讀者期望通過軟件設計課程的學習,就能學會如何去設計一個軟件,但事實上并不那么理想,F(xiàn)在,很多軟件設計的論著都致力于對軟件開發(fā)過程的總結,力求在方法論上找出軟件設計的規(guī)律,用于指導學習者進行軟件設計。這方面最重要的成果應該是UML(統(tǒng)一建模語言)。這些抽象的法則和設計方法無疑是非常重要的,在本書中也有專門的介紹。但如果對一個沒有太多的軟件開發(fā)經驗的大學生或研究生,尤其是非計算機專業(yè)的學生來說,這些理論實在是太抽象了,以至于很多學完軟件設計的學生感覺沒有實質性的收獲。這些書本上的軟件設計的知識也許要等到從事軟件開發(fā)兩三年以后才有體會,如果那時還記得這些知識的話。
但是,要求學習者一定要等到積累了一定經驗以后再來學習軟件設計的方法是不現(xiàn)買的。根據(jù)作者多年的軟件開發(fā)經驗,并通過幾年的教學實踐,我們認為,對于沒有足夠編程經驗的讀者來說,軟件設計課程也是可以學習的;但在學習抽象的軟件設計方法之前還是要學一些基本的軟件設計技巧,讓學習者積累一定的經驗,然后再去理解抽象的方法論。
本書的主要對象是學過C++語言但沒有太多開發(fā)經驗的學生,特別是非計算機專業(yè)的學生?勺鳛榇髮W四年級或新入學的研究生學習軟件設計的教材。
本書分四個部分,共11章。本書采用以實例為主,力求將抽象的設計方法融入到具體程序實現(xiàn)中,讓讀者從實例中學習軟件設計的方法。本書所采用的程序語言是C++,開發(fā)工具是VC++,軟件設計實例是單機運行的繪圖軟件。
第一部分是“程序設計基礎知識”,是由第1、2兩章組成。主要是C++語言和數(shù)據(jù)結構的知識提要,供那些C++基礎不太好,或學得不夠深入的學生復習和深入學習用。其中著重介紹運算符重載、多態(tài)性、模板、線性表等概念。如果對這方面很熟的學生,則可以跳過或粗略瀏覽一遍即可。
第二部分是“MFC編程技術”,是由第3、4、5三章組成。主要介紹MFC程序調試方法、基本原理及基本的開發(fā)技術。使讀者對MFC程序有一個比較深入的了解。MFC程序結構提供了一個很好的軟件設計范本,我們在了解它的編程技術的同時,也會對MFC程序結構有一個比較深刻的印象,這對軟件設計的學習是非常有好處的。
第三部分是“軟件開發(fā)實例”,是由第6、7、8三章組成。這部分將引導讀者開發(fā)一個繪圖軟件系統(tǒng)。該軟件雖然很小,但其中包含的數(shù)據(jù)結構、數(shù)據(jù)的管理、程序流程等對軟件設計的學習者都非常具有借鑒作用。
第四部分是“軟件工程與軟件設計”,是由第9、10、11三章組成。這部分將結合前面程序的例子,介紹軟件工程的概念和軟件設計的方法。后面還著重介紹了UML統(tǒng)一建模語言。最后還結合開發(fā)實例給出了UML的設計方法。從一個具體的開發(fā)實例中獲得軟件設計的思路,從而能夠理解軟件設計的理論。這就是本書所要追求的目標。
第一部分 程序設計基礎知識
第1章 C++語言提要
1.1 概述
1.2 類與對象
1.2.1 類的構造函數(shù)
1.2.2 拷貝構造函數(shù)被調用的場合
1.2.3 帶有指針變量的類
1.2.4 關于類的繼承問題
1.3 變量與函數(shù)
1.3.1 指針與引用
1.3.2 靜態(tài)變量
1.3.3 函數(shù)參數(shù)
1.3.4 const的用法
1.4 運算符重載
1.4.1 將運算符理解為函數(shù)
1.4.2 不同類之間的運算
1.4.3 用友元定義的運算符
1.4.4 其他運算符的定義
1.5 多態(tài)性
1.5.1 一個多態(tài)性的例子
1.5.2 動態(tài)綁定原理
1.5.3 關于虛函數(shù)的進一步探討
1.6 模板
1.6.1 用模板定義的函數(shù)
1.6.2 用模板定義的類
1.6.3 非類型模板參數(shù)
思考題
習題
第2章 數(shù)據(jù)結構提要
2.1 概述
2.2 順序存儲方式:數(shù)組
2.2.1 二維數(shù)組的物理結構
2.2.2 關于數(shù)組的類
2.3 鏈式存儲方式:鏈表
2.3.1 鏈表的物理結構
2.3.2 尾部添加新結點
2.3.3 刪除結點
2.3.4 插入新結點
2.4 線性表特例:棧
2.4.1 棧的基本概念
2.4.2 用鏈表方式實現(xiàn)棧的操作
2.5 線性表特例:循環(huán)隊列
2.5.1 隊列的基本概念
2.5.2 循環(huán)隊列的實現(xiàn)
思考題
習題
第二部分 MFC編程技術
第3章 VC++簡介
3.1 概述
3.2 MFC基本知識
3.2.1 MFC的數(shù)據(jù)類型的表示
3.2.2 匈牙利變量命名法
3.2.3 幾種常用的工具類
3.3 MFC應用程序框架
3.3.1 與應用程序有關的層次結構
3.3.2 層次結構中的主要類介紹
3.3.3 簡單應用程序舉例
3.4 程序調試的方法
3.4.1 代碼跟蹤與斷言
3.4.2 AssertValid與Dump
思考題
習題
第4章 MFC程序的工作原理
4.1 消息處理機制
1.1.1 MFC程序入口
4.1.2 消息與消息循環(huán)
4.1.3 消息的傳遞
4.1.4 消息映射
4.2 運行期識別
4.2.1 運行期——RUNTIME_CLASS
4.2.2 動態(tài)創(chuàng)建——DYNCREATE
4.2.3 類型識別——IsKindof
4.3 串行化
4.3.1 文件的數(shù)據(jù)讀取方式
4.3.2 CArchive的數(shù)據(jù)讀取與寫入方式
4.3.3 串行化函數(shù)
思考題
習題
第5章 MFC程序的開發(fā)技術
5.1 動態(tài)鏈接庫與工程管理
5.1.1 動態(tài)鏈接庫的基本概念
5.1.2 一個簡單的DLL
5.1.3 DLL的調用方式
5.1.4 建立有動態(tài)庫的工程
5.2 消息發(fā)送與接收
5.2.1 消息的發(fā)送與接收
5.2.2 自定義消息塊
5.2.3 與其他應用程序通信
5.3 串行化文件的保存與讀取
5.3.1 讓類支持串行化
5.3.2 DOC中的串行化
5.3.3 串行化到文件
5.4 注冊表
5.4.1 注冊表的基本操作
5.4.2 設置文件關聯(lián)
5.5 異常處理
5.5.1 異常處理
5.5.2 自己設計的異常處理
思考題
習題
第三部分 軟件開發(fā)實例
第6章 圖像法繪圖
6.1 CDC類與繪圖
6.1.1 繪圖類
6.1.2 繪圖設備類
6.1.3 用CDC繪制簡單圖形
6.2 簡單的圖像法繪圖
6.2.1 加入一個繪圖菜單
6.2.2 簡單的圖像法繪圖實現(xiàn)
6.2.3 彩色繪圖
6.3 圖形繪制的橡皮條算法
6.3.1 “橡皮條”的基本原理
6.3.2 如何在程序中實現(xiàn)橡皮條
6.4 OnDraw()與圖像保持
6.4.1 視圖類的OnDraw函數(shù)
6.4.2 圖像保持
6.5 圖像法的撤銷與重復(UNDO/REDO)
6.6 類似MSPAINT的界面設計
6.6.1 狀態(tài)欄
6.6.2 繪圖工具欄
6.6.3 顏色工具欄
思考題
習題
第7章 簡單的矢量法繪圖軟件設計
7.1 圖形元素類
7.1.1 圖形元素基類
7.1.2 直線類
7.1.3 矩形類
7.1.4 橢圓類
7.2 實現(xiàn)矢量繪圖
7.2.1 LBUTFONDOWN的消息響應函數(shù)
7.2.2 MOUSEMOVE的消息響應函數(shù)
7.2.3 LBUTTONUP的消息響應函數(shù)
7.3 矢量繪圖系統(tǒng)的管理
7.3.1 利用MFC鏈表管理圖形元素對象
7.3.2 系統(tǒng)的管理類
7.4 矢量法的撤銷與重復(UNDO/REDO)
7.4.1 設計Redo鏈表
7.4.2 菜單中響應撤銷與重復的消息
7.5 動態(tài)庫與程序的模塊化
7.5.1 建立動態(tài)庫工程ShapeDll
7.5.2 在MyDraw中使用動態(tài)庫
思考題
習題
第8章 較完善的矢量法繪圖軟件設計
8.1 串行化與文件讀寫
8.1.1 如何使類可串行化
8.1.2 在DOC中實現(xiàn)串行化
8.2 圖元拾取技術
8.2.1 選中圖元
8.2.2 移動圖元
8.2.3 修改界面程序,實現(xiàn)選中和移動效果
8.2.4 拉伸圖元
8.3 圖元編組技術
8.3.1 子圖類的組織
8.3.2 圖形元素管理類編組功能
8.3.3 彈出式菜單
8.4 操作鏈表
8.4.1 操作基類的組織
8.4.2 移動、拉伸等操作類的組織
8.4.3 修改圖元管理類的Undo/Redo
8.5 總結
思考題
習題
第四部分 軟件工程與軟件設計
第9章 軟件工程的基本知識
9.1 概述
9.1.1 軟件工程的誕生
9.1.2 軟件的開發(fā)過程與建模
9.2 可行性研究與需求分析
9.2.1 可行性研究
9.2.2 需求分析
9.3 概要設計
9.3.1 概要設計概述
9.3.2 概要設計方法
9.3.3 概要設計過程
9.4 詳細設計與編碼
9.4.1 詳細設計
9.4.2 編碼實現(xiàn)
9.5 軟件測試
9.5.1 軟件測試原則
9.5.2 軟件測試的基本方法
9.5.3 軟件測試的復雜性與經濟性
9.6 模塊的耦合與內聚
9.6.1 耦合
9.6.2 內聚
9.6.3 劃分模塊的準則
9.7 程序的正確性與健壯性
9.7.1 軟件的正確性
9.7.2 軟件的健壯性
思考題
習題
第10章 統(tǒng)一建模語言UML
10.1 概述
10.1.1 UML的主要特點
10.1.2 UML在現(xiàn)代軟件工程中的重要作用
10.2 UML的主要內容
10.2.1 用例圖
10.2.2 類圖
10.2.3 對象圖
10.2.4 狀態(tài)圖
10.2.5 順序圖
10.2.6 協(xié)作圖
10.2.7 活動圖
10.2.8 構件圖
10.2.9 部署圖
思考題
習題
第11章 畫筆程序設計
11.1 開發(fā)背景
11.2 理解需求
11.2.1 繪制功能
11.2.2 圖形編輯功能
11.2.3 保存功能
11.3 分析與設計
11.3.1 用例分析
11.3.2 領域分析
11.3.3 業(yè)務過程分析(活動圖)
11.3.4 交互分析
11.3.5 概要設計
11.3.6 詳細設計
11.3.7 用戶界面設計
11.4 編碼與實現(xiàn)
11.5 測試與部署
11.6 小結
參考文獻