我有一个按照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,它是一个标量。您返回的不是“图片”,它可能有尺寸、替代文本、标题等。此外,如果您pictureUrl
今天使用名称(当您只返回 URL 时),将来,如果您确实想引入这些其他属性,您可以使用picture
(非标量名称)。我不建议对“可能发生”的事情进行过度设计,但如果您根据这一原则命名,您将来就可以添加功能,而不必为今天的可能而过度设计。image
:该术语传达与“图片”相同的相对含义,但在 API 设计中更为常见。imageUrl
:根据前面两点,我通常会推荐这个。