• training Functional Programming with C# What Is Functional Programming?


    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#

  • 相关阅读:
    【力扣 005】103. 二叉树的锯齿形层序遍历
    Charles抓不到包常见原因排查
    接口签名规则及Java代码demo实现
    Java服务发起HTTPS请求报错:PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException
    springboot项目编译时,使用自定义注解类找不到符号
    Thread的join方法demo
    警告: BASE64Decoder是内部专用 API, 可能会在未来发行版中删除
    IDEA 报错:无效的源发行版 sourceCompatibility
    ThreadLocal本地局部线程demo
    Illegal character ((CTRLCHAR, code 31))问题排查 gzip接口返回 RestTemplate GET POST请求
  • 原文地址:https://www.cnblogs.com/panpanwelcome/p/16328800.html
Copyright © 2020-2023  润新知