gpt4 book ai didi

graphql - 为什么 GraphQL 可变变异语法如此冗余?

转载 作者:行者123 更新时间:2023-12-04 15:39:38 25 4
gpt4 key购买 nike

GraphQL 查询/突变非常干净:它们只需要它们实际需要的东西,没有别的。或者至少是基本的。

但是,如果您将变量与任何一个一起使用,那么您的语法不可避免地会有冗余:

query HeroNameAndFriends($episode: Episode) {
hero(episode: $episode) {
name
friends {
name
}
}
}

请注意 $episode: Episodeepisode: $episode .问题是每个 GraphQL 突变都需要相同的冗余:如果您使用变量,则每个参数都必须定义两次(如果您进行程序化查询,您无疑正在使用变量)。

我的问题是,为什么?让每个使用 GraphQL 的人都不得不再次重复他们的论点似乎没有必要。

为什么不直接使用语法:
query HeroNameAndFriends() {
hero($episode: Episode) {
name
friends {
name
}
}
}

或者如果您确实需要允许不同的变量名称,请允许可选的第三方:
query HeroNameAndFriends() {
hero(episode: Episode : $episode) {
name
friends {
name
}
}
}

需要明确的是,我知道使用变量的查询与非变量查询不同,但我要问的是,为什么要为那些迫使每个人重复自己的查询选择一种语法?

看起来就是这样......不是干的!当然,我错过了为什么需要重复的一个重要原因?

最佳答案

为什么我必须在 JavaScript 函数中列出我的参数?功能不是很明显吗

const getFullName = () => firstname + ' ' + lastname;

接受两个参数,一个名为 firstname一个叫 lastname ?嗯,我认为这里很容易看透,但有更复杂的情况,它不是那么明显。现在上面的例子看起来很奇怪,但是有一些函数式编程语言中的表达式像 (_ + 2)_.concat(_)是有效的函数表达式。你可以创建一些非常讨厌的代码(看着你,指向免费的 Haskell)。但是很多语言似乎都认为明确声明一段代码的输入是个好主意。

回到 GraphQL:让我们看看变量的一些更复杂的用法,因为变量实际上是一个完整的变量实现。您可以对它们做更多的事情,然后将它们应用于参数:
query NestedInput($name: String) {
user(where: { name: { contains: $name } }) { ... }
}

query WithDirective($long: Boolean) {
users {
name
bio @include(if: $long)
friends(showAll: $long) {
name
}
}
}

所以变量可以用在很多地方,也可以多次使用。并且很少 GraphQL 查询变得非常大。这是否适用于您提出的第二种语法?是的,但我认为可读性会受到影响。 DRY 不是要减少您必须键入的字符数量,而是要减少错误。但是经常对事物进行明确也可以减少错误(例如,如今的许多类型系统都是关于明确输入参数及其类型的)。

所以我想这只是 GraphQL 的开发人员做出的决定的交易,他们选择了显式版本。不要忘记上下文:GraphQL 是在 Facebook 创建的,它是世界上最大的 Web 应用程序之一。

由于明确性的好处并不明显,这里是一个列出了一些的编辑:
  • 该声明允许开发人员快速了解查询中的所有变量及其相应类型。
  • GraphQL 开发人员工具不必昂贵地从模式中推断变量的类型,而是可以简单地查找输入类型。
  • 错误消息变得更容易理解,想象一下参数 showAll不接受 bool 值而是整数。有了声明我们可以说mismatching types for variable $long. $long is Boolean but expected Int .如果没有声明,我们将不得不说 $long is sometimes used as Boolean, sometimes as Int .如果我们将其用作三种不同的类型会怎样?
  • 仅通过 GraphQL 静态代码分析可以检测到中断查询:再次假设我们更改了 showAll 的类型至 Int .在这种情况下,查询可能被检测为错误,而如果没有显式类型声明,查询可能会在运行时中断。
  • 关于graphql - 为什么 GraphQL 可变变异语法如此冗余?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58312750/

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