Functional Programming with C# | Pluralsight
函数式编程:
1. 易于预测
2. 容易扩展
3. 容易测试
面向对象 vs 函数编程
course推荐: Cory House on plualsight
面向对象:管理 变化的state =》method 依赖&修改 class类型的data
函数编程: 完全避免 state =》仅依赖于 输入, 不修改输入的值和 共享的state =》更加可预测,容易维护,容易测试(仅依赖于 输入,不依赖其他)
什么是 函数编程?
强调: 定义 根据 输入,输出 定义函数; 而非 如何改变state
区分:数据’、行为
=》更多的 static methods,而非 instance methods
(因为 不在 隐式依赖 当前对象的state)
1. taming side effects 控制副作用, 而非 消除 副作用
method:
输入、输出
影响范围(隐含) =》难以测试
单一功能的函数: Haskell
=》函数 无副作用,除非 极个别情况
=》复杂系统,容易预测(behave the same way,与 其他的state无关)
=》更容易 并行 & 异步执行
vs
impure:c#
=》引用透明,不会导致明显的副作用
=》不会主动阻止改变 system state,但是可以通过设计改善: 强制 immutability(非 默认)
基于表达式:expression-based
=》everything produces some result =》computer result
=》更少的语句
=》more natually tastable: 基于输入的输出=》无需 借助mocking, 无需为了测试 派生其他的类型
=》naturally composable: return a value ,通过变量,易于 和其他的expression、statement 组合
vs
基于语句:statement-based: c#
=》statements to cause side effects
=》未赋值的变量 & 同一变量多个地方赋值不同
=》减少 额外的变量
Treat functions as Data:最重要
=》higher-order functions
=》不同程度的抽象
=》无需 通过 复杂的继承结构,而是根据 函数签名 替换, 去 组合不同的功能
=》linq 基于functional 原则
课程推荐: Deborah Kurata's Practical LINQ on Pluralsigh
可以高性能 的 从不同数据源 查找数据
泛型:安全的操作 弱类型的排序,且提供序列的完全可视
扩展方法:高阶函数。添加IEnumeralble的 排序、筛选、类型转换……功能
委托、lambda表达式:定义扩展的针对序列的操作方法变得容易
问题:
while语句中 mutable state: ix & myList & mylist.Sort() 中Sort的副作用
=> myList 变化 可能牵连 系统范围,如果 myList 在外部可见
语法糖 =》本质:泛型 & 扩展方法 & 委托
method 语法: 更抽象
组成 higher-oorder functions的一个链条,操作每一个IEnumerable的实例
=》myList 未改变。未改变 存在的lmyList,而是创建了一个新的list(每个值根据lamb表达式 被map到新的实例 ). =》引用安全的 =》compose的方式 链接(每次操作返回一个新的序列,然后返回给 链条中的下一步)
=》查询隔离的架构模式
linq固有的不可变性 =》compose 后的结果 可预测,且无副作用
review
vs
Treat functions through delegation:c#