Как сделать обязательное поле для комиссионных необязательным?

Каков наилучший процесс для создания required поле optional в хозяйстве. Например, у меня есть структура...

struct Message {
    1: required double userID;
    2: required string content;
    ...
} 

... но я хочу сделать content необязательный.

РЕДАКТИРОВАТЬ: Чтобы уточнить, у меня уже есть потребители, которые используют эту структуру, поэтому мне нужно обновить ее, не нарушая этих потребителей. Поэтапное обновление в порядке (т.е. - добавить новый optional обновите нижестоящие клиенты, затем удалите или прекратите использование старых required поле).

2 ответа

Решение

Вы не можете, потому что, как говорится, требуется навсегда. Ниже приводится цитата из "Руководства по пропавшим без вести" Дивакера Гупты. В значительной степени это объясняет, почему следует подумать дважды (по крайней мере) перед использованием required:

Требуется навсегда

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

Боюсь, что единственный вариант - отказаться от всей структуры и создать новую.

Кроме того, существует три степени обязательности, только у двух из них есть ключевые слова:

  • required: должен существовать при чтении, должен быть установлен при записи
  • optional: может быть или не быть установлен, полностью необязательно
  • "по умолчанию": может не существовать при чтении, всегда пишется (если это не null указатель)

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

Как ясно видно, ограничения для required довольно строгие, если мы посмотрим на сайт совместимости вещей. Даже добавление нового required Поле в структуре может привести к несовместимости, например, если новый клиент читает данные со старого сервера (или наоборот), потому что новый required поле не в данных, записанных старым impl, но ожидается новым impl.

Это возможно сделать, если вы контролируете всех читателей и авторов структуры в следующих шагах:

  1. Измените поле в схеме бережливости с обязательного на необязательное. Синхронизируйте эту новую схему во всех системах, которые ссылаются на эту структуру или используют ее. Не прекращайте заполнять это поле. Это безопасное изменение, поскольку поле по-прежнему будет присутствовать всегда.
  2. Только после того, как изменение схемы будет развернуто во всех системах, использующих эту структуру, в некоторых случаях можно перестать записывать это поле. Теперь это безопасно, так как это поле помечено как необязательное в каждой системе, нет «старых читателей», как указано в другом ответе.
Другие вопросы по тегам