1

我有一个简单的程序,它或多或少是一个下载器。它收集一个或多个可配置资源(通过自定义协议),将它们聚合并写入到位。

这个程序看起来很简单,但代码仍然很复杂,并且混合了功能代码和过程代码(来自我的 Java 背景)。我想简化它并转向一个功能齐全的。我正在阅读有关ZIO的信息,整个画面开始在我脑海中形成。

但是,在阅读了入门和概述之后,我仍然有一些问题。

主要流程可能如下:

for {
  config    <- Configuration.parse(args)
  resources <- Downloaders.download(config)
  _         <- Writer.write(resources)
} yield ()
  1. 我猜想包含静态值的配置,但也有一个 http 客户端将被放入 ZIO Environment

  2. 下载器可能是未来构建的效果,并且可能使用 ZIObracket来关闭连接。我想我可以用fold. 但我不知道如何创建和执行许多下载器。
    已编辑 a)既然Future是纯音符,我如何建模一个异步运行的效果(我打算使用 Play Standalone WS Client)?
    编辑 b)我应该为每个目标创建一个下载器,请求将分配给他们。但是我应该如何在我的代码中实现它?我应该创建一个ZIO[Configuration, Throwable, List[Downloader]],然后,然后通过执行所有这些collectAllPar吗?

  3. 我不知道如何在磁盘上写入聚合。

我想用这个项目在内部推广 ZIO。所以我想使用最好的选择和最干净的方法。有人可以给我一些关于如何实现这些效果和构建我的代码的提示吗? 编辑:我应该在 ZIO 组件上构建我的系统还是构建一组功能并将它们包装到 ZIO 效果中?

非常感谢

4

1 回答 1

2

您的问题不是很具体,这意味着不幸的是它不会吸引高质量的答案。

我仍然会尝试回答一些观点。

  • Futures 不纯。如果可能,请避免使用它们。
  • 你的下载器将是一个函数Request => ZIO[R, E, Response]。要使它们并行运行,请使用ZIO.collectAllParZIO.zip。结果是 aZIO[R, E, List[A]]或 a ZIP[R, E, TupleX[...]],您可以将其存储在resources您的理解中。
  • 将数据写入文件可以通过将 Scalanew PrintWriter(new File("hello.txt"))封装到(您猜对了)一个ZIO.bracket.

想了解更多关于 ZIO 程序设计的见解,我建议阅读De Goes 自己的 Beautiful, Simple, Testable Functional Effects for Scala

当然,另外,请参阅ZIO 网站上的文档。

于 2019-12-02T11:59:24.067 回答