Подтвердить что ты не робот

Как спроектировать для будущего дополнительного значения enum в буферах протокола?

Одной из привлекательных особенностей буферов протокола является то, что она позволяет расширять определения сообщений без нарушения кода, использующего более раннее определение. В случае перечисления в соответствии с документацией:

поле с типом перечисления может иметь только один из заданного набора констант в качестве его значения (если вы попытаетесь предоставить другое значение, синтаксический анализатор будет рассматривать его как неизвестное поле)

поэтому, если вы расширяете перечисление и используете новое значение, тогда поле с этим типом в старом коде будет undefined или имеет значение по умолчанию, если оно есть.

Какова хорошая стратегия для решения этой проблемы, зная, что в будущем в enum могут добавляться дополнительные значения?

Один из способов, который приходит на ум, - определить член "undefined" перечисления и сделать это по умолчанию, тогда старый код будет знать, что ему было отправлено то, что он не может интерпретировать. Разве это разумно, есть ли лучшие способы справиться с этой ситуацией?

4b9b3361

Ответ 1

Да, лучший подход - сделать первое значение в перечислении чем-то вроде UNKNOWN = 0. Тогда старые программы, читающие protobuf с значением перечисления, которое они не распознают, будут видеть его как UNKNOWN и, надеюсь, они смогут обработать это разумно, например, пропуская этот элемент.

Если вы хотите сделать это, вы также захотите сделать перечисление optional not required.

required, как правило, означает "Я предпочел бы, чтобы программа просто прерывалась, чем обрабатывать то, что она не понимает".

Обратите внимание, что это должно быть первое значение, объявленное в источнике прототипа - просто нулевое значение не делает его значением по умолчанию.