我有一个根据 2021 年 10 月的规范描述的 GraphQL API。
我有一个论点size
我想删除。
type Product {
picture(size: Int): Url
}
但是如果没有在 API 规范中通知消费者,我无法立即删除它。我知道工作草案规范允许使用带有参数的@deprecated指令,但2021规范不允许这样做。
如何在不违反2021规范的情况下以知情的方式删除该字段?
我有一个想法来弃用该字段并在其旁边创建一个具有相同名称但不带参数的字段,但不幸的是这不是一个有效的操作。
伟大的解决方案,但我可以告诉你我的团队决定做什么:要么创建“旁边具有相同名称的字段”(+V2
),要么创建一个同级字段一个“更好的名字”,如果你有一个更好的名字。版本和新名称之间的权衡:
V2
,它并不那么“干净”,但很容易看出API使用者应该做什么以及他们应该使用什么。有时,您甚至可以在弃用原始版本之前创建 V2,并且阅读该架构的人可能会看到 V2 并开始为此努力。此外,这些客户已经在查看
picture
,因此他们更有可能在您告诉他们之前看到
pictureV2
。
V*
添加到某些东西时可能会感觉很糟糕,但我发现,从长远来看,大规模*会更容易。* 这里的“大规模”可能意味着一些不同的事情,包括
pictureV2
:您了解您的域名和客户。如果
picture
是正确的词,请使用
pictureV2
。
pictureUrl
:您返回的是一个 URL,它是一个标量。您不会返回“图片”,它可能具有尺寸、altText、标题等。此外,如果您今天使用名称
pictureUrl
(当您仅返回 URL 时),将来如果您这样做了想要引入这些其他属性,您可以使用
picture
(非标量名称)来表示that。我不建议对“可能发生的情况”进行过度设计,但如果您牢记这一原则来命名事物,那么您就可以在将来添加功能,而不必为今天的情况进行过度设计。
image
:该术语传达与“图片”相同的相对含义,但在 API 设计中更常见。
imageUrl
:由于前两个要点,我通常推荐这个。