加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

Scala中的Futures真的有用吗?

发布时间:2020-12-16 09:25:13 所属栏目:安全 来源:网络整理
导读:我正在阅读这篇博客 post,声称期货不是“功能性的”,因为它们只是副作用计算的包装.例如,它们包含RPC调用,HTTP请求等.它是否正确? 博客文章给出了以下示例: def twoUsersFeed(a: UserHandle,b: UserHandle) (implicit ec: ExecutionContext): Future[Html]
我正在阅读这篇博客 post,声称期货不是“功能性的”,因为它们只是副作用计算的包装.例如,它们包含RPC调用,HTTP请求等.它是否正确?

博客文章给出了以下示例:

def twoUsersFeed(a: UserHandle,b: UserHandle)
                (implicit ec: ExecutionContext): Future[Html] =
  for {
    feedA <- usersFeed(a)
    feedB <- usersFeed(b)
  } yield feedA ++ feedB

你失去了理想的财产:一致的结果(参考透明度).你也失去了尽可能少的请求的财产.很难使用多值请求并具有可组合代码.

我恐怕不明白.你能解释一下我们在这种情况下如何失去一致的结果吗?

解决方法

这篇博客文章没有对Future本身及其常用方式(IMO)进行适当的区分.如果您只编写称为纯函数的Futures,您可以使用Future编写纯函数代码;这样的代码在每个远程合理的单词意义上都是引用透明的和“功能性的”.

事实是,如果您使用具有副作用的方法,Futures会对您产生有限的副作用控制.如果您创建Futurewrapping webClient.get,则创建Future将发送HTTP调用.但这不是关于Future的事实,这是关于webClient.get的事实!

这篇博客文章中有一些道理.通过例如完全分离表达您的计算与执行它免费monad,可以产生更高效,更可测试的代码.例如.你可以创建一个“查询语言”,你可以在其中表达“获取A和B的所有共同朋友的个人资料照片”而不实际运行它的操作.这样可以更容易地测试您的逻辑是否正确(因为它很容易使得例如可以“运行”相同查询的测试实现 – 甚至只是直接检查“查询对象”),并且,我认为博客文章试图建议,意味着你可以,例如组合多个请求以获取相同的配置文件. (这甚至不是一个纯粹的功能编程问题 – 一些OO书籍有一个“命令模式”的想法 – 尽管IME函数编程工具如for / yield语法使得以这种方式工作更容易).然而,如果您拥有的是fetchProfile方法,则在运行时立即触发HTTP请求,然后如果您的代码逻辑请求两次相同的配置文件,则无法避免两次获取相同的配置文件.

但这并不是关于Future本身,IMO这篇博文更令人困惑而不是有用.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读