L'utilità di required
è stata al centro di molti dibattiti e guerre di fiamma. Grandi campi sono esistiti da entrambe le parti. A un campo piaceva garantire la presenza di un valore ed era disposto a convivere con i suoi limiti, ma l'altro campo si sentiva required
pericoloso o inutile in quanto non poteva essere aggiunto o rimosso in modo sicuro.
Consentitemi di spiegare meglio il ragionamento sul perché i required
campi dovrebbero essere usati con parsimonia. Se stai già utilizzando un proto, non puoi aggiungere un campo obbligatorio perché la vecchia applicazione non fornirà quel campo e le applicazioni in generale non gestiscono bene l'errore. Puoi assicurarti che tutte le vecchie applicazioni vengano aggiornate per prime, ma può essere facile commettere un errore e non aiuta se stai memorizzando i protos in qualsiasi archivio dati (anche di breve durata, come memcached). Lo stesso tipo di situazione si applica quando si rimuove un campo obbligatorio.
Molti campi obbligatori erano "ovviamente" obbligatori fino a quando ... non lo erano. Diciamo che hai un id
campo per un Get
metodo. Questo è ovviamente necessario. Tranne, in seguito potrebbe essere necessario modificare id
da int a string o da int32 a int64. Ciò richiede l'aggiunta di un nuovo muchBetterId
campo e ora ti rimane il vecchio id
campo che deve essere specificato, ma alla fine viene completamente ignorato.
Quando questi due problemi vengono combinati, il numero di benefici required
campi diventa limitato e i campi discutono se ha ancora valore. Gli avversari di required
non erano necessariamente contrari all'idea, ma alla sua forma attuale. Alcuni hanno suggerito di sviluppare una libreria di convalida più espressiva che potesse verificare required
insieme a qualcosa di più avanzato name.length > 10
, assicurandosi anche di avere un modello di errore migliore.
Proto3 nel complesso sembra favorire la semplicità e required
rimozione è più semplice. Ma forse più convincente, la rimozione del required
significato ha senso per proto3 quando combinato con altre funzionalità, come la rimozione della presenza sul campo per le primitive e la rimozione di valori predefiniti prevalenti.
Non sono uno sviluppatore di protobuf e non sono in alcun modo autorevole sull'argomento, ma spero ancora che la spiegazione sia utile.