Ho le seguenti due metodi che (come potete vedere) sono simili nella maggior parte delle sue dichiarazioni ad eccezione di uno (vedi sotto per i dettagli)Refactor il seguente due ++ metodi C per spostare il codice duplicato
unsigned int CSWX::getLineParameters(const SURFACE & surface, vector<double> & params)
{
VARIANT varParams;
surface->getPlaneParams(varParams); // this is the line of code that is different
SafeDoubleArray sdParams(varParams);
for(int i = 0 ; i < sdParams.getSize() ; ++i)
{
params.push_back(sdParams[i]);
}
if(params.size() > 0) return 0;
return 1;
}
unsigned int CSWX::getPlaneParameters(const CURVE & curve, vector<double> & params)
{
VARIANT varParams;
curve->get_LineParams(varParams); // this is the line of code that is different
SafeDoubleArray sdParams(varParams);
for(int i = 0 ; i < sdParams.getSize() ; ++i)
{
params.push_back(sdParams[i]);
}
if(params.size() > 0) return 0;
return 1;
}
Esiste qualche tecnica che io possa usare per spostare le linee comuni di codice dei due metodi in un metodo separato, che potrebbe essere chiamato dalle due varianti - OPPURE - eventualmente combinare i due metodi in un unico metodo?
Di seguito sono riportati i limiti:
- Le classi di superficie e CURVA sono da librerie 3a parte e quindi non modificabile. (Se aiuta entrambi sono derivati da IDispatch)
- ci sono anche le classi più simili (ad es viso) che potrebbero rientrare in questa "template" (non C modello ++, solo il flusso di linee di codice)
so quanto segue potrebbe (forse?) essere implementato come soluzioni, ma sono davvero sperando che ci sia una soluzione migliore:
- potrei aggiungere un terzo parametro per i 2 metodi - per esempio un enum - che identifica il 1 ° parametro (es. enum :: input_type_surface, enum :: input_type_curve)
- Posso passare in IDispatch e provare dynamic_cast <> e verificare quale cast è NON_NULL e fare un if-else per chiamare il diritto metodo (ad esempio getPlaneParams() vs. get_LineParams())
che segue non è una limitazione, ma sarebbe un requisito a causa della mia resistenza compagni di squadra:
- non implementa una nuova classe che eredita da SUPERFICIE/CURVE ecc. (Preferirebbero molto risolverlo usando la soluzione enum che ho affermato sopra)
non si cancella il vettore 'params'. Hai intenzione di riempirlo con i parametri di molti oggetti? Forse ci sono modi migliori per rifattorizzare il tuo codice a seconda di ciò che fai prima di chiamare i metodi geXXXXParameters. –
Perché restituire un 'int unsigned quando un' bool' è sufficiente? –
Qual è il tipo di 'SafeDoubleArray'? Sospetto che questo possa essere ulteriormente rifatto, ma per prima cosa ne abbiamo bisogno. Io secondo la mozione di @ Matthieu per un 'bool'. – GManNickG