Tenho uma API GraphQL descrita de acordo com a especificação de outubro de 2021 .
Tenho um argumento size
que quero remover.
type Product {
picture(size: Int): Url
}
Mas não posso removê-lo imediatamente sem informar os consumidores na especificação da API. Sei que o rascunho de trabalho da especificação permite usar a diretiva @deprecated com argumentos, mas a especificação de 2021 não permite isso.
Como posso excluir o campo de maneira informada sem violar a especificação de 2021?
Tive a ideia de descontinuar o campo e criar um campo ao lado dele com o mesmo nome, mas sem um argumento, mas infelizmente essa não é uma ação válida.
Não há uma ótima solução aqui, mas posso dizer o que minha equipe decidiu fazer: criar "um campo ao lado com o mesmo nome" (+
V2
) ou criar um campo irmão com um "nome melhor", se você tiver um nome melhor.Compensações entre versões e novos nomes:
V2
, não é tão "limpo", mas é fácil ver o que o consumidor da API deve fazer e o que deve usar. Às vezes, você pode até criar uma V2 antes de descontinuar a original, e alguém lendo o esquema pode ver a V2 e começar a trabalhar para isso. Além disso, esses clientes já estão olhando parapicture
, então é mais provável que vejampictureV2
antes que você diga a eles.Também vale a pena notar que o problema da "limpeza" é uma coisa real, e não é apenas sobre estética. Provavelmente vai parecer ruim na primeira vez que você adicionar
V*
algo, mas descobri que em escala*, é mais fácil a longo prazo.* "em escala" aqui pode significar algumas coisas diferentes, incluindo
Então, se um colega de equipe me mostrasse seu exemplo especificamente e perguntasse o que fazer em seguida, eu daria essas opções, e eles deveriam fazer o que é certo para seu produto e seu cliente.
pictureV2
: Você conhece seu domínio e seu cliente. Sepicture
for a palavra certa, usepictureV2
.pictureUrl
: Você está retornando uma URL, que é um escalar. Você não está retornando uma "imagem", que pode ter dimensões, altText, títulos, etc. Além disso, se você usar o nomepictureUrl
hoje (quando estiver retornando apenas uma URL), no futuro, se você QUISER introduzir essas outras propriedades, você pode usarpicture
(o nome não escalar) para isso . Eu não recomendo engenharia excessiva para o que "pode acontecer", mas se você nomear as coisas com esse princípio em mente, você se deixa aberto para adicionar recursos no futuro sem ter que arquitetar demais para talvez, hoje.image
: Este termo transmite o mesmo significado relativo de "imagem", mas é mais comum em design de API.imageUrl
:A que eu geralmente recomendo, devido aos dois pontos anteriores.