Estoy en el proceso de refactorizar una gran cantidad de código, principalmente C++, para eliminar un número de comprobaciones de configuración temporales que se han establecido de forma permanente en valores determinados. Así, por ejemplo, tendría el siguiente código:Refactorización en C++: expansión condicional y eliminación de bloque
#include <value1.h>
#include <value2.h>
#include <value3.h>
...
if (value1())
{
// do something
}
bool b = value2();
if (b && anotherCondition)
{
// do more stuff
}
if (value3() < 10)
{
// more stuff again
}
donde las llamadas a un valor de retorno sea bool o un int. Como sé que los valores que estas llamadas siempre regresan, he hecho alguna sustitución de expresiones regulares para expandir las llamadas a sus valores normales:
// where:
// value1() == true
// value2() == false
// value3() == 4
// TODO: Remove expanded config (value1)
if (true)
{
// do something
}
// TODO: Remove expanded config (value2)
bool b = false;
if (b && anotherCondition)
{
// do more stuff
}
// TODO: Remove expanded config (value3)
if (4 < 10)
{
// more stuff again
}
en cuenta que aunque los valores son fijos, no se establecen en tiempo de compilación, pero se leen desde la memoria compartida por lo que el compilador no está optimizando nada detrás de escena.
Aunque el código resultante parece un poco tonto, este enfoque de expresión regular logra mucho de lo que quiero ya que es fácil de aplicar y elimina la dependencia de las llamadas, sin cambiar el comportamiento del código y también es probable que el compilador luego puede optimizar una gran cantidad sabiendo que nunca se puede llamar a un bloque o que un cheque siempre será verdadero. También hace que sea razonablemente fácil (sobre todo cuando se diferencian contra el control de versiones) para ver lo que ha cambiado y dar el paso final de la limpieza para arriba por lo que el código anterior código de tiempo se ve de la siguiente manera:
// do something
// DONT do more stuff (b being false always prevented this)
// more stuff again
El problema es que yo tiene que hacer cientos (posiblemente miles) de cambios para pasar de la segunda etapa, correcta pero tonta, para llegar al código final limpio.
Me preguntaba si alguien sabía de una herramienta de refactorización que pudiera manejar esta o cualquier otra técnica que pudiera aplicar. El problema principal es que la sintaxis de C++ hace que la expansión o eliminación completa sea bastante difícil de lograr y hay muchas permutaciones al código anterior. Siento que casi necesito un compilador para manejar la variación de la sintaxis que necesitaría cubrir.
Sé que ha habido preguntas similares pero no encuentro ningún requisito como este y también me pregunto si surgieron herramientas o procedimientos desde que se solicitaron.
Sí, esto es exactamente lo que quiero. Los regex me pueden ayudar un poco, pero son imprecisos y, como dices, lo más importante es que no "conocen" el idioma. Muchas gracias. (Por cierto, su enlace "DMS Software Reengineering Toolkit" está roto) –
Fundamentalmente, las expresiones regulares no pueden ocuparse de nada relacionado con la anidación. Las expresiones (booleanas) implican anidamiento. QED: las expresiones regulares no pueden funcionar por sí mismas en las expresiones. PD: enlace fijo. –