Scala中的Futures真的有用吗?
我正在阅读这篇博客
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这篇博文更令人困惑而不是有用. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |