Orchestrazione dell'oggetto: istanziazione e intercomunicazione

0

Abbiamo un progetto C ++ gestito dal software UML, che genera codice per la creazione di istanze e il passaggio di dati tra oggetti. Sfortunatamente, questo software aggiunge un sacco di spese generali alle nostre build e allo sviluppo, quindi stiamo cercando di migrare il nostro codice da esso e di eliminare il passaggio di generazione.

Il codice generato ha classi contenitore costruiscono gli oggetti e quindi duplica le interfacce in modo che i metodi interni siano esposti esternamente:

class iMessageTx {
  public:
    virtual void sendMessage(const std::string& message) = 0;
};

class networkTx : public iMessageTx {
  public:
    void sendMessage(const std::string& message) { /* send message */ }
};

class networkStack : public iMessageTx {
  private:
    networkTx itsNetworkTx;
  public:
    networkStack() { itsNetworkTx = new networkTx(); }
    void sendMessage(const std::string& message) { itsNetworkTx.sendMessage(message); }
};

class hardwareLayer : public iMessageTx {
  private:
    networkStack itsNetworkStack;
  public:
    hardwareLayer() { itsNetworkStack = new networkStack(); }
    void sendMessage(const std::string& message) { itsNetworkStack.sendMessage(message); }
};

Questo è molto da mantenere a mano, per non parlare del debug attraverso. Mi sembra sbagliato, come questo non è un buon modello di design.

Ci sono schemi comuni in C ++ che sono usati per istanziare oggetti e orchestrare la comunicazione tra loro? Sposteremmo il nostro codice dal software UML un po 'alla volta, quindi non dobbiamo basare la nostra riscrittura sull'output generato.

    
posta codehearts 27.09.2018 - 22:04
fonte

1 risposta

0

La tua domanda è confusa. UML è una notazione per descrivere il software, non per gestirlo e mentre può essere usato per generare codice non aggiunge un overhead nel modo in cui lo descrivi. Detto questo, non sono sicuro di vedere il problema, almeno come lei descrive (avvertenza, non programma C ++).

Credo che tu abbia un'interfaccia iMessageTx che definisce un comportamento sendMessage . Hai 3 classi che implementano questo comportamento. La parte che farei diversamente è che vorrei passare le istanze di iMessageTx alle classi usando piuttosto che farle istanziare i propri membri.

Ad esempio, puoi passare un'istanza di networkTx a networkStack nel suo costruttore o usare un setter. Se networkStack si preoccupa solo del comportamento iMessageTx , dovrebbe dichiarare che deve essere passato qualcosa che implementa quel comportamento, piuttosto che quella particolare implementazione, sfruttando così il polimorfismo. Allo stesso modo, per hardwareLayer .

Questo tipo di comportamento del cablaggio è l'inversione dei quadri di controllo. Mi chiedo, tuttavia, se il tuo progetto è giusto, poiché implica che networkStack , networkTx e hardwareLayer siano, per determinati usi, intercambiabili.

    
risposta data 29.09.2018 - 08:33
fonte

Leggi altre domande sui tag