Newsgroup: it.comp.lang.c++
Titolo: Problema di class design.

Ciao,
volevo discutere con voi della struttura che ho dato alla mia libreria
di classi. Da questa libreria poi esporto delle funzioni c. Ora il mio
problema è il seguente:
Ho una classe di questo genere:
template <class T1, class T2, class T3>
classe Prova 
{
 ...utilizzo dei tre template...
}
T1, T2 e T3 sono gerarchie di classi (anche queste template). Del tipo:
template<class T>
classe Base;
template<class T>
classe Derivata1 : public Base;
template<class T>
classe Derivata2 : public Base;
template<class T>
classe Derivata3 : public Base;
Nel momento in cui faccio la mia funzione c. mi faccio dare dei valori
numerici che mi stanno ad indicare quale classe dovrei inserire nel
template, cioè: 1 per Derivata1, 2 per Derivata2 e 3 per Derivata3.
L'unico modo che mi viene in mente quindi di istanziare il mio template
è  quello di usare un if o uno switch.
Però nel caso di una classe che ha 3 template devo coprire tutte le
possibili combinazioni!!
Esiste qualche "design pattern" che mi può aiutare? Oppure ho sbagliato
proprio a disegnare le mie classi?
Grazie,
   Mirko.
-- 
Posted via Mailgate.ORG Server - 
http://www.Mailgate.ORG

 proprio a disegnare le mie classi?
Solo piccole variazioni sul tema. Continuo a pensare che ci sia un
errore concettuale nel tuo disegno, ma senza sapere a cosa serve non e'
possibile individuarlo.
Ciao,
Nicola

 Nicola
Il fatto è: quando è giusto templizzare una classe e quando utilizzare
il metodo che suggerivi prima?
Il problema vero è il run-time. Mentre il template mi fornisce
flessibilità solo se le scelte vengono fatte a compile-time. Inoltre,
forse, il template è utile quando le classi che puoi inserire, possono
essere completamente scorrelate tra di loro e non nel caso di gerarchia
come la mia.
Che ne pensi di queste mie locubrazioni?
Ciao,


 come la mia.
Un'altra domanda: sei sicuro di non stare rappresentando con classi
separate delle entita' che in realta' sarebbero rappresentate meglio con
istanze di una classe singola o di un numero piu' limitato di classi?
In altre parole: non stai confondendo stato con struttura?
Ciao,
Nicola

 
Ok, una delle gerarchie di classi rappresentano per esempio il calcolo 
di un rateo. Questo può avvenire, chiaramente, in modi diversi. Quello 
che ho pensato è stato quindi di creare una classe che definisse 
l'interfaccia delle classi. Dopo di che ho ho creato la gerarchia dove 
ogni ciascuna classe definiva il metodo di calcolo.
Chiaramemte potevo fare tutto in una classee scegliere il metodo di 
calcolo a seconda della variabile di stato.
Ora il fatto è che ho sempre pensato che il tutto si riducesse alla 
scelta di dove vuoi fare l'if "decisivo". O fai l'if all'interno della 
classe a seconda della variabile di stato, appunto, oppure scegli di 
farlo "fuori" al momento della creazione della classe stessa.
Diciamo di posticiparlo il più possibile, fino a portarlo alle funzioni 
che poi vuoi esportare.
Tutto sommato il sitema ha funzionato abbastanza bene, fino al momento 
in cui non ho pensato di fare quel bellissimo triplo template (o meglio 
lo devo sempre fare, ma viste le cose è meglio se cambio idea).
Quindi ritengo che più che il disegno, devo ripensare al concetto di 
template... che probabilmente non è la panacea di tutti i mali, e che 
soprattutto nel caso di una costruzione di una libreria che costruisce 
oggetti complessi a run-time è meglio utilizzarlo con parsimonia.
Ciao,
    Mirko.

 oggetti complessi a run-time è meglio utilizzarlo con parsimonia.
Dipende proprio da cosa rappresentano i parametri del template. Se
effettivamente sono discriminanti determinate in fase di compilazione
non puoi esulare dal fatto di avere tutte le classi corrispondenti alle
diverse specializzazioni del template. Il guadagno e' dato tutto e solo
dal fatto che il template lo scrivi una volta sola (salvo
specializzazioni esplicite).
E' chiaro che la scelta di quale template istanziare non puo' che
avvenire a runtime, ma e' una scelta che dovresti fare anche se ti fossi
scritto tutte le classi a mano e l'uso del template ti lascia comunque
aperta la strada di scrivere altro codice generico in seguito.
Se poi ti rendi conto che esistono comunque delle regolarita' nelle
diverse specializzazioni o nel codice che seleziona la specializzazione
da istanziare, ma non riesci ad esprimere queste regolarita' sotto forma
di ulteriori template, prendi in considerazione l'ipotesi di scrivere un
programma che ti generi il codice.
Ciao,
Nicola