为什么对返回Deferreds的函数使用* Async命名约定?

aar*_*acy 5 kotlin kotlin-coroutines

Intellij进行检查(即检查棉绒),告诉您return的函数Deferred应以结尾Async

在此处输入图片说明

在动态类型的语言中,这样的命名约定对我来说很有意义。但是Kotlin具有如此出色的类型检查器和工具生态系统,那么为什么要依赖该约定呢?

尤其是因为Kotlin协程在其中进行结构化并发,该函数可能还会采用一个CoroutineScope参数,该参数将在调用站点提供相同的视觉提示:

suspend fun doStuff() = coroutineScope {
  doStuffAsync(this /* CoroutineScope */).await()
  //...
}
Run Code Online (Sandbox Code Playgroud)

作为附带说明,我了解检查的消息,即您几乎不希望使用返回a Deferred而不是suspend函数的函数。那不是我的问题。我的问题是假设您知道自己在做什么,并且想要一个Deferred

Mar*_*nik 4

首先,函数几乎不应该返回Deferred来自async块的 a。由调用者将某些工作单元包装到一个中async,同时在前台执行其他工作,然后await在返回之前处理异步结果,并将所有代码包装到coroutineScope.

实例的预期来源Deferred是 Kotlin 协程和第 3 方异步 API 之间的适配层。Async对于此类调用,输入名称确实有意义,甚至某些 Java API 也遵循此约定。例如,您可能有一个

fun fetchOrder(id: String): Deferred<Order>
Run Code Online (Sandbox Code Playgroud)

并将其用作

val orderCancelled = fetchOrder(orderId).isCancelled
Run Code Online (Sandbox Code Playgroud)

此代码是类型安全且类型正确的,不会导致任何编译器错误。看起来它是从远程系统获取订单,然后检查订单状态(是否被取消),但它实际上做的是获取 aDeferred<Order>并检查是否Deferred被取消。由于您的函数名称丢失Async,因此很难发现这种错误。

是的,您也可以请求 IDE 提供返回类型,但您可能需要一段时间才能怀疑发生了什么。