模型驅動軟件設計:高效、低成本交付可靠軟件
[美] 史蒂夫·托基(Steve Tockey)著 張建陽 譯
- 出版商: 清華大學
- 出版日期: 2026-05-01
- 售價: $1,728
- 語言: 簡體中文
- ISBN: 7302709513
- ISBN-13: 9787302709510
-
相關分類:
UML
- 此書翻譯自: How to Engineer Software: A Model-Based Approach
下單後立即進貨 (約4週~6週)
相關主題
商品描述
作者簡介
目錄大綱
目 錄
第Ⅰ部分 基礎知識
第1章 引言 3
1.1 主流軟件項目表現不佳 3
1.2 問題1:含糊不清、模棱兩可和不完整的需求 4
1.2.1 需求中的歧義 5
1.2.2 需求不完整 7
1.2.3 需求真的在變嗎 8
1.2.4 基於模型的軟件工程如何起到幫助作用 9
1.3 問題2:過度依賴測試 10
1.3.1 軟件缺陷的來源 11
1.3.2 返工率:R% 12
1.3.3 對測試的依賴 13
1.3.4 基於模型的軟件工程可以提供幫助 14
1.4 問題3:“代碼自我說明”是一種幻想 14
1.4.1 代碼永遠無法自我說明 15
1.4.2 基於模型的軟件工程如何解決這個問題 15
1.5 為什麼敏捷開發不能解決這些問題 16
1.5.1 Scrum和需求 17
1.5.2 Scrum和測試 17
1.5.3 Scrum和代碼的自我說明 20
1.6 廣告中的真相 21
1.7 軟件工程 22
1.8 基於模型的軟件工程概述 23
1.8.1 背景 24
1.8.2 語義模型 24
1.8.3 接口規範 24
1.8.4 軟件設計規範 25
1.8.5 源代碼 25
1.8.6 可追溯性 25
1.8.7 對軟件測試的影響 25
1.8.8 交付物與生命周期 25
1.9 與其他類似方法的關系 26
1.10 本書概覽 27
1.11 本章小結 27
1.11.1 別再叫它們“bug”了! 28
1.11.2 你什麼時候想要 29
1.11.3 基於模型的軟件工程的最終目標 29
第2章 代碼的本質 31
2.1 自然語言中的語法和語義 31
2.2 編程語言中的語法和語義 33
2.3 契約式設計和軟件語義 34
2.4 Liskov可替換性和軟件語義 35
2.5 語義在編程中的重要性 37
2.6 軟件“業務”自動化 38
2.7 基於模型的軟件需求 40
2.7.1 基於模型的需求:用例圖 40
2.7.2 基於模型的需求:類模型 41
2.7.3 基於模型的需求:交互圖 42
2.7.4 基於模型的需求:狀態模型 42
2.7.5 無自動化技術 43
2.8 自動化技術的語義模型 44
2.9 我們終於可以編寫代碼了 46
2.10 代碼是一種映射 50
2.11 “代碼是一種映射”的最重要含義 51
2.12 本章小結 51
第3章 基本原則 53
3.1 專註於語義 53
3.2 管理復雜性 54
3.2.1 本質復雜性與偶然復雜性 54
3.2.2 必要與不必要的偶然復雜性 54
3.2.3 復雜性對經濟的影響 55
3.3 使用適當的抽象 56
3.3.1 抽象化實現技術 56
3.3.2 抽象化業務細節 56
3.4 封裝偶然復雜性 58
3.5 最大化內聚,最小化耦合 60
3.5.1 內聚性 61
3.5.2 耦合關系 61
3.6 基於不變量設計,面向變化設計 62
3.6.1 產品系列:積極主動而非被動應對 62
3.6.2 處理易變需求的另一種方式 63
3.7 避免過早進行設計和優化 64
3.7.1 過早設計和優化的示例 64
3.7.2 另一個過早設計和優化的例子 66
3.7.3 Fudd先生的第一創造力定律 67
3.7.4 如何避免過早設計和優化 68
3.8 謹慎命名 69
3.9 質量標準 69
3.10 與SOLID原則的關系 71
3.11 本章小結 72
第4章 功能性和非功能性需求 73
4.1 什麼是需求? 73
4.2 誰來決策? 74
4.3 這真的是需求嗎? 75
4.4 實例:連珠遊戲(井字棋)智能手機應用 77
4.5 玩連珠遊戲的Tinker Toy計算機 78
4.6 需求的種類 80
4.7 區分功能性需求和非功能性需求 83
4.7.1 功能性和非功能性需求示例 84
4.7.2 非功能性需求仍然是需求 85
4.8 為什麼要區分功能性和非功能性需求? 86
4.9 非功能性需求的進一步說明 87
4.9.1 確定非功能性的“怎麼做”需求 87
4.9.2 引入非功能性的“有多好”需求 88
4.9.3 確定非功能性的“有多好”需求 88
4.10 質量標準 91
4.11 本章小結 92
第5章 UML概述 93
5.1 對象管理組織(OMG) 93
5.2 面向對象的開發和統一建模語言(UML) 93
5.3 UML的方言 94
5.4 通用UML工具 95
5.4.1 註釋 95
5.4.2 約束條件 96
5.4.3 構造型 97
5.4.4 UML包 98
5.4.5 一般依賴關系 98
5.5 圖與模型 99
5.6 UML的更多內容 99
5.7 本章小結 99
第6章 按領域劃分系統 101
6.1 什麼是領域? 101
6.2 識別領域 102
6.2.1 頭腦風暴的概念 102
6.2.2 按“一致性詞匯”對概念進行分組 102
6.2.3 為領域命名 104
6.3 領域圖:領域及其關系 105
6.3.1 領域圖符號表示法 105
6.3.2 對領域施加需求 106
6.4 簡化模型與擴展模型 106
6.4.1 現有技術 107
6.4.2 不確定領域 107
6.4.3 領域的描述 107
6.5 質量標準 108
6.6 領域分離對軟件架構的影響 108
6.6.1 測試飛機領域 109
6.6.2 儀表領域 109
6.6.3 ARINC-629領域 109
6.6.4 一個執行場景示例:執行步驟110 109
6.6.5 另一個示例:執行步驟120 111
6.6.6 WebBooks 2.0中的領域分離 113
6.7 領域分離對軟件文檔的影響 113
6.7.1 領域的功能性需求 113
6.7.2 領域的非功能性需求 114
6.7.3 流經領域的非功能性需求 114
6.7.4 繞過領域的非功能性需求 114
6.7.5 創建下層領域的需求 115
6.7.6 需求流的復合視圖 115
6.7.7 遞歸設計 116
6.7.8 打包多領域文檔 117
6.8 領域分離和基本原則 117
6.9 領域分離對組織結構的影響 119
6.10 本章小結 119
第Ⅱ部分 語義建模:基於模型的功能需求
第7章 用例圖:範圍和背景 123
7.1 關於用例圖的相對不重要性 123
7.2 參與者 124
7.2.1 參與者是角色而非實體 125
7.2.2 參與者表示法 125
7.2.3 參與者的命名 126
7.2.4 避免把時鐘當作參與者 126
7.3 用例 126
7.4 “參與” 127
7.5 管理大型領域的用例分層結構 129
7.6 通過業務事件識別海面級事件用例 130
7.6.1 時機不定的業務事件 132
7.6.2 定時業務事件 132
7.6.3 後果性業務事件 132
7.6.4 未發生業務事件 132
7.6.5 業務事件和完整性 133
7.6.6 首先關註正常行為 133
7.7 錯誤性業務事件 134
7.8 事件用例命名規範 134
7.9 具體說明海面級事件用例 135
7.10 海面級數據用例 136
7.11 對信息流動進行建模 138
7.12 不需要參與者參與的用例 139
7.13 «include»用例 140
7.14 «extend»用例 141
7.15 泛化用例 142
7.16 泛化參與者 143
7.17 基本動態與保管動態(CRUD) 143
7.18 WebBooks 2.0訂單履行用例 144
7.19 質量標準 144
7.20 經濟考慮 145
7.21 描述整體工作流 146
7.22 本章小結 146
第8章 類模型:要施行的策略 149
8.1 類 149
8.1.1 識別類 150
8.1.2 類名 151
8.1.3 類表示法 152
8.2 屬性 153
8.2.1 屬性名稱 153
8.2.2 屬性表示法 153
8.2.3 類與屬性 153
8.3 屬性值域的定義 154
8.3.1 具有精度和單位的區間 155
8.3.2 枚舉 155
8.3.3 引用 155
8.3.4 無約束 156
8.3.5 值域定義和需求完整性 156
8.4 鍵 157
8.4.1 鍵的表示法 157
8.4.2 模型中是否使用鍵值? 158
8.5 派生屬性 159
8.5.1 派生屬性的表示法 159
8.5.2 模型是否派生屬性? 160
8.6 類和屬性規範化 160
8.6.1 傳統智慧:範式規則 161
8.6.2 域-鍵範式(DK/NF) 161
8.6.3 插入異常 162
8.6.4 刪除異常 163
8.6.5 DK/NF和異常 163
8.7 類和屬性規範化的例外情況 164
8.7.1 空值異常 164
8.7.2 復合值異常情況 165
8.8 類和屬性描述 166
8.8.1 類描述 166
8.8.2 屬性描述 166
8.9 關聯 167
8.9.1 關聯表示法 168
8.9.2 關聯名稱 168
8.9.3 關聯和持久性 170
8.10 指定關聯的多重性 170
8.10.1 多重表示法 171
8.10.2 多重性和需求完整性 171
8.11 自關聯 173
8.12 多重關聯 173
8.13 聚合和組合 173
8.13.1 聚合 174
8.13.2 組合 174
8.13.3 聚合與組合的問題 175
8.13.4 聚合和組合表示法的誤用 175
8.13.5 聚合、組合和分析癱瘓 176
8.14 外鍵 176
8.15 關聯類 177
8.15.1 關聯類表示法 177
8.15.2 是否建立關聯類模型? 177
8.16 n元關聯 179
8.17 關聯描述 180
8.18 泛化 181
8.18.1 {完整}與{不完整}泛化對比 182
8.18.2 {互斥}與{重疊}泛化對比 183
8.18.3 繼承的濫用 184
8.18.4 靜態與動態分類 185
8.18.5 多重分類 185
8.18.6 多重動態分類 187
8.19 WebBooks 2.0訂單履行中的電子書和紙質書 187
8.20 質量標準 188
8.21 經濟考慮 191
8.22 本章小結 191
第9章 交互圖:中級流程 193
9.1 論交互圖的相對不重要性 193
9.2 基本概念 193
9.3 基本交互圖表示法 194
9.3.1 基本時序圖畫法 195
9.3.2 基本通信圖表示法 196
9.4 消息和凈信息流 197
9.5 消息命名 198
9.6 哪些對象會互相通信? 199
9.7 對象創建 199
9.8 對象刪除 200
9.9 單條消息條件 200
9.10 單條消息重復和多對象 201
9.11 給自己發消息 202
9.12 多消息條件判斷——opt(可選) 202
9.13 多消息條件判斷——alt 203
9.14 多個消息疊代——loop(循環) 204
9.15 引用單獨的時序圖 204
9.16 開發時序圖的策略 205
9.17 交互圖中的錯誤處理 208
9.18 交互圖描述 208
9.19 代理商 209
9.20 交互圖中的內聚和耦合 209
9.21 質量標準 210
9.22 經濟考慮因素 211
9.23 本章小結 211
第10章 狀態模型:細粒度的流程 213
10.1 事件 214
10.1.1 查找事件 214
10.1.2 事件表示法 215
10.2 狀態 215
10.2.1 狀態表示法 216
10.2.2 查找狀態 217
10.2.3 狀態描述 217
10.3 轉移 218
10.3.1 轉移表示法 218
10.3.2 首先建模正常行為 219
10.4 初始狀態 219
10.5 自身轉移 220
10.6 防護條件 221
10.7 順序子狀態 223
10.8 最終狀態 224
10.9 狀態-事件-轉移的完整性 225
10.10 關聯狀態和屬性 226
10.11 動作 227
10.12 轉移動作 227
10.12.1 進入/和退出/轉移動作 228
10.12.2 事件名稱/轉移動作 230
10.12.3 轉移時間基本上為零 230
10.12.4 轉移動作的執行順序 230
10.13 狀態動作 231
10.14 動作重用 231
10.15 轉移動作和狀態動作的等效性 232
10.16 動作規範 233
10.17 以要求-保證(契約)形式說明動作規範 233
10.18 使用模型說明動作 235
10.19 使用UML動作語義說明動作 235
10.20 使用偽代碼或代碼片段說明動作 235
10.21 動作的內聚性和耦合性準則 235
10.22 動作和關聯多重性的施行 236
10.23 動作參數 237
10.24 對“任意順序”事件建模 240
10.25 狀態模型中的錯誤處理 241
10.26 動態分類和狀態模型 243
10.27 代理(中介者)狀態模型 244
10.28 狀態-事件矩陣表示法 245
10.29 修改時序圖以顯示對象狀態 247
10.30 質量標準 248
10.31 經濟考慮因素 249
10.32 本章小結 249
第11章 將領域劃分為子域 251
11.1 子域劃分和基本原則 251
11.2 子域劃分示例 252
11.3 領域劃分 254
11.3.1 子域的語義模型 255
11.3.2 “客戶訂單”子域 257
11.3.3 “庫存管理”子域 259
11.4 子域圖 260
11.5 質量標準 263
11.6 本章小結 263
第12章 總結語義建模 265
12.1 回顧語義模型 265
12.2 將語義模型內容組織成書面規範 266
12.3 確認語義模型 267
12.4 通過同行評審確認語義模型 267
12.5 通過模擬演示確認語義模型 268
12.5.1 基於標記的模擬 268
12.5.2 基於表格的模型模擬 273
12.6 從語義模型推導驗證測試用例 277
12.7 軟件測試經濟學:基於風險的測試 278
12.8 測試元素與測試用例 282
12.8.1 從狀態模型推導出驗證測試元素 282
12.8.2 從動作規範推導出驗證測試元素 283
12.8.3 從屬性範圍推導出驗證測試元素 284
12.8.4 從派生屬性中推導出驗證測試元素 285
12.8.5 從關聯多重性推導出驗證測試元素 285
12.8.6 從泛化中推導出驗證測試元素 285
12.8.7 從信息流中推導出驗證測試元素 286
12.8.8 將驗證測試元素組合成驗證測試用例 286
12.8.9 從測試元素構建測試用例 288
12.9 關於驗收測試驅動開發的評論 290
12.10 將語義模型轉化為自然語言需求文檔 291
12.10.1 將用例圖翻譯成自然語言需求 291
12.10.2 將類模型翻譯成自然語言需求 292
12.10.3 將狀態模型翻譯成自然語言需求 294
12.10.4 將動作規範翻譯成自然語言需求 296
12.11 分析模式與設計模式 297
12.12 產品系列和語義模型 298
12.13 替代語義模型開發流程 299
12.14 構建與購買:語義模型在軟件采購中的作用 300
12.15 本章小結 301
第Ⅲ部分 基於模型的設計和編碼
第13章 設計和編碼導論 305
13.1 語義建模與設計建模 305
13.2 自動化技術選取 306
13.3 確定自動化邊界 306
13.4 兩種設計方式 307
13.5 軟件設計活動概述 309
13.6 本章小結 310
第14章 接口設計:指定現實世界的交互 311
14.1 軟件流程背景下的接口設計 311
14.2 易用性的重要性 312
14.3 誰的接口? 313
14.4 凈信息流和接口上的推送與拉取對比 313
14.5 兩種參與者 314
14.6 處理集合 314
14.7 用戶(人)界面設計 316
14.8 任務分析 316
14.8.1 用戶類調查 317
14.8.2 任務調查 317
14.8.3 用戶類和任務 318
14.8.4 任務分析的好處 318
14.9 對話框圖示 319
14.10 用戶界面原型 322
14.11 用戶界面設計案例研究 323
14.12 用戶指南文檔 324
14.13 API設計 324
14.13.1 應用程序接口安全 326
14.13.2 應用程序接口文檔 326
14.14 處理接口報錯 330
14.15 封裝接口規範 331
14.16 質量標準 331
14.17 本章小結 332
第15章 高級(概要)設計:類和操作 333
15.1 對高級(概要)設計的評論 333
15.2 高級設計的UML表示法 334
15.2.1 設計用例圖 334
15.2.2 設計類圖 335
15.2.3 設計時序圖 336
15.3 導出模型區域的設計類 336
15.3.1 解決動態分類問題 337
15.3.2 折疊繼承層次結構 338
15.3.3 狀態(委托)模式 338
15.3.4 關聯轉變為設計類 339
15.4 模型區域的導出操作 339
15.4.1 兩個類之間的C/S(客戶端-服務端)關系 340
15.4.2 三個以上類之間的客戶端-服務端關系 341
15.4.3 推送事件、拉取數據 343
15.5 在模型區域中導出訂單履行操作 344
15.5.1 打包訂單用例 345
15.5.2 擴展“補貨”用例 347
15.5.3 “Catalog?”用例 348
15.5.4 “添加到購物車”用例 349
15.5.5 “從購物車中刪除”用例 350
15.5.6 “結算”用例 351
15.5.7 不完整的時序圖集 352
15.6 “視圖-控制器”區域的高級設計 354
15.7 用戶界面視圖-控制器區域的高級設計 355
15.8 單用戶桌面視圖-控制器區域的高級設計 355
15.8.1 更優雅的視圖-控制器設計 359
15.8.2 視圖-控制器區域中的遞歸設計 360
15.9 分布式客戶端-服務器的視圖-控制器區域的高級設計 360
15.10 API視圖-控制器區域的高級設計 361
15.11 實時/嵌入式視圖-控制器區域的高級設計 363
15.12 基礎設施區域的高級設計 364
15.13 質量標準 364
15.14 本章小結 365
第16章 高級(概要)設計:契約和簽名 367
16.1 高級設計是一種有意的封裝屏障 367
16.2 為模型區域拉取數據推導契約和簽名 368
16.2.1 派生屬性 369
16.2.2 帶輸入參數的派生屬性 370
16.2.3 返回集合而不是值 370
16.3 為模型區域推送的事件推導契約和簽名 372
16.3.1 包含狀態模型中的動作 374
16.3.2 推送事件的簽名 376
16.3.3 主題的變化 377
16.4 為推送事件推導契約和簽名:具體示例 377
16.5 防禦式編程和契約設計 382
16.5.1 防禦範圍 382
16.5.2 防禦性編程和Liskov替代原則 385
16.5.3 防禦式編程的好處和代價 385
16.6 防禦式編程和信任邊界 386
16.7 處理契約級錯誤 386
16.7.1 錯誤預防 387
16.7.2 錯誤處理 388
16.7.3 如果出錯,該做什麼 389
16.7.4 通知誰(如果有) 389
16.7.5 基於數據流的通知 390
16.7.6 基於控制流的通知 393
16.7.7 錯誤代碼與異常 396
16.7.8 通知第三方 396
16.7.9 繼續與停止 397
16.7.10 契約級錯誤總結 398
16.8 為模型區域派生類不變量 398
16.9 為模型區域拉取事件派生契約和簽名 400
16.10 為模型區域推送數據派生契約和簽名 403
16.11 視圖-控制器和基礎架構區域中的契約和簽名 405
16.12 記錄最初的高級設計 407
16.13 質量標準 407
16.14 本章小結 408
第17章 詳細設計和編碼 409
17.1 對詳細設計的評論 410
17.2 在模型區域中實現屬性 410
17.2.1 實現帶精度和單位的跨度 411
17.2.2 實現枚舉 411
17.2.3 實現引用 412
17.2.4 實現不受約束 412
17.2.5 解釋所選用的表示法 413
17.3 在模型區域中實現關聯 413
17.4 在內存駐留對象中實現關聯 414
17.4.1 對應正好是一 414
17.4.2 對應到零或一個 414
17.4.3 對應到一或多個 415
17.4.4 對應到零或多個 415
17.4.5 雙向客戶端-服務器連接 415
17.4.6 關聯類 416
17.5 在持久層中實現關聯 418
17.5.1 鍵 418
17.5.2 外鍵 419
17.5.3 關聯類 419
17.6 數據訪問對象模式 420
17.7 在模型區域中實現派生屬性 423
17.7.1 按需計算 424
17.7.2 更新和存儲時計算 424
17.7.3 延遲更新 425
17.7.4 決策標準 426
17.8 完成操作簽名:參數和返回類型 427
17.9 在模型區域中設計和實現方法 427
17.10 設計和實現動態分類 428
17.10.1 繼承層次結構的折疊 428
17.10.2 狀態(又名委托)模式 430
17.11 連接領域 433
17.12 用戶界面視圖-控制器區域的詳細設計 434
17.13 API或嵌入式代碼的視圖-控制器區域的詳細設計 434
17.14 在基礎設施區域中進行詳細設計和編碼 435
17.15 處理方法級錯誤 435
17.16 關於代碼註釋的幾點評論 436
17.17 總結方法級設計和代碼 436
17.18 詳細設計和代碼文檔 437
17.19 質量標準 437
17.20 本章小結 437
第18章 實際的設計和編碼 439
18.1 按意圖編程 439
18.1.1 IRR()示例 440
18.1.2 IRR()示例:第一輪循環 441
18.1.3 IRR()示例:第二輪循環 443
18.1.4 IRR()示例:第三輪循環 444
18.1.5 IRR()示例:最終代碼 445
18.2 斷言 447
18.2.1 斷言 != 錯誤處理 447
18.2.2 斷言和契約設計 448
18.2.3 斷言和類不變量 448
18.2.4 斷言與故障隔離 448
18.2.5 斷言並非總是有用 449
18.2.6 斷言與性能 449
18.2.7 斷言的錯誤用法 449
18.3 軟件正確性的證明:揭示代碼的真實、形式化的性質 451
18.3.1 正確性證明與測試 451
18.3.2 引入軟件正確性證明 452
18.3.3 命題 453
18.3.4 一個小例子證明 453
18.4 與序列相關的證明 454
18.5 與調用有關的證明 455
18.6 與選擇有關的證明 458
18.6.1 與switch-case有關的證明 459
18.6.2 與try-catch-finally有關的證明 461
18.7 關於疊代的證明 463
18.7.1 循環不變量 463
18.7.2 循環體 464
18.7.3 for()循環的證明 465
18.8 正確性的完整證明 466
18.9 意圖-行動-證明-斷言格式 469
18.10 質量標準 472
18.11 本章小結 473
第19章 優化 475
19.1 優化工程的方法 475
19.2 使用矩陣 478
19.3 優化高級(概要)設計 480
19.4 高級(概要)設計優化:水平拆分 480
19.5 高級(概要)設計優化:垂直拆分 482
19.5.1 訂單履行中的垂直拆分 483
19.5.2 高級(概要)設計優化:垂直整合 484
19.5.3 訂單履行中的垂直整合 484
19.6 高級(概要)設計優化:水平整合 486
19.6.1 訂單履行中的水平整合 486
19.6.2 總結高級(概要)設計優化 487
19.7 詳細設計的優化和代碼的優化 488
19.7.1 高性能算法或數據結構 488
19.7.2 保持語義的變換 488
19.7.3 用時間換空間變換 489
19.7.4 用空間換時間變換 489
19.7.5 循環變換 490
19.7.6 邏輯變換 491
19.7.7 函數變換 492
19.7.8 表達式變換 493
19.7.9 系統相關效率 495
19.7.10 保持語義的變換與重構對比 495
19.7.11 總結保持語義的變換 495
19.8 SQL優化 496
19.9 用較低級別的語言進行設計和實現 497
19.9.1 消除類邊界 497
19.9.2 將實例變量組織成類記錄結構 498
19.9.3 將類記錄結構組織成集合 499
19.9.4 鏈接關聯的類記錄結構 501
19.9.5 將操作重寫為函數 502
19.9.6 提取結構圖 506
19.9.7 處理繼承 507
19.9.8 處理繼承:將子類疊加到父類 507
19.9.9 處理繼承:將父類分配到子類中 508
19.9.10 處理繼承:鏈接所有類 508
19.9.11 對衍生式結構化設計的評論 509
19.9.12 走入更底層 510
19.10 對運行時環境進行調優 510
19.10.1 對操作系統進行調優 510
19.10.2 對數據庫進行調優 511
19.10.3 對網絡調優 511
19.11 對硬件進行優化 512
19.12 鞏固優化 512
19.13 質量標準 513
19.14 本章小結 513
第20章 模型編譯 515
20.1 開放式模型編譯與封閉式模型編譯 515
20.2 規則映射與非規則映射 516
20.3 計算無關模型(CIM)、平臺無關模型(PIM)和平臺特定模型(PSM) 517
20.4 UML動作語義 519
20.5 開放式模型編譯詳細說明 520
20.6 代碼生成的一個復雜示例 522
20.6.1 示例框架 522
20.6.2 生產規則 #DOMAIN_NAME 522
20.6.3 生產規則#CLASS_NAME 523
20.6.4 生產規則#STATE_ENUM_LIST 523
20.6.5 生產規則#ATTRIBUTE_INSTVAR_LIST 524
20.6.6 生產規則#PUSHED_ EVENTS_OPERATION_LIST 525
20.6.7 生產規則#EVENT_METHOD_BODY 526
20.6.8 生產規則#TRANSITION_ACTIONS_LIST 528
20.6.9 生產規則#TRANSITION_ACTION_PRIVATE_METHOD_LIST 530
20.6.10 生產規則#ACTION_BODY 531
20.6.11 結束復雜示例 531
20.6.12 完整的圖書訂單類源代碼 532
20.6.13 廣度優先與深度優先的代碼生成 540
20.6.14 生成視圖控制器區域代碼 540
20.6.15 生成基礎設施區域代碼 540
20.7 編程語言演變的簡要回顧 541
20.7.1 對於計算機來說,全是1和0 541
20.7.2 第二代:匯編語言 541
20.7.3 第三代:高級編譯語言 543
20.7.4 現代語言 544
20.7.5 可編譯的語義模型 544
20.8 質量標準 546
20.9 本章小結 546
第21章 高級開放模型編譯 549
21.1 優化生成的應用程序代碼 549
21.1.1 改進機制 549
21.1.2 改進框架和生產規則 550
21.1.3 標記 553
21.1.4 智能規則 554
21.2 在現有規則解釋器上構建新的開放模型編譯器 555
21.2.1 簡化語義建模語言 556
21.2.2 入門指南 556
21.2.3 確定機制和框架 560
21.2.4 確定生產規則 560
21.2.5 實現生產規則 561
21.2.6 驗證新的開放模型編譯器 561
21.3 生成除應用程序源代碼以外的其他輸出 562
21.3.1 生成正式文檔 562
21.3.2 生成自然語言文檔 562
21.3.3 生成驗證測試案例 564
21.3.4 計算語義模型結構復雜度指標 565
21.4 構建新的生產規則解釋器 567
21.5 質量標準 570
21.6 UML語義的缺陷 571
21.7 本章小結 572
第22章 總結基於模型的設計和編碼 573
22.1 回顧基於模型的設計和編碼 573
22.2 語義模型和設計模型的對比 574
22.3 以書面規範的形式記錄設計 575
22.4 設計與編碼之間的區別 576
22.5 Knuth的文學編程 577
22.6 設計和編碼的驗證測試 582
22.6.1 針對操作級語義(契約)的單元測試 582
22.6.2 對單個類進行集成測試 584
22.6.3 將一個類合並到另一個類的集成測試 584
22.6.4 (子)域功能測試 584
22.6.5 針對接口規範進行可用性和/或接口測試 584
22.6.6 針對非功能的“有多好”需求的性能測試 584
22.6.7 總結設計和編碼的驗證測試 585
22.7 產品系列的設計和編碼 585
22.8 源代碼重用的誤解 585
22.9 本章小結 586
第Ⅳ部分 相關主題
第23章 估算 591
23.1 估算、承諾、不確定性和風險 592
23.1.1 為什麼要估算 592
23.1.2 足夠好、不夠好和太好的估算 592
23.1.3 估算與承諾 593
23.1.4 不確定性 593
23.1.5 風險 597
23.1.6 資產 597
23.1.7 工作量與進度表 598
23.2 估計標稱工作量和標稱進度 599
23.2.1 估計標稱工作量 599
23.2.2 警告:個人生產效率有所不同 601
23.2.3 估算標稱進度 602
23.2.4 估計標稱人員配備 602
23.3 工作量與進度的權衡 603
23.4 做出合理承諾 604
23.4.1 計算基於計劃的項目中的不確定性補償 605
23.4.2 計算敏捷項目中不確定性的余量 606
23.4.3 計算風險和資產的應急儲備 606
23.4.4 計算合理承諾 607
23.4.5 註意事項 608
23.5 沒有模型編譯器的活動工作量估算 609
23.6 使用模型編譯器的活動工作量估算 611
23.7 替換遺留系統的估算 613
23.7.1 根據類比估算語義模型類數量 613
23.7.2 從遺留表和內部數據結構估算語義模型類數量 613
23.7.3 根據遺留源代碼行數估算語義模型類數量 613
23.8 小規模維護的估算 615
23.9 質量標準 616
23.10 本章小結 617
第24章 開發和維護流程 619
24.1 區分階段與活動 619
24.2 敏捷開發 621
24.3 敏捷開發下的基於模型的軟件工程 622
24.4 瀑布式開發 622
24.5 基於模型的軟件工程、瀑布式模型和可循環反饋 623
24.6 對比敏捷開發與瀑布式開發 624
24.6.1 靈活性和早期價值與固有的低效率的權衡 626
24.6.2 要更靈活就需要更多的業務參與 627
24.6.3 用流程簡單性換取可擴展性 627
24.6.4 流行度 628
24.7 一刀切並不適合所有情況 631
24.8 元流程:正確優化軟件流程 633
24.8.1 步驟1:評估外部驅動因素 633
24.8.2 步驟2:確定每種特征的需要量 635
24.8.3 步驟3:選擇預先存在的生命周期或創建自己的生命周期 637
24.8.4 如果有任何疊代 637
24.9 質量標準 639
24.10 本章小結 640
第25章 錯誤處理的經濟學 641
25.1 簡單分析 642
25.1.1 簡單分析,步驟1:評估不處理錯誤造成的損失 642
25.1.2 簡單分析,步驟2:提出處理錯誤的建議 644
25.1.3 簡單分析,步驟3:評估每項建議 646
25.1.4 簡單分析,步驟4:選擇具有正凈節省額的建議 648
25.2 復雜分析 648
25.2.1 步驟1:評估不處理錯誤造成的損失 649
25.2.2 步驟2:提出處理錯誤的建議 650
25.2.3 步驟3:評估每項建議 650
25.2.4 步驟4:選擇最佳的可替代方案 652
25.3 非正式分析 655
25.4 非正式地重新分析先前的例子 661
25.5 本章小結 661
第26章 對基於模型的軟件工程的異議 663
26.1 觀點1:沒有模型也能以同樣快或更快的速度生成代碼 663
26.2 觀點2:基於模型的軟件工程需要“預先進行全面設計” 664
26.3 觀點3:利益相關方不懂UML或建模 665
26.4 觀點4:有些人不喜歡圖形,他們更喜歡文本 666
26.5 觀點5:語義模型只是不同語言中的代碼 666
26.6 觀點6:語義模型不是需求,而是設計 667
26.7 觀點7:如果沒有先進、昂貴的工具,語義建模就不實用 668
26.8 觀點8:不清楚誰應該進行語義建模 669
26.9 觀點9:如果基於模型的軟件工程這麼好,那為什麼大家還不去用它呢? 670
26.10 本章小結 672
第Ⅴ部分 總結
第27章 結束語 675
27.1 本書概述 675
27.2 重新審視全局 676
27.2.1 背景 676
27.2.2 語義模型 676
27.2.3 接口規範 677
27.2.4 軟件設計規範 677
27.2.5 源代碼 677
27.2.6 可追溯性 677
27.2.7 對測試的影響 677
27.3 解決主流軟件項目的主要問題 678
27.4 解決問題1:含糊不清、模棱兩可、不完整的需求 678
27.5 解決問題2:過度依賴測試來發現軟件缺陷 679
27.6 解決問題3:“代碼自我說明”是幻想 680
27.6.1 字面上的“自編碼文檔” 681
27.6.2 軟件人才嚴重流失 681
27.7 基於模型的軟件工程中的復雜性管理 682
27.8 Bug = 缺陷 = 語義不一致 683
27.9 本章小結 684
27.9.1 環球航空公司TWA 599號航班 684
27.9.2 基於模型的軟件工程的最終目標 685
第Ⅵ部分 附錄
附錄A 文檔編寫原則 689
附錄B WebBooks 2.0背景 691
附錄C WebBooks 2.0領域 695
附錄D 訂單履行的語義模型 699
附錄E (提綱示例)訂單履行設計 723
附錄F 支付語義模型 741
附錄G (提綱示例)支付設計 759
附錄H 可擴展性域的語義模型 771
附錄I (提綱示例)可擴展性設計 795
附錄J 高可用性語義模型 807
附錄K (提綱示例)高可用性設計 823
附錄L 語義建模的語義 831
附錄M 示例生產規則 861
附錄N 軟件結構復雜性指標 873



