gpt4 book ai didi

scala - 如何在 Scala 中将流畅的界面与函数式风格相结合?

转载 作者:行者123 更新时间:2023-12-04 11:13:22 25 4
gpt4 key购买 nike

我一直在阅读 Java 中关于 OO 'fluent interface' 方法的信息。 , JavaScriptScala我喜欢它的外观,但一直在努力寻找如何将它与 Scala 中更基于类型/函数式的方法相协调。

举一个非常具体的例子来说明我的意思:我编写了一个可以像这样调用的 API 客户端:

val response = MyTargetApi.get("orders", 24)

来自 get() 的返回值是 Tuple3类型叫 RestfulResponse ,如我的 package object 中所定义:
// 1. Return code
// 2. Response headers
// 2. Response body (Option)
type RestfulResponse = (Int, List[String], Option[String])

这很好用——我真的不想牺牲元组返回值的功能简单性——但我想用各种“流畅”的方法调用来扩展库,也许是这样的:
val response = MyTargetApi.get("customers", 55).throwIfError()
// Or perhaps:
MyTargetApi.get("orders", 24).debugPrint(verbose=true)

如何结合 get()的功能简单性返回一个类型化的元组(或类似的),能够为我的 API 添加更多“流畅”的功能?

最佳答案

看来您正在处理休息风格通信的客户端 API。您的 get方法似乎是触发实际请求/响应周期的原因。看起来你必须处理这个:

  • 传输的属性(如凭据、调试级别、错误处理)
  • 为输入提供数据(您的 ID 和记录类型(订单或客户)
  • 用结果做点什么

  • 我觉得对于transport的属性,可以在 MyTargetApi的构造函数里面放一些对象,但您也可以创建一个查询对象来存储单个查询的查询对象,并且可以使用 query() 以流畅的方式进行设置。方法:
    MyTargetApi.query().debugPrint(verbose=true).throwIfError()

    这将返回一些有状态的 Query存储日志级别、错误处理值的对象。为了为输入提供数据,您还可以使用查询对象来设置这些值,而不是返回您的响应,而是返回 QueryResult :
    class Query {
    def debugPrint(verbose: Boolean): this.type = { _verbose = verbose; this }
    def throwIfError(): this.type = { ... }
    def get(tpe: String, id: Int): QueryResult[RestfulResponse] =
    new QueryResult[RestfulResponse] {
    def run(): RestfulResponse = // code to make rest call goes here
    }
    }

    trait QueryResult[A] { self =>
    def map[B](f: (A) => B): QueryResult[B] = new QueryResult[B] {
    def run(): B = f(self.run())
    }
    def flatMap[B](f: (A) => QueryResult[B]) = new QueryResult[B] {
    def run(): B = f(self.run()).run()
    }
    def run(): A
    }

    然后最终得到结果你打电话 run .所以在一天结束时,你可以这样称呼它:
    MyTargetApi.query()
    .debugPrint(verbose=true)
    .throwIfError()
    .get("customers", 22)
    .map(resp => resp._3.map(_.length)) // body
    .run()

    这应该是一个冗长的请求,它会在问题上出错,检索 ID 为 22 的客户,保留正文并将其长度设为 Option[Int] .

    这个想法是你可以使用 map定义对您还没有的结果的计算。如果我们添加 flatMap到它,那么您还可以结合来自两个不同查询的两个计算。

    关于scala - 如何在 Scala 中将流畅的界面与函数式风格相结合?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8681498/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com