Наследовать класс C из protobuf

#c #inheritance #protocol-buffers

#c #наследование #протокол-буферы

Вопрос:

У меня есть объекты двух типов: TActionInfo и TActionStats. Первый описывает характеристики действия, а второй может «съесть» первый и поддерживать некоторую статистику, основанную на многих действиях.

В моей задаче очень удобно использовать protobuf, потому что эти объекты часто сериализуются и десериализуются.

Кажется хорошей идеей, что TActionStats должен иметь метод, подобный

 bool AddAction(const TActionInfoamp; action);
  

Хорошая ли идея наследовать класс от от Google-protobuf TActionStats class?
Это хорошая идея, чтобы наследовать что-то от protobuf в целом?

Комментарии:

1. Я бы предпочел иметь интернированные переменные-члены класса protobuf вместо их наследования. В (даже более) общем плане, ИМХО, лучше избегать наследования, насколько это возможно. Редко я могу ответить на вопрос «Является ли a?» утвердительно.

2. Иногда дизайн — это дело вкуса. В любом случае, я стараюсь избегать имен классов, таких как ...Info , ...Stats или ...Data . Когда у меня возникает соблазн создать такой класс, я спрашиваю себя: почему реальный класс (скажем TAction ) не содержит его информации и статистики? И если я действительно просто хочу какой-то класс, который просто хранит информацию о другом экземпляре класса, как я могу избежать смешивания уровней абстракции? Послушайте, у вас есть метод AddAction , но на самом деле вы добавляете информацию о действии. Смешанные слои. Разве это не то действие, которое вы хотите добавить сюда? Также рассмотрите это .

Ответ №1:

Нет, вы не должны создавать подклассы типов protobuf.

Подумайте, что произойдет, если вы встроите TActionStats в какой-либо другой тип сообщения:

 message TEnvelope {
  optional TActionStats stats = 0;
  optional string recipient = 1;
}
  

Теперь, когда вы вызываете stats() или mutable_stats() на TEnvelope , вы получите TActionStats , а не ваш подкласс. Если у вас есть куча кода, который ожидает конкретно получения вашего подкласса, вы не сможете вызвать этот код (без создания копии), так что теперь вам придется все переписать.

Вместо этого напишите свои вспомогательные методы как независимые, автономные функции.