注冊 | 登錄讀書好,好讀書,讀好書!
讀書網(wǎng)-DuShu.com
當(dāng)前位置: 首頁出版圖書科學(xué)技術(shù)計(jì)算機(jī)/網(wǎng)絡(luò)軟件與程序設(shè)計(jì)C/C++及其相關(guān)C#函數(shù)式編程(第2版)

C#函數(shù)式編程(第2版)

C#函數(shù)式編程(第2版)

定 價:¥128.00

作 者: [美]恩里科·博南諾(Enrico Buonanno) 著,張駿溫 譯
出版社: 清華大學(xué)出版社
叢編項(xiàng):
標(biāo) 簽: 暫缺

ISBN: 9787302633341 出版時間: 2023-06-01 包裝: 平裝-膠訂
開本: 16開 頁數(shù): 字?jǐn)?shù):  

內(nèi)容簡介

  函數(shù)式編程將改變你思考代碼的方式!利用良好的FP技術(shù),C#開發(fā)人員可極大地提升軟件的并發(fā)處理、狀態(tài)管理和事件處理能力,以及軟件的可維護(hù)性。本書介紹了在C#編碼實(shí)踐中添加函數(shù)式編程的原因、方式和位置?! 禖#函數(shù)式編程(第2版)》引導(dǎo)你在C#語言中使用函數(shù)式思想來解決實(shí)際問題。書中回顧了C#語言中一些能夠用來實(shí)現(xiàn)函數(shù)式編程的語言特性,并且通過許多實(shí)際的例子展示了函數(shù)組合、數(shù)據(jù)驅(qū)動編程和不可變數(shù)據(jù)結(jié)構(gòu)的強(qiáng)大功能。所有代碼示例均可用于.NET 6和C# 10。 主要內(nèi)容 ● 高階函數(shù)減少了代碼的重復(fù),可用更少的代碼執(zhí)行更多的操作 ● 基于純函數(shù)的代碼易于測試和優(yōu)化 ● 編寫高質(zhì)量的API,準(zhǔn)確描述程序的行為 ● 編寫函數(shù)式風(fēng)格的Web API ● 與LINQ的單組合

作者簡介

  Enrico Buonanno于2001年獲得哥倫比亞大學(xué)計(jì)算機(jī)科學(xué)碩士學(xué)位,此后一直從事軟件開發(fā)和架構(gòu)師工作。他曾在金融科技(包括國際清算銀行、巴克萊銀行和瑞銀集團(tuán))和其他技術(shù)驅(qū)動型業(yè)務(wù)的著名公司從事關(guān)鍵項(xiàng)目的開發(fā)。

圖書目錄

第Ⅰ部分  入門
第1章  介紹函數(shù)式編程 3
1.1  什么是函數(shù)式編程 3
1.1.1  函數(shù)作為第一類值 4
1.1.2  避免狀態(tài)突變 4
1.1.3  編寫具有強(qiáng)力保證的程序 5
1.2  C#語言中的函數(shù)式編程 8
1.2.1  LINQ的函數(shù)式性質(zhì) 8
1.2.2  函數(shù)式編碼的簡短語法 10
1.2.3  元組的語言支持 11
1.2.4  模式匹配和記錄類型 13
1.3  將在本書中學(xué)到什么 16
1.4  本章小結(jié) 17
第2章  函數(shù)思維 19
2.1  什么是函數(shù) 19
2.1.1  映射函數(shù) 19
2.1.2  在C#中表示函數(shù) 20
2.2  高階函數(shù) 24
2.2.1  依賴其他函數(shù)的函數(shù) 24
2.2.2  適配器函數(shù) 26
2.2.3  創(chuàng)建其他函數(shù)的函數(shù) 26
2.3  使用HOF避免重復(fù) 27
2.4  練習(xí) 30
2.5  本章小結(jié) 31
第3章  函數(shù)純潔性很重要 33
3.1  什么是函數(shù)的純潔性 33
3.1.1  純潔性和副作用 34
3.1.2  管理副作用的策略 35
3.2  通過避免狀態(tài)突變實(shí)現(xiàn)并行化 37
3.2.1  純函數(shù)可良好地并行化 38
3.2.2  并行化不純函數(shù) 39
3.2.3  避免狀態(tài)突變 40
3.3  純潔性和可測性 43
3.3.1  隔離I/O影響 43
3.3.2  實(shí)踐:一個業(yè)務(wù)驗(yàn)證場景 44
3.3.3  為什么很難測試不純函數(shù) 46
3.4  執(zhí)行I/O的測試代碼 47
3.4.1  面向?qū)ο蟮囊蕾囎⑷?48
3.4.2  可測試性沒有那么多樣板 51
3.5  純潔性和計(jì)算的發(fā)展 53
3.6  練習(xí) 54
3.7  本章小結(jié) 54
第Ⅱ部分  核心技術(shù)
第4章  設(shè)計(jì)函數(shù)簽名和類型 57
4.1  設(shè)計(jì)函數(shù)簽名 57
4.1.1  使用箭頭符號編寫簽名 58
4.1.2  簽名的信息量有多大 58
4.2  使用數(shù)據(jù)對象捕獲數(shù)據(jù) 59
4.2.1  原始類型通常不夠具體 60
4.2.2  使用自定義類型約束輸入 61
4.2.3  編寫“誠實(shí)的”函數(shù) 62
4.2.4  把值組合到復(fù)雜的數(shù)據(jù)對象中 64
4.3  使用Unit為數(shù)據(jù)缺失建模 65
4.3.1  為什么void不理想 65
4.3.2  彌合Action和Func之間的差異 67
4.4  本章小結(jié) 68
第5章  為數(shù)據(jù)可能缺失建模 69
5.1  每天都在使用糟糕的API 69
5.2  Option類型的介紹 71
5.3  實(shí)現(xiàn)Option 73
5.3.1  Option的理想實(shí)現(xiàn) 73
5.3.2  使用Option 73
5.3.3  創(chuàng)建None 74
5.3.4  創(chuàng)建Some 75
5.3.5  優(yōu)化Option實(shí)現(xiàn) 76
5.4  Option作為偏函數(shù)的自然結(jié)果類型 78
5.4.1  解析字符串 78
5.4.2  在集合中查找數(shù)據(jù) 79
5.4.3  智能構(gòu)造函數(shù)模式 80
5.5  處理null 81
5.5.1  為什么null是一個糟糕的想法 81
5.5.2  使用Option替代null來獲得健壯性 82
5.5.3  不可空的引用類型 83
5.5.4  防止NullReference-Exception 85
5.6  練習(xí) 86
5.7  本章小結(jié) 87
第6章  函數(shù)式編程中的模式 89
6.1  將函數(shù)應(yīng)用于結(jié)構(gòu)的內(nèi)部值 89
6.1.1  將函數(shù)映射到序列上 89
6.1.2  將函數(shù)映射到Option 90
6.1.3  Option是如何提高抽象級別的 93
6.1.4  函子 93
6.2  使用ForEach執(zhí)行副作用 94
6.3  使用Bind鏈接函數(shù) 96
6.3.1  將返回Option的函數(shù)組合起來 97
6.3.2  使用Bind平鋪嵌套列表 98
6.3.3  實(shí)際上,這被稱為單子 100
6.3.4  Return函數(shù) 100
6.3.5  函子和單子之間的關(guān)系 101
6.4  使用Where過濾值 101
6.5  使用Bind組合Option和IEnumerable 102
6.6  在不同抽象級別上編碼 104
6.6.1  常規(guī)值與高級值 104
6.6.2  跨越抽象級別 105
6.6.3  重新審視Map與Bind 106
6.6.4  在正確的抽象級別上工作 107
6.7  練習(xí) 107
6.8  本章小結(jié) 108
第7章  使用函數(shù)組合設(shè)計(jì)程序 109
7.1  函數(shù)組合 109
7.1.1  復(fù)習(xí)函數(shù)組合 109
7.1.2  方法鏈 110
7.1.3  高級界域中的組合 112
7.2  從數(shù)據(jù)流的角度進(jìn)行思考 113
7.2.1  使用LINQ的可組合API 113
7.2.2  編寫可組合性更好的函數(shù) 114
7.3  工作流編程 116
7.3.1  關(guān)于驗(yàn)證的一個簡單工作流 116
7.3.2  以數(shù)據(jù)流的思想進(jìn)行重構(gòu) 117
7.3.3  組合帶來了更大的靈活性 118
7.4  介紹函數(shù)式領(lǐng)域建模 119
7.5  端到端的服務(wù)器端工作流 120
7.5.1  表達(dá)式與語句 122
7.5.2  聲明式與命令式 122
7.5.3  函數(shù)式分層 123
7.6  練習(xí) 124
7.7  本章小結(jié) 125
第Ⅲ部分  函數(shù)式設(shè)計(jì)
第8章  函數(shù)式錯誤處理 129
8.1  表示輸出的更安全方式 130
8.1.1  使用Either捕獲錯誤細(xì)節(jié) 130
8.1.2  處理Either的核心函數(shù) 133
8.1.3  比較Option和Either 134
8.2  鏈接操作可能失敗 135
8.3  驗(yàn)證:Either的一個完美用例 137
8.3.1  為錯誤選擇合適的表示法 137
8.3.2  定義一個基于Either的API 138
8.3.3  添加驗(yàn)證邏輯 139
8.4  將輸出提供給客戶端應(yīng)用程序 140
8.4.1  公開一個類似Option的接口 141
8.4.2  公開一個類似Either的接口 142
8.4.3  返回一個DTO結(jié)果 143
8.5  Either的變體 144
8.5.1  在不同的錯誤表示之間進(jìn)行更改 144
8.5.2  Either的特定版本 145
8.5.3  重構(gòu)Validation和
Exceptional 146
8.5.4  保留異常 149
8.6  練習(xí) 150
8.7  本章小結(jié) 151
第9章  用函數(shù)構(gòu)造應(yīng)用程序 153
9.1  偏函數(shù)應(yīng)用:逐個提供參數(shù) 153
9.1.1  手動啟用偏函數(shù)應(yīng)用 155
9.1.2  歸納偏函數(shù)應(yīng)用 156
9.1.3  參數(shù)的順序問題 157
9.2  克服方法解析的怪癖 158
9.3  柯里化函數(shù):優(yōu)化偏函數(shù)應(yīng)用 160
9.4  創(chuàng)建一個友好的偏函數(shù)應(yīng)用API 162
9.4.1  可文檔化的類型 163
9.4.2  特殊化數(shù)據(jù)訪問函數(shù) 164
9.5  應(yīng)用程序的模塊化及組合 166
9.5.1  OOP中的模塊化 167
9.5.2  FP中的模塊化 168
9.5.3  將函數(shù)映射到API端點(diǎn) 171
9.5.4  比較兩種方法 173
9.6  將列表壓縮為單個值 174
9.6.1  LINQ的Aggregate方法 174
9.6.2  聚合驗(yàn)證結(jié)果 176
9.6.3  收集驗(yàn)證錯誤 177
9.7  練習(xí) 178
9.8  本章小結(jié) 178
第10章  有效地處理多參函數(shù) 181
10.1  高級界域中的函數(shù)應(yīng)用程序 181
10.1.1  理解應(yīng)用式 183
10.1.2  提升函數(shù) 185
10.1.3  基于屬性的測試 186
10.2  函子、應(yīng)用式、單子 188
10.3  單子定律 190
10.3.1  右恒等元 190
10.3.2  左恒等元 190
10.3.3  結(jié)合律 191
10.3.4  對多參函數(shù)使用Bind 193
10.4  通過對任何單子使用LINQ來提高可讀性 193
10.4.1  對任意函子使用LINQ 194
10.4.2  對任意單子使用LINQ 195
10.4.3  let、where及其他LINQ子句 198
10.5  何時使用Bind或Apply 199
10.5.1  具有智能構(gòu)造函數(shù)的驗(yàn)證 199
10.5.2  使用應(yīng)用式流收集錯誤 201
10.5.3  使用單子流快速失敗 202
10.6  練習(xí) 203
10.7  本章小結(jié) 203
第11章  表示狀態(tài)和變化 205
11.1  狀態(tài)突變的陷阱 205
11.2  理解狀態(tài)、標(biāo)識及變化 208
11.2.1  有些事物永遠(yuǎn)不變 209
11.2.2  表示非突變的變化 211
11.3  使用記錄捕獲域?qū)嶓w的狀態(tài) 212
11.3.1  對記錄初始化的細(xì)粒度控制 214
11.3.2  所有這些都是不可變的 216
11.4  數(shù)據(jù)與邏輯分離 218
11.5  本章小結(jié) 220
第12章  函數(shù)式數(shù)據(jù)結(jié)構(gòu)簡介 221
12.1  經(jīng)典的函數(shù)鏈表 222
12.1.1  常見的列表操作 224
12.1.2  修改不可變列表 225
12.1.3  解構(gòu)任何IEnumerable 227
12.2  二叉樹 227
12.2.1  常見的樹操作 228
12.2.2  結(jié)構(gòu)共享 230
12.3  結(jié)論 231
12.4  練習(xí) 231
12.5  本章小結(jié) 232
第13章  事件溯源:持久化的函數(shù)式方法 233
13.1  關(guān)于數(shù)據(jù)存儲的函數(shù)式思考 234
13.1.1  為什么數(shù)據(jù)存儲只能追加 234
13.1.2  放松,并忘卻存儲狀態(tài) 235
13.2  事件溯源的基礎(chǔ)知識 236
13.2.1  表示事件 236
13.2.2  持久化事件 237
13.2.3  表示狀態(tài) 238
13.2.4  表示狀態(tài)轉(zhuǎn)換 239
13.2.5  從過去的事件中重建當(dāng)前狀態(tài) 240
13.3  事件溯源系統(tǒng)的架構(gòu) 241
13.3.1  處理命令 243
13.3.2  處理事件 245
13.3.3  添加驗(yàn)證 246
13.3.4  創(chuàng)建事件數(shù)據(jù)的視圖 248
13.4  比較不同的不可變存儲方法 251
13.4.1  Datomic與Event Store 252
13.4.2  領(lǐng)域是否受事件驅(qū)動 252
13.5  本章小結(jié) 253
第Ⅳ部分  高級技術(shù)
第14章  惰性計(jì)算、延續(xù)以及單子組合之美 257
14.1  惰性的優(yōu)點(diǎn) 258
14.1.1  用于處理Option的惰性API 258
14.1.2  組合惰性計(jì)算 261
14.2  使用Try進(jìn)行異常處理 263
14.2.1  表示可能失敗的計(jì)算 263
14.2.2  從JSON對象中安全地提取信息 264
14.2.3  組合可能失敗的計(jì)算 266
14.2.4  單子組合 267
14.3  為數(shù)據(jù)庫訪問創(chuàng)建中間件管道 268
14.3.1  組合執(zhí)行安裝/拆卸操作的函數(shù) 268
14.3.2  逃離厄運(yùn)金字塔的秘方 269
14.3.3  捕獲中間件函數(shù)的本質(zhì) 270
14.3.4  實(shí)現(xiàn)中間件的查詢模式 272
14.3.5  添加計(jì)時操作的中間件 274
14.3.6  添加管理數(shù)據(jù)庫事務(wù)的中間件 275
14.4  本章小結(jié) 277
第15章  有狀態(tài)的程序和計(jì)算 279
15.1  管理狀態(tài)的程序 280
15.1.1  將數(shù)據(jù)緩存到內(nèi)存中 281
15.1.2  重構(gòu)以實(shí)現(xiàn)可測試性和錯誤處理 283
15.1.3  有狀態(tài)的計(jì)算 285
15.2  一種用于生成隨機(jī)數(shù)據(jù)的語言 285
15.2.1  生成隨機(jī)整數(shù) 286
15.2.2  生成其他基元 287
15.2.3  生成復(fù)雜的結(jié)構(gòu) 288
15.3  有狀態(tài)計(jì)算的通用模式 290
15.4  本章小結(jié) 293
第16章  使用異步計(jì)算 295
16.1  異步計(jì)算 295
16.1.1  對異步的需求 296
16.1.2  用Task表示異步操作 297
16.1.3  一個Task即為一個將來值的容器 298
16.1.4  處理失敗 300
16.1.5  一個用于貨幣轉(zhuǎn)換的HTTP API 302
16.1.6  如果失敗,請?jiān)僭噹状?303
16.1.7  并行運(yùn)行異步操作 304
16.2  異步流 306
16.2.1  以異步流的方式讀取文件 307
16.2.2  以函數(shù)方式使用異步流 308
16.2.3  從多個流中消費(fèi)數(shù)據(jù) 309
16.2.4  使用異步流進(jìn)行聚合和排序 309
16.3  本章小結(jié) 310
第17章  遍歷和堆疊的單子 311
17.1  遍歷:處理高級值列表 311
17.1.1  使用單子的Traverse驗(yàn)證值列表 313
17.1.2  使用應(yīng)用式Traverse收集驗(yàn)證錯誤 314
17.1.3  將多個驗(yàn)證器應(yīng)用于單個值 316
17.1.4  組合使用Traverse與Task以等待多個結(jié)果 317
17.1.5  為單值結(jié)構(gòu)定義Traverse 319
17.2  組合異步和驗(yàn)證(或其他任何兩個單子效果) 320
17.2.1  堆疊單子的問題 320
17.2.2  減少結(jié)果的數(shù)量 322
17.2.3  具有一個單子堆疊的LINQ表達(dá)式 323
17.3  本章小結(jié) 325
第18章  數(shù)據(jù)流和Reactive Extensions 327
18.1  用IObservable表示數(shù)據(jù)流 328
18.1.1  時間上的一個值序列 328
18.1.2  訂閱IObservable 329
18.2  創(chuàng)建IObservable 331
18.2.1  創(chuàng)建定時器 331
18.2.2  使用Subject告知IObservable應(yīng)何時發(fā)出信號 332
18.2.3  從基于回調(diào)的訂閱中創(chuàng)建IObservable 333
18.2.4  由更簡單的結(jié)構(gòu)創(chuàng)建IObservable 334
18.3  轉(zhuǎn)換和組合數(shù)據(jù)流 335
18.3.1  流的轉(zhuǎn)換 335
18.3.2  組合和劃分流 337
18.3.3  使用IObservable進(jìn)行錯誤處理 339
18.3.4  融會貫通 340
18.4  實(shí)現(xiàn)貫穿多個事件的邏輯 341
18.4.1  檢測按鍵順序 342
18.4.2  對事件源做出反應(yīng) 344
18.4.3  通知賬戶何時透支 346
18.5  應(yīng)該何時使用IObservable 348
18.6  本章小結(jié) 349
第19章  并發(fā)消息傳遞 351
19.1  對共享可變狀態(tài)的需要 351
19.2  理解并發(fā)消息傳遞 353
19.2.1  在C#中實(shí)現(xiàn)代理 355
19.2.2  開始使用代理 356
19.2.3  使用代理處理并發(fā)
請求 357
19.2.4  代理與角色 361
19.3 “函數(shù)式API”與“基于代理的實(shí)現(xiàn)” 362
19.3.1  代理作為實(shí)現(xiàn)細(xì)節(jié) 362
19.3.2  將代理隱藏于常規(guī)API的背后 364
19.4  LOB應(yīng)用程序中的并發(fā)消息傳遞 364
19.4.1  使用代理來同步訪問賬戶數(shù)據(jù) 365
19.4.2  保管賬戶的注冊表 366
19.4.3  代理不是對象 368
19.4.4  融會貫通 370
19.5  本章小結(jié) 371
附錄A  使用C#的舊版本 373
A.1  C#9之前的不可變數(shù)據(jù)對象 373
A.1.1  約定不變性 373
A.1.2  定義復(fù)制方法 374
A.1.3  強(qiáng)制不變性 375
A.1.4  一直不變 376
A.1.5  復(fù)制方法沒有樣板 377
A.1.6  不變性策略的比較 379
A.2  C# 8之前的模式匹配 379
A.2.1  C#對模式匹配的增量支持 380
A.2.2  模式匹配表達(dá)式的自定義解決方案 381
 A.3  再次討論事件溯源的示例 382
A.4  結(jié)論 384
結(jié)束語 385
 
 

本目錄推薦

掃描二維碼
Copyright ? 讀書網(wǎng) ranfinancial.com 2005-2020, All Rights Reserved.
鄂ICP備15019699號 鄂公網(wǎng)安備 42010302001612號