Progettare classi contenenti gli stessi oggetti ma quantità diverse di esse

1

Sto creando un oggetto principale, MACCHINA, che conterrà una varietà di diversi altri oggetti: AXIS, AMPLIFIER, ENDEFFECTOR, ecc. Il numero di oggetti contenuti varierà in base all'oggetto del modello MACCHINA che sto usando.

Ad esempio, un determinato computer potrebbe avere un AXIS e un ENDEFFECTOR; un altro 3 AXIS e 2 ENDEFFECTORS, ecc.

Stavo progettando di creare sottoclassi con ciascun modello di macchina e inizializzare il rispettivo numero di oggetti contenuti a seconda del modello. La mia paura è che ci sarà un'esplosione di modelli di macchine, così come un sacco di codice ripetuto e impostazioni tra sottoclassi.

Ho la sensazione che ci sia un modo più pulito per implementarlo, ma non sono sicuro di come farlo. Qualsiasi idea sarà molto apprezzata.

    
posta Peretz 09.07.2011 - 02:42
fonte

1 risposta

0

Lo terrei con una singola classe di macchina che contiene un vettore o un elenco di elementi. Per inizializzarlo, è possibile eseguire l'hardcode del processo di inizializzazione utilizzando qualcosa come un metodo addPart () o utilizzando un file di inizializzazione per ogni tipo di macchina e aggiungere un metodo (o un costruttore) in grado di leggere tali file di init.

Quindi la prima versione sarebbe simile a questa: (supponendo che tutte le parti della macchina siano inferiori a una classe base come Parte)

Machine* smallMachine = new Machine;
smallMachine->addPart(new Axis);
smallMachine->addPart(new Amplifier);

Oppure potresti avere metodi per ogni possibile tipo di parte:

Machine* smallMachine = new Machine;
smallMachine->addAxis();
smallMachine->addAmplifier();

Il secondo usa semplicemente un nome file per il costruttore:

Machine* smallMachine = new Machine("/home/machines/small_machine.ini");

modifica

Ci sono molti modi per gestirlo all'interno della classe della macchina e dipende principalmente da ciò che le parti effettivamente possono fare e quanto la classe Macine ne sa.

Supponiamo che la macchina non conosca quasi nulla sulle parti, solo che possono fare qualcosa e in seguito inizieranno ciascuna parte una volta sola. In questo caso potresti semplicemente scrivere una parte della classe base virtuale pura;

class Part
{
     virtual void work() = 0;
}

Tutte le classi che derivano da Parte devono sovrascrivere il metodo work () e in questo modo implementarne le funzionalità. La macchina non sa nient'altro e può usare un semplice vettore di parti.

class Axis : private Part
{
    virtual void work(){
        // implement actual functionality
        // may call lots of private methods of Axis to do this
    }
}

Se ciò non funziona per te, è in effetti una soluzione migliore per tenere diversi contenitori per ogni tipo di parte. Questo soprattutto se prevedi di avere alcune interazioni specifiche tra le parti.

Se si utilizza la soluzione ini, questo non cambierebbe molto rispetto alla soluzione del metodo, dato che dopotutto, il costruttore dovrebbe chiamare funzioni simili quando valuta il contenuto dei file ini.

La classe base virtuale è quella che avrebbe bisogno delle minori modifiche nel caso si aggiungessero nuove parti. Nessuno nel migliore dei casi. Ma sarebbe limitato al metodo (o diversi metodi) che sono dichiarati nella Parte.

La soluzione con diversi contenitori e una maggiore conoscenza della macchina dovrebbe essere aggiornata ogni volta che aggiungi un nuovo tipo di parte o aggiungi nuove funzionalità a una parte. Ma se hai bisogno che la Macchina conosca i dettagli specifici delle parti, non riuscirai a evitarlo comunque.

modifica: dal tuo commento precedente sull'implementazione di un sistema di controllo CNC, direi che hai bisogno di una struttura più complessa. Forse dovresti dare un'occhiata a qualche buon libro sui modelli di design. Penso che questo varrebbe la pena. Poiché sembra che ciascuna parte implementerà tipi di funzionalità molto diversi e potrebbero anche dipendere dai rispettivi stati.

    
risposta data 09.07.2011 - 02:53
fonte

Leggi altre domande sui tag