Come rappresentare il messaggio con i sottomessaggi?

0

Sto tentando di implementare un messaggio che contiene sottomessaggi. Il formato sarà simile al seguente.

Message: Field 1, field 2, ..., sub type, buffer

A seconda del sottotipo ci potrebbe essere uno dei vari modi per interpretare il buffer. Alcuni dei messaggi secondari potrebbero avere un aspetto simile al seguente.

Sub type 1: Field 1, field 2, ..., sub sub type

Sub sub type 1: Field 1, field 2, ..., data buffer

Ciò di cui non sono sicuro è come strutturare il mio codice al fine di rappresentare al meglio la struttura esistente. I messaggi secondari non ereditano gli uni dagli altri, quindi non voglio usare l'ereditarietà.

Ciascuno dei campi rappresentati nel messaggio può essere ovunque da 1 a 31 bit di lunghezza. Idealmente mi piacerebbe avere una struct / class con tutti i tipi di dati unsigned int per facilitare l'interazione con i dati e lasciare che i metodi serialize / deserialize gestiscano il packing e lo spacchettamento dei dati prima / dopo l'invio / ricezione del buffer sulla rete .

    
posta janovak 20.03.2017 - 22:20
fonte

1 risposta

2

Puoi strutturare le tue classi di oggetti usando la composizione . Ciò significa riferirsi al tuo oggetto messaggio a un altro oggetto che manterrà il sottotipo.

struct Message { 
    unsigned message_type; 
    unsigned field1; 
    ...
    unsigned fieldn; 
    Message *sub_message;  // if there's a dedicated type for this
};

Se qualsiasi sottotipo può avere sotto-tipi secondari, che possono avere sotto-sotto-tipi secondari, e così via, allora dovresti prendere in considerazione l'uso di un modello di progettazione composito .

Se il tuo payload contiene per lo più interi senza segno, puoi rendere le tue classi più facili da usare con un array o un vettore di numeri interi senza segno. Ciò può aiutare a evitare il codice ridondante: invece di copiare un sacco di codice per replicare un comportamento simile ma per ogni campo (ad esempio stamparlo sullo schermo o serializzarlo), è possibile utilizzare invece un ciclo.

struct Message { 
    unsigned message_type; 
    vector<unsigned> field; // with a vector, the number of field could be variable  
    Message *sub_message;  // if there's a dedicated type for this
};

Potresti quindi definire alcune regole, ad esempio il numero di campi da utilizzare per ogni sottotipo specifico.

    
risposta data 21.03.2017 - 00:38
fonte

Leggi altre domande sui tag