A utilidade de required
tem estado no centro de muitos debates e guerras de chamas. Grandes campos existem em ambos os lados. Um campo gostava de garantir a presença de um valor e estava disposto a viver com suas limitações, mas o outro campo parecia required
perigoso ou inútil, pois não pode ser adicionado nem removido com segurança.
Deixe-me explicar mais sobre o motivo pelo qual os required
campos devem ser usados com moderação. Se você já estiver usando um proto, não poderá adicionar um campo obrigatório, pois os aplicativos antigos não fornecerão esse campo e os aplicativos em geral não lidam bem com a falha. Você pode garantir que todos os aplicativos antigos sejam atualizados primeiro, mas pode ser fácil cometer um erro e não ajuda se você estiver armazenando os protos em qualquer armazenamento de dados (mesmo de curta duração, como o cache de memórias). O mesmo tipo de situação se aplica ao remover um campo obrigatório.
Muitos campos obrigatórios eram "obviamente" necessários até ... não eram. Digamos que você tenha um id
campo para um Get
método. Isso é obviamente necessário. Exceto, mais tarde, pode ser necessário alterar id
de int para string ou int32 para int64. Isso requer a adição de um novo muchBetterId
campo e agora você fica com o id
campo antigo que deve ser especificado, mas eventualmente é completamente ignorado.
Quando esses dois problemas são combinados, o número de required
campos benéficos se torna limitado e os campos discutem se ele ainda tem valor. Os oponentes de required
não eram necessariamente contra a idéia, mas sua forma atual. Alguns sugeriram o desenvolvimento de uma biblioteca de validação mais expressiva que pudesse required
acompanhar algo mais avançado name.length > 10
, além de garantir um melhor modelo de falha.
No geral, o Proto3 parece favorecer a simplicidade e a required
remoção é mais simples. Mas talvez mais convincente, a remoção required
fizesse sentido para o proto3 quando combinada com outros recursos, como a remoção da presença de campo para primitivas e a remoção de valores padrão superiores.
Não sou desenvolvedor de protobuf e não sou autoritário sobre o assunto, mas ainda espero que a explicação seja útil.