Julia 設計模式 (Hands-On Design Patterns and Best Practices with Julia)

Tom Kwong

買這商品的人也買了...

商品描述

本書兼顧Julia編程語言的優勢和不足,全面介紹了Julia編程語言,
介紹了模式所依賴的編程語言特性,同時涵蓋了一些高級的內容。
全書分為四部分,
第1部分介紹設計模式,
第二部分就少Julia基礎,
第三部分介紹設計模式實現,
第四部分介紹一些進階主題。

作者簡介

作者:湯姆~鄺(Tom Kwong)
註冊金融分析師。
他是一位經驗豐富的軟件工程師,擁有超過25年行業編程經驗。
他的大部分職業生涯都投身在金融服務行業。
他的專長包括軟件架構、軟件設計、交易系統和風控系統開發。
從2017年開始,他發現了Julia編程語言並貢獻了許多開源包,包括SASLib.jl。


譯者:方明
Thoughtworks高級軟件諮詢師,2010年畢業於延邊大學計算機係數字媒體技術專業。
先後經歷過多個手機遊戲項目和聚合支付項目,擁有豐富的遊戲服務端開發經驗和支付領域知識,擅長Java、Scala、 Javascript等多種編程語言。
目前專注於海外項目交付,重點關注敏捷實踐、團隊管理和交付效能等領域。

目錄大綱

序言
前言
作者簡介
審校者簡介
第一部分 從設計模式開始
第1章 設計模式和相關原則 2
1.1 設計模式的歷史 2
1.1.1 設計模式的興起 3
1.1.2 關於GoF模式的更多思考 3
1.1.3 在本書中我們如何描述設計模式 4
1.2 軟件設計原則 4
1.2.1 SOLID原則 5
1.2.2 DRY原則 6
1.2.3 KISS原則 6
1.2.4 POLA原則 7
1.2.5 YAGNI原則 7
1.2.6 POLP原則 8
1.3 軟件質量目標 8
1.3.1 可重用性 8
1.3.2 性能 9
1.3.3 可維護性 10
1.3.4 安全性 11
1.4 小結 11
1.5 問題 12

第二部分 Julia基礎
第2章 模塊、包和數據類型 14
2.1 技術要求 14
2.2 程序開發中不斷增長的痛點 15
2.2.1 數據科學項目 15
2.2.2 企業應用程序 15
2.2.3 適應增長 16
2.3 使用命名空間、模塊和包 16
2.3.1 理解命名空間 17
2.3.2 創建模塊和包 17
2.3.3 創建子模塊 23
2.3.4 在模塊中管理文件 24
2.4 管理包的依賴關係 24
2.4.1 理解語義版本控制方案 24
2.4.2 Julia包的依賴關係 25
2.4.3 避免循環依賴 28
2.5 設計抽像類型和具體類型 29
2.5.1 設計抽像類型 29
2.5.2 設計具體類型 33
2.5.3 使用類型運算符 37
2.5.4 抽像類型和具體類型的差異 39
2.6 使用參數化類型 39
2.6.1 使用參數化複合類型 40
2.6.2 使用參數化抽像類型 42
2.7 數據類型轉換 43
2.7.1 執行簡單的數據類型轉換 44
2.7.2 注意有損轉換 44
2.7.3 理解數字類型轉換 45
2.7.4 重溫自動轉換規則 45
2.7.5 理解函數分派規則 47
2.8 小結 48
2.9 問題 49

第3章 設計函數和接口 50
3.1 技術要求 50
3.2 設計函數 51
3.2.1 用例——太空戰爭遊戲 51
3.2.2 定義函數 51
3.2.3 註釋函數參數 52
3.2.4 使用可選參數 55
3.2.5 使用關鍵字參數 57
3.2.6 接受可變數量的參數 58
3.2.7 splatting參數 59
3.2.8 第一類實體函數 60
3.2.9 開發匿名函數 61
3.2.10 使用do語法 62
3.3 理解多重分派 63
3.3.1 什麼是分派 63
3.3.2 匹配窄類型 64
3.3.3 分派多個參數 65
3.3.4 分派過程中可能存在的歧義 67
3.3.5 歧義檢測 68
3.3.6 理解動態分派 70
3.4 利用參數化方法 71
3.4.1 使用類型參數 71
3.4.2 使用類型參數替換抽像類型 72
3.4.3 在使用參數時強制類型一致性 73
3.4.4 從方法簽名中提取類型信息 74
3.5 使用接口 75
3.5.1 設計和開發接口 75
3.5.2 處理軟契約 79
3.5.3 使用特質 80
3.6 小結 81
3.7 問題 81

第4章 宏和元編程 82
4.1 技術要求 83
4.2 理解元編程的需求 83
4.2.1 使用@time宏測量性能 83
4.2.2 循環展開 84
4.3 使用表達式 86
4.3.1 試用解析器 86
4.3.2 手動構造表達式對象 88
4.3.3 嘗試更複雜的表達式 90
4.3.4 計算表達式 93
4.3.5 在表達式中插入變量 94
4.3.6 對符號使用QuoteNode 95
4.3.7 在嵌套表達式中插值 96
4.4 開發宏 97
4.4.1 什麼是宏 97
4.4.2 編寫第一個宏 98
4.4.3 傳遞字面量參數 98
4.4.4 傳遞表達式參數 99
4.4.5 理解宏擴展過程 100
4.4.6 操作表達式 101
4.4.7 理解衛生宏 104
4.4.8 開發非標準字符串字面量 105
4.5 使用生成函數 107
4.5.1 定義生成函數 108
4.5.2 檢查生成函數參數 109
4.6 小結 110
4.7 問題 110

第三部分 實現設計模式
第5章 可重用模式 114
5.1 技術要求 114
5.2 委託模式 114
5.2.1 在銀行用例中應用委託模式 115
5.2.2 現實生活中的例子 119
5.2.3 注意事項 120
5.3 Holy Traits模式 120
5.3.1 重溫個人資產管理用例 121
5.3.2 實現Holy Traits模式 122
5.3.3 重溫一些常見用法 126
5.3.4 使用SimpleTraits.jl包 129
5.4 參數化類型模式 130
5.4.1 在股票交易應用程序中使用刪除文本參數化類型 132
5.4.2 現實生活中的例子 135
5.5 小結 138
5.6 問題 139

第6章 性能模式 140
6.1 技術要求 141
6.2 全局常量模式 141
6.2.1 使用全局變量對性能進行基準測試 141
6.2.2 享受全局常量的速度 143
6.2.3 使用類型信息註釋變量 143
6.2.4 理解常量為何有助於性能 144
6.2.5 將全局變量作為函數參數傳遞 145
6.2.6 將變量隱藏在全局常量中 145
6.2.7 現實生活中的例子 146
6.2.8 注意事項 147
6.3 數組結構模式 147
6.3.1 使用業務領域模型 148
6.3.2 使用不同的數據佈局提高性能 150
6.3.3 注意事項 155
6.4 共享數組模式 155
6.4.1 風險管理用例介紹 156
6.4.2 準備示例數據 157
6.4.3 高性能解決方案概述 158
6.4.4 在共享數組中填充數據 159
6.4.5 直接在共享數組上分析數據 161
6.4.6 理解並行處理的開銷 163
6.4.7 配置共享內存使用情況 164
6.4.8 確保工作進程可以訪問代碼和數據 166
6.4.9 避免並行進程之間的競態 167
6.4.10 使用共享數組的約束 167
6.5 記憶模式 168
6.5.1 斐波那契函數介紹 168
6.5.2 改善斐波那契函數的性能 169
6.5.3 自動化構造記憶緩存 171
6.5.4 理解泛型函數的約束 172
6.5.5 支持具有多個參數的函數 173
6.5.6 處理參數中的可變數據類型 174
6.5.7 使用宏來記憶泛型函數 176
6.5.8 現實生活中的例子 177
6.5.9 注意事項 178
6.5.10 使用Caching.jl包 178
6.6 閘函數模式 180
6.6.1 識別類型不穩定的函數 181
6.6.2 理解性能影響 182
6.6.3 開發閘函數 183
6.6.4 處理類型不穩定的輸出變量 183
6.6.5 使用@inferred宏 186
6.7 小結 187
6.8 問題 187

第7章 可維護性模式 188
7.1 技術要求 188
7.2 子模塊模式 189
7.2.1 理解何時需要子模塊 189
7.2.2 理解傳入耦合與傳出耦合 190
7.2.3 管理子模塊 191
7.2.4 在模塊和子模塊之間引用符號和函數 191
7.2.5 刪除雙向耦合 193
7.2.6 考慮拆分為頂層模塊 195
7.2.7 理解使用子模塊的反論點 195
7.3 關鍵字定義模式 195
7.3.1 重溫結構定義和構造函數 196
7.3.2 在構造函數中使用關鍵字參數 196
7.3.3 使用@kwdef宏簡化代碼 197
7.4 代碼生成模式 198
7.4.1 文件日誌記錄器用例介紹 199
7.4.2 函數定義的代碼生成 201
7.4.3 調試代碼生成 202
7.4.4 考慮代碼生成以外的選項 204
7.5 領域特定語言模式 205
7.5.1 L系統介紹 206
7.5.2 為L系統設計DSL 207
7.5.3 重溫L系統核心邏輯 208
7.5.4 實現L系統的DSL 210
7.6 小結 215
7.7 問題 215

第8章 魯棒性模式 216
8.1 技術要求 217
8.2 訪問器模式 217
8.2.1 識別對象的隱式接口 217
8.2.2 實現getter函數 218
8.2.3 實現setter函數 219
8.2.4 禁止直接訪問字段 220
8.3 屬性模式 220
8.3.1 延遲文件加載器介紹 220
8.3.2 理解用於字段訪問的點符號 222
8.3.3 實現讀取訪問和延遲加載 223
8.3.4 控制對對象字段的寫入訪問 226
8.3.5 報告可訪問字段 227
8.4 let塊模式 228
8.4.1 網絡爬蟲用例介紹 228
8.4.2 使用閉包將私有變量和函數隱藏起來 230
8.4.3 限制長腳本或函數的變量範圍 232
8.5 異常處理模式 233
8.5.1 捕捉和處理異常 233
8.5.2 處理各種類型的異常 233
8.5.3 在頂層處理異常 235
8.5.4 跟隨棧幀 236
8.5.5 理解異常處理對性能的影響 238
8.5.6 重試操作 239
8.5.7 異常時選用nothing 241
8.6 小結 242
8.7 問題 243

第9章 其他模式 244
9.1 技術要求 244
9.2 單例類型分派模式 245
9.2.1 開發命令處理器 245
9.2.2 理解單例類型 245
9.2.3 使用Val參數化數據類型 246
9.2.4 使用單例類型進行動態分派 247
9.2.5 理解分派的性能優勢 249
9.3 打樁/模擬模式 251
9.3.1 什麼是測試替身 251
9.3.2 信貸審批用例介紹 252
9.3.3 使用打樁執行狀態驗證 253
9.3.4 使用Mocking包實現打樁 255
9.3.5 將多個打樁應用於同一函數 256
9.3.6 使用模擬執行行為驗證 257
9.4 函數管道模式 259
9.4.1 Hacker News分析用例介紹 260
9.4.2 理解函數管道 264
9.4.3 設計可組合函數 265
9.4.4 為平均得分函數開發函數管道 266
9.4.5 在函數管道中實現條件邏輯 269
9.4.6 沿函數管道進行廣播 270
9.4.7 有關使用函數管道的注意事項 271
9.5 小結 272
9.6 問題 272

第10章 反模式 273
10.1 技術要求 273
10.2 海盜反模式 274
10.2.1 I類海盜—重新定義函數 274
10.2.2 II類海盜—不用自己的類型擴展 275
10.2.3 III類海盜—用自己的類型擴展,但目的不同 277
10.3 窄參數類型反模式 279
10.3.1 考慮參數類型的多種選項 279
10.3.2 評估性能 284
10.4 非具體字段類型反模式 285
10.4.1 理解複合數據類型的內存佈局 285
10.4.2 設計複合類型時要考慮具體類型 287
10.4.3 比較具體字段類型和非具體字段類型的性能 288
10.5 小結 289
10.6 問題 289

第11章 傳統的面向對像模式 290
11.1 技術要求 290
11.2 創建型模式 291
11.2.1 工廠方法模式 291
11.2.2 抽象工廠模式 292
11.2.3 單例模式 294
11.2.4 建造者模式 296
11.2.5 原型模式 297
11.3 行為型模式 298
11.3.1 責任鏈模式 298
11.3.2 中介者模式 300
11.3.3 備忘錄模式 302
11.3.4 觀察者模式 304
11.3.5 狀態模式 305
11.3.6 策略模式 306
11.3.7 模板方法模式 308
11.3.8 命令模式、解釋器模式、迭代器模式和訪問者模式 310
11.4 結構型模式 310
11.4.1 適配器模式 310
11.4.2 組合模式 313
11.4.3 享元模式 314
11.4.4 橋接模式、裝飾器模式和外觀模式 316
11.5 小結 316
11.6 問題 317

第四部分 進階主題
第12章 繼承與變體 320
12.1 技術要求 320
12.2 實現繼承和行為子類型化 321
12.2.1 理解實現繼承 321
12.2.2 理解行為子類型化 323
12.2.3 正方形–矩形問題 324
12.2.4 脆弱的基類問題 326
12.2.5 重溫鴨子類型 327
12.3 協變、不變和逆變 328
12.3.1 理解不同種類的變體 328
12.3.2 參數化類型是不變的 328
12.3.3 方法參數是協變的 331
12.3.4 剖析函數類型 331
12.3.5 確定函數類型的變體 333
12.3.6 實現自己的函數類型分派 335
12.4 再談參數化方法 336
12.4.1 類型變量 337
12.4.2 匹配類型變量 337
12.4.3 理解對角線規則 338
12.4.4 對角線規則的例外 339
12.4.5 類型變量的可用性 339
12.5 小結 340
12.6 問題 341
問題答案 342