que tienen los dos siguientes métodos que (como se puede ver) son similares en la mayoría de sus estados a excepción de uno (ver más abajo para más detalles)Refactor los siguientes dos C++ métodos para mover a cabo código duplicado
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;
}
¿Hay alguna técnica que pueda usar para mover las líneas comunes de código de los dos métodos a un método separado, que podría llamarse desde las dos variaciones, O bien, posiblemente combinar los dos métodos con un solo método?
Las siguientes son las restricciones:
- las clases de superficie y CURVA son de bibliotecas 3 ª parte y, por tanto, no se puede modificar. (Si se ayuda a que ambos se derivan de IDispatch)
- Hay incluso clases más similares (por ejemplo FACE) que podría entrar en esta "plantilla" (no C plantilla ++, sólo el flujo de líneas de código)
sé podría (posiblemente?) implementarse como soluciones al siguiente, pero estoy realmente esperando que hay una solución mejor:
- podría añadir una tercera parámetro a los métodos 2 - por ejemplo, una enumeración que identifica el primer parámetro (por ejemplo, enum :: input_type_surface, enum :: input_type_curve)
- Podría pasar un IDispatch y probar dynamic_cast <> y probar qué conversión es NON_NULL y hacer un if-else para llamar a la derecha método (por ejemplo getPlaneParams() vs. get_LineParams())
La siguiente no es una restricción, pero sería un requisito debido a mi compañeros de resistencia:
- no implementa una nueva clase que hereda de SUPERFICIE/CURVE, etc. (Prefieren resolverlo usando la solución enum que indiqué anteriormente)
no lo hace claro 'vector params'. ¿Pretendes llenarlo con parámetros de muchos objetos? Quizás haya formas mucho mejores de refactorizar su código según lo que haga antes de llamar a los métodos geXXXXParameters. –
¿Por qué devolver un 'unsigned int' cuando un' bool' sería suficiente? –
¿Cuál es el tipo de 'SafeDoubleArray'? Sospecho que esto podría refactorizarse más, pero lo necesitamos primero. Yo segundo @ movimiento de Matthieu para un 'bool'. – GManNickG