Полезность required
была в центре многих дебатов и пламенной войны. Большие лагеря существуют с обеих сторон. Один лагерь любил гарантировать наличие ценности и был готов жить с ее ограничениями, но другой лагерь чувствовал себя required
опасным или бесполезным, так как его нельзя было безопасно добавить или удалить.
Позвольте мне объяснить больше причин, почему required
поля должны использоваться экономно. Если вы уже используете Proto, вы не можете добавить обязательное поле, потому что старое приложение не будет предоставлять это поле, а приложения в целом не справляются со сбоем. Вы можете убедиться, что все старые приложения обновляются в первую очередь, но можно легко ошибиться, и это не поможет, если вы храните прототипы в любом хранилище данных (даже недолговечном, например, memcached). Такая же ситуация применяется при удалении обязательного поля.
Многие обязательные поля были «очевидно» обязательными, пока ... их не было. Допустим, у вас есть id
поле для Get
метода. Это очевидно требуется. Кроме того, позже вам может потребоваться изменить значение id
с int на строку или с int32 на int64. Это требует добавления нового muchBetterId
поля, и теперь у вас осталось старое id
поле, которое должно быть указано, но в конечном итоге полностью игнорируется.
Когда эти две проблемы объединены, количество полезных required
полей становится ограниченным, и лагеря спорят о том, имеет ли оно ценность. Противники required
были не обязательно против идеи, но против ее нынешней формы. Некоторые предлагали разработать более выразительную библиотеку валидации, которая могла бы проверять required
что-то более продвинутое name.length > 10
, в то же время не забывая иметь лучшую модель сбоев.
Proto3 в целом, кажется, предпочитает простоту, а required
удаление проще. Но, возможно, более убедительно, удаление имеет required
смысл для proto3 в сочетании с другими функциями, такими как удаление присутствия полей для примитивов и удаление переопределяющих значений по умолчанию.
Я не разработчик protobuf и никоим образом не авторитетен в этом вопросе, но я все еще надеюсь, что объяснение будет полезным.
StringValue
. Поскольку они являются сообщениями, доступно has_field. Это фактически «бокс», который распространен во многих языках.Вы можете найти объяснение в этом выпуске Github :
источник
oneof { MessageV1, MessageV2, etc. }
.