c#函数式编程 Functional Programming in C# [10]

2.4 计算的纯度和进化

  我希望本章使函数纯度的概念不再那么神秘,并说明了为什么扩展纯代码的足迹是一个有价值的目标,提高代码的可维护性和可测试性。
  软件和硬件的进化也对我们如何看待纯度产生重要影响。我们的系统越来越分散,因此我们程序的 I/O 部分越来越重要。随着微服务架构成为主流,我们的程序不再进行计算,而更多地将计算委托给其他服务,它们通过 I/O 与之通信。
  I/O 要求的增加意味着纯度更难实现。但这也意味着对异步 I/O 的需求增加,正如您所见,纯度可以帮助您处理并发场景,其中包括处理异步消息。
  硬件的发展也很重要:CPU的速度不像以前那样快了,所以硬件制造商正朝着结合多处理器的方向发展。并行化正在成为提高计算速度的主要途径,因此需要编写可以很好并行化的程序。 事实上,向多核机器的发展是我们经常看到的对FP重新产生兴趣的主要原因之一。

练习

  1. 编写一个控制台应用程序来计算用户的身体质量指数 (BMI):
    a. 提示用户输入他们的身高(米)和体重(公斤)。
    b. 计算BMI为体重/身高
    c. 输出消息:体重不足 (BMI < 18.5)、超重 (BMI >= 25) 或健康。
    d. 构造您的代码,以便将纯部分和不纯部分分开。
  2. 单元测试纯部分。
  3. 使用基于函数的方法对整个工作流进行单元测试,以抽象出对控制台的读取和写入。

  由于本章的大部分内容都致力于在实践中了解纯度的概念,因此我鼓励您研究将我们讨论的技术应用于您目前正在编写的一些代码:您可以在获得报酬的同时学习新东西!

  1. 根据列表(搜索 foreach)找到您正在执行一些重要操作的地方。看操作是否可以并行化;如果没有,看看是否可以提取操作的纯部分,并将该部分并行化。
  2. 在您的代码库中搜索 DateTime.Now 或 DateTime.UtcNow 的使用。如果该区域未在测试中,请使用本章中描述的基于接口的方法和基于函数的方法对其进行测试。
  3. 寻找代码的其他区域,在这些区域中,您依赖于不具有传递依赖关系的不纯依赖关系——明显的候选对象是框架中的不纯静态类,例如 ConfigurationManager 或 Environment。尝试应用基于函数的测试模式。

总结

  • 与数学函数相比,编程函数更难推理,因为它们的输出可能取决于输入参数以外的变量。
  • 副作用包括状态突变、抛出异常和 I/O。
  • 没有副作用的函数称为纯函数。这些函数除了返回一个仅依赖于它们的输入参数的值之外什么都不做。
  • 纯函数比非纯函数更容易优化和测试,并且它们在并发场景中可以更可靠地使用,因此您应该尽可能选择纯函数。
  • 与其他副作用不同,I/O 无法避免,但您仍然可以隔离执行 I/O 的应用程序部分,以减少不纯代码的占用空间。
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值