Wrapper attorno a C ++ STL

2

Dove lavoro abbiamo la nostra libreria di sistema, che praticamente è solo wrapper attorno all'STL, come ad esempio:

template <typename T>
class HVector {
protected:
    std::vector<T> data;
public:
    int size () const; //Only returns data.size()
    int custom(); //Some generic custom function that uses the data vector
}

La maggior parte dei membri della classe sono solo re-dichiarazioni dei membri del contenitore STL, ma abbiamo anche alcune funzioni personalizzate che eseguono alcune attività generiche con il contenitore.

È un buon design? In caso contrario, quale sarebbe il modo migliore per implementare le funzioni personalizzate attorno ai contenitori?

    
posta Pedro Tabacof 09.04.2014 - 15:54
fonte

4 risposte

6

Dipende dalla natura di tali operazioni personalizzate, ma probabilmente si , è un cattivo design. E la ragione principale per affermare questo è che stai accoppiando operazione e archiviazione.

Se una certa operazione personalizzata è semanticamente indipendente, può essere implementata meglio come una classe o funzione autonoma (functor), prendendo un parametro contenitore specifico. Inoltre, se non dipende dalla classe del contenitore di calcestruzzo, può essere aggiunto un parametro template aggiuntivo specificandolo, o anche meglio, refactored per lavorare su intervalli di iteratore. Vedi, proprio come le funzioni dell'algoritmo STL.

Inoltre, il wrapping nel modo in cui lo fai implica l'inoltro di una parte significativa dell'interfaccia pubblica del contenitore incartato. Questo è un odore chiaro.

    
risposta data 09.04.2014 - 16:34
fonte
1

Non lo farei, preferirei vedere una classe che è un vettore se fondamentalmente è solo un vettore con 1 o 2 funzioni personalizzate.

Per queste funzioni personalizzate, direi che è meglio rendere funzioni quell'operatore sul tipo, ad esempio tutti i metodi in. Potresti scoprire che questo approccio è un po 'più generico e quindi incoraggia il riutilizzo attraverso le tue classi wrapper.

Tuttavia, se la classe è più di un vettore, e capita semplicemente di usare un vettore come memoria interna dei dati, allora va bene. Una classe Customers che si occupa di un vettore di oggetti Customer è una cosa. Re-implementare un vettore con il tuo vettore non lo è.

    
risposta data 09.04.2014 - 16:22
fonte
0

Ho preferito derivare da STL per aggiungere funzionalità e nascondere anche i template. Quindi, piuttosto che usare il vettore come variabile membro, vorrei derivare in modo che il mio CustomVector sia ancora un vettore e tutti i metodi disponibili su un vettore siano disponibili anche su CustomVector. Inoltre, qualsiasi metodo che può funzionare su un vettore funzionerà anche sulla mia classe personalizzata.

Se vuoi mantenere l'esposizione dei modelli, come fai nel tuo esempio, è abbastanza facile fare con questa tecnica.

    
risposta data 09.04.2014 - 16:30
fonte
0

Il tuo wrapper potrebbe avere una logica interna per gestire il modello. E sostanzialmente tutti gli STL sono modelli da soli.

Questo non mi sciocca. Immagina di voler disporre di una serie di oggetti "Auto" e altri oggetti "Biciclette". Stessa struttura ma diversa manipolazione dei dati.

    
risposta data 10.04.2014 - 12:37
fonte

Leggi altre domande sui tag