我有一个简单的程序,或多或少是一个下载器。它收集一个或多个可配置资源(通过自定义协议(,聚合并将它们写入到位。
这个程序看起来很简单,但代码仍然很复杂,并且混合了功能和过程代码(来自我的 Java 背景(。我想简化它并转向功能齐全的它。我正在阅读有关ZIO的信息,整个画面开始在我的脑海中建立。
但是,在阅读了入门和概述之后,我仍然有一些问题。
主流可能是这样的:
for {
config <- Configuration.parse(args)
resources <- Downloaders.download(config)
_ <- Writer.write(resources)
} yield ()
我想包含静态值但也有一个http客户端的配置将被放入ZIO
Environment
。下载器可能是从未来构建的效果,可以使用 ZIO
bracket
关闭连接。我想我可以用fold
汇总结果.但是我不知道如何创建和执行许多下载器。
编辑 a(由于Future
是纯音符的,如何对异步运行的效果进行建模(我计划使用播放独立 WS 客户端(?
编辑 b(我应该为每个目标创建一个下载器,请求将分配给它们。但是我应该如何在我的代码中实现它呢?我应该创建一个ZIO[Configuration, Throwable, List[Downloader]]
然后通过collectAllPar
执行所有这些吗?我不知道如何在磁盘上编写聚合。
我想用这个项目在内部推广ZIO。所以我想使用最好的选择和最干净的方法。有人可以给我一些关于如何实现这些效果和构建我的代码的提示吗?编辑:我应该在 ZIO 组件上构建我的系统,还是构建一组函数并将它们包装到 ZIO 效果中?
多谢
你的问题不是很具体,这意味着不幸的是它不会吸引高质量的答案。
我仍然会尝试回答其中的一些问题。
Future
不是纯粹的。如果可能,请避免使用它们。- 您的 donwloader 将是一个功能
Request => ZIO[R, E, Response]
.要使它们并行运行,请使用ZIO.collectAllPar
或ZIO.zip
。结果是一个ZIO[R, E, List[A]]
或ZIP[R, E, TupleX[...]]
,您可以将其存储在resources
中以供理解。 - 将数据写入文件可以在将 Scala 的
new PrintWriter(new File("hello.txt"))
包装成一个ZIO.bracket
来完成。
有关使用ZIO进行程序设计的更多见解,我建议阅读De Gos本人的Beautiful,Simple,Testable Functional Effects for Scala。
当然,请参考ZIO网站上的文档。