Die Nützlichkeit von required
stand im Mittelpunkt vieler Debatten und Flammenkriege. Auf beiden Seiten gab es große Lager. Ein Lager garantierte gern, dass ein Wert vorhanden war und bereit war, mit seinen Grenzen zu leben, aber das andere Lager fühlte sich required
gefährlich oder nicht hilfreich an, da es nicht sicher hinzugefügt oder entfernt werden kann.
Lassen Sie mich näher erläutern, warum required
Felder sparsam verwendet werden sollten. Wenn Sie bereits ein Proto verwenden, können Sie kein erforderliches Feld hinzufügen, da alte Anwendungen dieses Feld nicht bereitstellen und Anwendungen im Allgemeinen den Fehler nicht gut behandeln. Sie können sicherstellen, dass alle alten Anwendungen zuerst aktualisiert werden. Es kann jedoch leicht zu Fehlern kommen, und es hilft nichts, wenn Sie die Protos in einem Datenspeicher speichern (auch nur von kurzer Dauer, z. B. zwischengespeichert). Die gleiche Situation gilt beim Entfernen eines erforderlichen Feldes.
Viele Pflichtfelder waren "offensichtlich" erforderlich, bis ... sie es nicht waren. Angenommen, Sie haben ein id
Feld für eine Get
Methode. Das ist natürlich erforderlich. Außer, dass Sie später möglicherweise id
von int in string oder int32 in int64 ändern müssen. Das erfordert das Hinzufügen eines neuen muchBetterId
Feldes, und jetzt mit dem alten bleiben id
Feld, muss angegeben werden, aber schließlich wird völlig ignoriert.
Wenn diese beiden Probleme kombiniert werden, wird die Anzahl der nützlichen required
Felder begrenzt und die Lager streiten darüber, ob sie noch Wert haben. Die Gegner von required
waren nicht unbedingt gegen die Idee, sondern gegen ihre aktuelle Form. Einige schlugen vor, eine aussagekräftigere Validierungsbibliothek zu entwickeln, die required
zusammen mit fortgeschritteneren Methoden überprüft werden kann name.length > 10
und gleichzeitig ein besseres Fehlermodell gewährleistet.
Insgesamt scheint Proto3 die Einfachheit zu bevorzugen, und das required
Entfernen ist einfacher. Aber vielleicht überzeugender war das Entfernen required
für proto3 in Kombination mit anderen Funktionen wie dem Entfernen der Feldpräsenz für Grundelemente und dem Entfernen überschreibender Standardwerte.
Ich bin kein Protobuf-Entwickler und in keiner Weise maßgeblich für dieses Thema, aber ich hoffe trotzdem, dass die Erklärung nützlich ist.
StringValue
. Da es sich um Nachrichten handelt, ist has_field verfügbar. Dies ist effektiv "Boxen", was in vielen Sprachen üblich ist.Die Erklärung finden Sie in dieser protobuf Github-Ausgabe :
quelle
oneof { MessageV1, MessageV2, etc. }
.