模型驅動軟件設計:高效、低成本交付可靠軟件

[美] 史蒂夫·托基(Steve Tockey)著 張建陽 譯

  • 模型驅動軟件設計:高效、低成本交付可靠軟件-preview-1
  • 模型驅動軟件設計:高效、低成本交付可靠軟件-preview-2
  • 模型驅動軟件設計:高效、低成本交付可靠軟件-preview-3
模型驅動軟件設計:高效、低成本交付可靠軟件-preview-1

相關主題

商品描述

"以更低成本構建可擴展、易維護的軟件   《模型驅動軟件設計:高效、低成本交付可靠軟件》是一本十分實用的操作手冊,通過UML(統一建模語言)分析基於模型的軟件工程概念與技術。作者Steve是UML領域的泰鬥級人物,展示了如何采用真正的工程學科方法開發和維護軟件,並闡述了基於“計算機科學”和“離散數學”的軟件工程實踐方法。 基於模型的軟件工程利用“語義建模”盡可能精確地捕獲需求,通過將業務復雜性與技術復雜性分離,為開發者提供了**的設計自由度,以找到**的設計和編碼方案。本書探討如何通過領域劃分和子領域劃分來提高開發的可擴展性,分析如何利用精準的軟件文檔為開發和維護過程增加價值。 本書內容 ?貫穿全書的操作實例演示:從語義模型到可執行代碼,全程展示基於模型的軟件工程實踐。 ?驗證(驗收)測試生成:詳細解釋如何從語義模型推導出驗證測試用例。 ?項目評估與流程選擇:涵蓋項目估算方法及多種可替代性軟件的開發與維護流程。 ?解決現實問題的經濟學思想:指導如何低成本、高效地開發和維護實用軟件。"

作者簡介

Steve Tockey是Construx公司的首席顧問,潛心研究軟件工程實踐,包括面向對象開發、分布式對象計算、軟件項目管理和軟件質量。Steve擁有西雅圖大學軟件工程碩士學位,曾任該校的兼職教授。加盟Construx公司前,Steve曾供職於勞倫斯利弗莫爾國家實驗室、波音公司和羅克韋爾柯林斯公司。

目錄大綱

目    錄

第Ⅰ部分  基礎知識

第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