幫助中心 | 我的帳號 | 關於我們

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

  • 作者:(美)恩里科·博南諾|責編:王軍|譯者:張駿溫
  • 出版社:清華大學
  • ISBN:9787302633341
  • 出版日期:2023/06/01
  • 裝幀:平裝
  • 頁數:386
人民幣:RMB 128 元      售價:
放入購物車
加入收藏夾

內容大鋼
    函數式編程將改變你思考代碼的方式!利用良好的FP技術,C#開發人員可極大地提升軟體的併發處理、狀態管理和事件處理能力,以及軟體的可維護性。本書介紹了在C#編碼實踐中添加函數式編程的原因、方式和位置。
    《C#函數式編程(第2版)》引導你在C#語言中使用函數式思想來解決實際問題。書中回顧了C#語言中一些能夠用來實現函數式編程的語言特性,並且通過許多實際的例子展示了函數組合、數據驅動編程和不可變數據結構的強大功能。所有代碼示例均可用於.NET6和C#10。
    主要內容:
    高階函數減少了代碼的重複,可用更少的代碼執行更多的操作。
    基於純函數的代碼易於測試和優化。
    編寫高質量的API,準確描述程序的行為。
    編寫函數式風格的Web API。
    與LINQ的單組合。

作者介紹
(美)恩里科·博南諾|責編:王軍|譯者:張駿溫
    恩里科·博南諾(Enrico Buonanno),畢業於哥倫比亞大學電腦科學系,是一名出色的開發人員、架構師和培訓師,擁有15年的工作經驗。

目錄
第Ⅰ部分  入門
  第1章  介紹函數式編程
    1.1  什麼是函數式編程
      1.1.1  函數作為第一類值
      1.1.2  避免狀態突變
      1.1.3  編寫具有強力保證的程序
    1.2  C#語言中的函數式編程
      1.2.1  LINQ的函數式性質
      1.2.2  函數式編碼的簡短語法
      1.2.3  元組的語言支持
      1.2.4  模式匹配和記錄類型
    1.3  將在本書中學到什麼
    1.4  本章小結
  第2章  函數思維
    2.1  什麼是函數
      2.1.1  映射函數
      2.1.2  在C#中表示函數
    2.2  高階函數
      2.2.1  依賴其他函數的函數
      2.2.2  適配器函數
      2.2.3  創建其他函數的函數
    2.3  使用HOF避免重複
    2.4  練習
    2.5  本章小結
  第3章  函數純潔性很重要
    3.1  什麼是函數的純潔性
      3.1.1  純潔性和副作用
      3.1.2  管理副作用的策略
    3.2  通過避免狀態突變實現並行化
      3.2.1  純函數可良好地並行化
      3.2.2  並行化不純函數
      3.2.3  避免狀態突變
    3.3  純潔性和可測性
      3.3.1  隔離I/O影響
      3.3.2  實踐:一個業務驗證場景
      3.3.3  為什麼很難測試不純函數
    3.4  執行I/O的測試代碼
      3.4.1  面向對象的依賴注入
      3.4.2  可測試性沒有那麼多樣板
    3.5  純潔性和計算的發展
    3.6  練習
    3.7  本章小結
第Ⅱ部分  核心技術
  第4章  設計函數簽名和類型
    4.1  設計函數簽名
      4.1.1  使用箭頭符號編寫簽名
      4.1.2  簽名的信息量有多大
    4.2  使用數據對象捕獲數據
      4.2.1  原始類型通常不夠具體
      4.2.2  使用自定義類型約束輸入

      4.2.3  編寫「誠實的」函數
      4.2.4  把值組合到複雜的數據對象中
    4.3  使用Unit為數據缺失建模
      4.3.1  為什麼void不理想
      4.3.2  彌合Action和Func之間的差異
    4.4  本章小結
  第5章  為數據可能缺失建模
    5.1  每天都在使用糟糕的API
    5.2  Option類型的介紹
    5.3  實現Option
      5.3.1  Option的理想實現
      5.3.2  使用Option
      5.3.3  創建None
      5.3.4  創建Some
      5.3.5  優化Option實現
    5.4  Option作為偏函數的自然結果類型
      5.4.1  解析字元串
      5.4.2  在集合中查找數據
      5.4.3  智能構造函數模式
    5.5  處理null
      5.5.1  為什麼null是一個糟糕的想法
      5.5.2  使用Option替代null來獲得健壯性
      5.5.3  不可空的引用類型
      5.5.4  防止NullReference-Exception
    5.6  練習
    5.7  本章小結
  第6章  函數式編程中的模式
    6.1  將函數應用於結構的內部值
      6.1.1  將函數映射到序列上
      6.1.2  將函數映射到Option
      6.1.3  Option是如何提高抽象級別的
      6.1.4  函子
    6.2  使用ForEach執行副作用
    6.3  使用Bind鏈接函數
      6.3.1  將返回Option的函數組合起來
      6.3.2  使用Bind平鋪嵌套列表
      6.3.3  實際上,這被稱為單子
      6.3.4  Return函數
      6.3.5  函子和單子之間的關係
    6.4  使用Where過濾值
    6.5  使用Bind組合Option和IEnumerable
    6.6  在不同抽象級別上編碼
      6.6.1  常規值與高級值
      6.6.2  跨越抽象級別
      6.6.3  重新審視Map與Bind
      6.6.4  在正確的抽象級別上工作
    6.7  練習
    6.8  本章小結
  第7章  使用函數組合設計程序
    7.1  函數組合

      7.1.1  複習函數組合
      7.1.2  方法鏈
      7.1.3  高級界域中的組合
    7.2  從數據流的角度進行思考
      7.2.1  使用LINQ的可組合API
      7.2.2  編寫可組合性更好的函數
    7.3  工作流編程
      7.3.1  關於驗證的一個簡單工作流
      7.3.2  以數據流的思想進行重構
      7.3.3  組合帶來了更大的靈活性
    7.4  介紹函數式領域建模
    7.5  端到端的伺服器端工作流
      7.5.1  表達式與語句
      7.5.2  聲明式與命令式
      7.5.3  函數式分層
    7.6  練習
    7.7  本章小結
第Ⅲ部分  函數式設計
  第8章  函數式錯誤處理
    8.1  表示輸出的更安全方式
      8.1.1  使用Either捕獲錯誤細節
      8.1.2  處理Either的核心函數
      8.1.3  比較Option和Either
    8.2  鏈接操作可能失敗
    8.3  驗證:Either的一個完美用例
      8.3.1  為錯誤選擇合適的表示法
      8.3.2  定義一個基於Either的API
      8.3.3  添加驗證邏輯
    8.4  將輸出提供給客戶端應用程序
      8.4.1  公開一個類似Option的介面
      8.4.2  公開一個類似Either的介面
      8.4.3  返回一個DTO結果
    8.5  Either的變體
      8.5.1  在不同的錯誤表示之間進行更改
      8.5.2  Either的特定版本
      8.5.3  重構Validation和Exceptional
      8.5.4  保留異常
    8.6  練習
    8.7  本章小結
  第9章  用函數構造應用程序
    9.1  偏函數應用:逐個提供參數
      9.1.1  手動啟用偏函數應用
      9.1.2  歸納偏函數應用
      9.1.3  參數的順序問題
    9.2  克服方法解析的怪癖
    9.3  柯里化函數:優化偏函數應用
    9.4  創建一個友好的偏函數應用API
      9.4.1  可文檔化的類型
      9.4.2  特殊化數據訪問函數
    9.5  應用程序的模塊化及組合

      9.5.1  OOP中的模塊化
      9.5.2  FP中的模塊化
      9.5.3  將函數映射到API端點
      9.5.4  比較兩種方法
    9.6  將列表壓縮為單個值
      9.6.1  LINQ的Aggregate方法
      9.6.2  聚合驗證結果
      9.6.3  收集驗證錯誤
    9.7  練習
    9.8  本章小結
  第10章  有效地處理多參函數
    10.1  高級界域中的函數應用程序
      10.1.1  理解應用式
      10.1.2  提升函數
      10.1.3  基於屬性的測試
    10.2  函子、應用式、單子
    10.3  單子定律
      10.3.1  右恆等元
      10.3.2  左恆等元
      10.3.3  結合律
      10.3.4  對多參函數使用Bind
    10.4  通過對任何單子使用LINQ來提高可讀性
      10.4.1  對任意函子使用LINQ
      10.4.2  對任意單子使用LINQ
      10.4.3  let、where及其他LINQ子句
    10.5  何時使用Bind或Apply
      10.5.1  具有智能構造函數的驗證
      10.5.2  使用應用式流收集錯誤
      10.5.3  使用單子流快速失敗
    10.6  練習
    10.7  本章小結
  第11章  表示狀態和變化
    11.1  狀態突變的陷阱
    11.2  理解狀態、標識及變化
      11.2.1  有些事物永遠不變
      11.2.2  表示非突變的變化
    11.3  使用記錄捕獲域實體的狀態
      11.3.1  對記錄初始化的細粒度控制
      11.3.2  所有這些都是不可變的
    11.4  數據與邏輯分離
    11.5  本章小結
  第12章  函數式數據結構簡介
    12.1  經典的函數鏈表
      12.1.1  常見的列表操作
      12.1.2  修改不可變列表
      12.1.3  解構任何IEnumerable
    12.2  二叉樹
      12.2.1  常見的樹操作
      12.2.2  結構共享
    12.3  結論

    12.4  練習
    12.5  本章小結
  第13章  事件溯源:持久化的函數式方法
    13.1  關於數據存儲的函數式思考
      13.1.1  為什麼數據存儲只能追加
      13.1.2  放鬆,並忘卻存儲狀態
    13.2  事件溯源的基礎知識
      13.2.1  表示事件
      13.2.2  持久化事件
      13.2.3  表示狀態
      13.2.4  表示狀態轉換
      13.2.5  從過去的事件中重建當前狀態
    13.3  事件溯源系統的架構
      13.3.1  處理命令
      13.3.2  處理事件
      13.3.3  添加驗證
      13.3.4  創建事件數據的視圖
    13.4  比較不同的不可變存儲方法
      13.4.1  Datomic與EventStore
      13.4.2  領域是否受事件驅動
    13.5  本章小結
第Ⅳ部分  高級技術
  第14章  惰性計算、延續以及單子組合之美
    14.1  惰性的優點
      14.1.1  用於處理Option的惰性API
      14.1.2  組合惰性計算
    14.2  使用Try進行異常處理
      14.2.1  表示可能失敗的計算
      14.2.2  從JSON對象中安全地提取信息
      14.2.3  組合可能失敗的計算
      14.2.4  單子組合
    14.3  為資料庫訪問創建中間件管道
      14.3.1  組合執行安裝/拆卸操作的函數
      14.3.2  逃離厄運金字塔的秘方
      14.3.3  捕獲中間件函數的本質
      14.3.4  實現中間件的查詢模式
      14.3.5  添加計時操作的中間件
      14.3.6  添加管理資料庫事務的中間件
    14.4  本章小結
  第15章  有狀態的程序和計算
    15.1  管理狀態的程序
      15.1.1  將數據緩存到內存中
      15.1.2  重構以實現可測試性和錯誤處理
      15.1.3  有狀態的計算
    15.2  一種用於生成隨機數據的語言
      15.2.1  生成隨機整數
      15.2.2  生成其他基元
      15.2.3  生成複雜的結構
    15.3  有狀態計算的通用模式
    15.4  本章小結

  第16章  使用非同步計算
    16.1  非同步計算
      16.1.1  對非同步的需求
      16.1.2  用Task表示非同步操作
      16.1.3  一個Task即為一個將來值的容器
      16.1.4  處理失敗
      16.1.5  一個用於貨幣轉換的HTTPAPI
      16.1.6  如果失敗,請再試幾次
      16.1.7  並行運行非同步操作
    16.2  非同步流
      16.2.1  以非同步流的方式讀取文件
      16.2.2  以函數方式使用非同步流
      16.2.3  從多個流中消費數據
      16.2.4  使用非同步流進行聚合和排序
    16.3  本章小結
  第17章  遍歷和堆疊的單子
    17.1  遍歷:處理高級值列表
      17.1.1  使用單子的Traverse驗證值列表
      17.1.2  使用應用式Traverse收集驗證錯誤
      17.1.3  將多個驗證器應用於單個值
      17.1.4  組合使用Traverse與Task以等待多個結果
      17.1.5  為單值結構定義Traverse
    17.2  組合非同步和驗證(或其他任何兩個單子效果)
      17.2.1  堆疊單子的問題
      17.2.2  減少結果的數量
      17.2.3  具有一個單子堆疊的LINQ表達式
    17.3  本章小結
  第18章  數據流和ReactiveExtensions
    18.1  用IObservable表示數據流
      18.1.1  時間上的一個值序列
      18.1.2  訂閱IObservable
    18.2  創建IObservable
      18.2.1  創建定時器
      18.2.2  使用Subject告知IObservable應何時發出信號
      18.2.3  從基於回調的訂閱中創建IObservable
      18.2.4  由更簡單的結構創建IObservable
    18.3  轉換和組合數據流
      18.3.1  流的轉換
      18.3.2  組合和劃分流
      18.3.3  使用IObservable進行錯誤處理
      18.3.4  融會貫通
    18.4  實現貫穿多個事件的邏輯
      18.4.1  檢測按鍵順序
      18.4.2  對事件源做出反應
      18.4.3  通知賬戶何時透支
    18.5  應該何時使用IObservable
    18.6  本章小結
  第19章  併發消息傳遞
    19.1  對共享可變狀態的需要
    19.2  理解併發消息傳遞

      19.2.1  在C#中實現代理
      19.2.2  開始使用代理
      19.2.3  使用代理處理併發請求
      19.2.4  代理與角色
    19.3  「函數式API」與「基於代理的實現」
      19.3.1  代理作為實現細節
      19.3.2  將代理隱藏於常規API的背後
    19.4  LOB應用程序中的併發消息傳遞
      19.4.1  使用代理來同步訪問賬戶數據
      19.4.2  保管賬戶的註冊表
      19.4.3  代理不是對象
      19.4.4  融會貫通
    19.5  本章小結
附錄A  使用C#的舊版本
  A.1  C#9之前的不可變數據對象
    A.1.1  約定不變性
    A.1.2  定義複製方法
    A.1.3  強制不變性
    A.1.4  一直不變
    A.1.5  複製方法沒有樣板
    A.1.6  不變性策略的比較
  A.2  C#8之前的模式匹配
    A.2.1  C#對模式匹配的增量支持
    A.2.2  模式匹配表達式的自定義解決方案
  A.3  再次討論事件溯源的示例
  A.4  結論
結束語

  • 商品搜索:
  • | 高級搜索
首頁新手上路客服中心關於我們聯絡我們Top↑
Copyrightc 1999~2008 美商天龍國際圖書股份有限公司 臺灣分公司. All rights reserved.
營業地址:臺北市中正區重慶南路一段103號1F 105號1F-2F
讀者服務部電話:02-2381-2033 02-2381-1863 時間:週一-週五 10:00-17:00
 服務信箱:bookuu@69book.com 客戶、意見信箱:cs@69book.com
ICP證:浙B2-20060032