Progetta una gerarchia ad albero delle classi di proprietà

0

Ho una classe, chiamiamola App , che istanzia e possiede un insieme di classi di tipo Agents , ognuna delle quali crea un'istanza e possiede un set di Listeners . La proprietà è unica e non trasferibile, quindi ovviamente std::unique_ptr . E i numeri possono variare in numero, sebbene di solito non siano molti, quindi un std::vector<std::unique_ptr> funziona bene.

In fase di compilazione, in base a qualche direttiva, posso dire quale Agents è App necessitante, e quale Listener s è ogni Agent necessario. Agent s a App , o Listener s a ogni Agent , può variare in futuro, ma sempre a tempo di compilazione però, una volta che il programma è impostato per eseguire nulla cambierà fino a una nuova versione di il programma è distribuito.

Quindi la domanda è: come posso implementare tutta questa gerarchia ad albero in modo organizzato e a prova di futuro?

Ho provato ad implementare un pattern Metodo di Fabbrica, che darà il Agent s corretto a App (basta lanciare un factory diverso a seconda del flag di compilazione), ma poi sono un po 'bloccato come dire a Agent s quale Listener s di cui hanno bisogno in modo pulito. Mi sembra di nuovo una factory di Listener s che prende come parametro il Agent , e poi ha un'orribile istruzione switch che interroga il tipo di Agent e gli dà il suo Listener s, ma sembra che ottenga disordinato molto veloce.

PD: utilizzando VC2010, che è solo parzialmente conforme a C ++ 11 e pienamente compatibile con TR1.

    
posta Nelson Vides 03.10.2018 - 18:11
fonte

2 risposte

0

Il problema

Se rendi il tuo App responsabile della creazione di Agents e Agents responsabili della creazione del loro Listeners , crei una strong dipendenza del proprietario dal proprietario che ti priva della flessibilità di scegliere altri tipi di agenti o ascoltatori.

L'uso di un stabilimento è un buon inizio poiché le fabbriche potrebbero essere dotate di parametri per istanziare diversi tipi di agenti o ascoltatori. Tuttavia, non è sufficiente, poiché le tue classi dipendono quindi da fabbriche cablate anziché da classi di proprietà.

Soluzioni passo 1

La soluzione è utilizzare iniezione di dipendenza . Quindi, invece di lasciare che App crei Agent e Agent Listener , devi iniettare le fabbriche.

L'inconveniente? Siccome vuoi essere libero dalle dipendenze bottom-up e vuoi configurare le classi da utilizzare dall'alto verso il basso, l'iniezione della dipendenza dovrebbe essere multilivello. Quindi se hai una profondità di albero di 3, dovresti iniettare 3 diverse fabbriche per creare l'app.

Passaggio 2 della soluzione

Dato che stai creando una famiglia di oggetti correlati, potresti invece iniettare più fabbriche, iniettare una sola fabbrica astratta che verrebbe utilizzato per creare il diverso tipo di oggetti.

Passaggio 3 della soluzione

Poiché stai utilizzando una specie di assembly in fase di compilazione, puoi anche prendere in considerazione un progetto basato su criteri . La prima edizione del libro che ha reso popolare questo design risale al 2001, quindi non richiede C ++ 11.

L'idea è di iniettare un criterio (aka modello di strategia ) in fase di compilazione utilizzando i modelli. Questo è un approccio molto potente e flessibile, ma richiede che tu passi alcune classi in classi template. Sono possibili diversi scenari, ad esempio:

  • potresti creare un modello di fabbrica astratta e fornire come criterio le diverse classi che devono essere utilizzate.
  • potresti anche iniettare il tipo da utilizzare ad ogni livello avendo App, Agenti, Ascoltatori ecc. le classi template ( semplice esempio , solo per mostrare come potrebbe funzionare).

Uno dei vantaggi di questo approccio è che il modello può anche liberarti dall'implementare la proprietà con vector<unique_ptr<...>> e optare invece per i semplici vettori.

    
risposta data 03.10.2018 - 21:54
fonte
0

Probabilmente userò un approccio basato sui dati: creare un semplice formato di dati che raccolga i dettagli rilevanti degli agenti desiderati (come i loro nomi), insieme ai dettagli degli ascoltatori di ciascuno di loro.

Il tuo codice eseguirà questo semplice formato di dati e creerà gli agenti per i loro ascoltatori e li collegherà tra loro.

Questi dati possono provenire da statiche inizializzate in fase di compilazione se vuoi crearlo, o più tardi potrebbero provenire da un file di configurazione.

Non ci sarebbe necessariamente un metodo factory per creare Agents da utilizzare con App - solo un metodo di inizializzazione per creare la gerarchia. O forse è il metodo factory per App - l'oggetto di livello superiore della gerarchia, che deve essere restituito dal metodo factory.

    
risposta data 03.10.2018 - 21:34
fonte

Leggi altre domande sui tag