Недавно я начал интегрировать протокол протокола Google для связи более сложных структур данных в роботизированной сети (например, матрицы, внутренние массивы состояний, информация об устройстве).Спецификация буфера протокола
В то время как я все еще на этапе прототипирования, я начал задаваться вопросом, как конкретно я должен сделать прото-сообщения для долгосрочной поддержки. Я вижу три возможных подхода (очень простые примеры):
1) Средняя специфика: делает сообщения конкретными для каждого типа роботов. Пример:
// RobotA.proto
optional int32 commandID
repeated double positionData //ex: this robot has many joints
// RobotB.proto
optional int32 commandID
optional int32 subCommandID //ex: this robot has subcommands
optional double positionData //ex: this robot has only one joint
2) Низкая специфичность: Сделать сообщения очень общими. Пример:
// GeneralRobotMessage.proto
optional int32 commandID //switch-case which other potential data is needed
optional int32 potentialIntData
repeated double potentialDoubleArray
optional string potentialStringData
optional bool potentialBoolData
3) Высокая специфичность: каждый тип сообщения имеет протобуф. Пример:
// NAKMessage.proto
// ACKMessage.proto
// RobotAGetPosition.proto
Из прошлого опыта, я обычно использую низкую специфичность подход и использовать идентификаторы команд (аку заголовка пакета) для обозначения подхода к синтаксическому анализу сообщения. Но с protobufs, вся концепция предпроектированного .proto, похоже, действует как концепция заголовка.
Есть ли рекомендованный подход к специфичности сообщения? Стандарты кодирования? Практическое правило?
Cheers,
Я на самом деле очень нравится концепция вложенных сообщений, что позволяет для хорошего сочетания специфичности. Да, необязательно - это путь (я полагаю, вы также поддерживаете повторяющиеся поля, поскольку они также являются необязательными). – nnadeau
Обязательные поля 'repeat' очень полезны, просто не забудьте указать' [упакованный = истина] 'для [оптимизации кодирования] (https://developers.google.com/protocol-buffers/docs/proto#specifying-field-rules). – petersv