Ich bin dabei, eine sehr große Menge an Code, hauptsächlich C++, zu refactorieren, um eine Anzahl von temporären Konfigurationsprüfungen zu entfernen, die dauerhaft auf gegebene Werte gesetzt wurden. So zum Beispiel, würde ich den folgenden Code hat:C++ - Refactoring: bedingte Erweiterung und Blockeliminierung
#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
}
wo die Anrufe an Rückgabewert entweder ein bool oder ein int. Da ich die Werte wissen, dass diese Anrufe immer wieder zurückkehren, habe ich einige regex Substitution getan, um die Anrufe zu ihren normalen Werten zu erweitern:
// 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
}
Beachten Sie, dass, obwohl die Werte festgelegt sind, werden sie bei der Kompilierung nicht festgelegt, aber werden aus dem gemeinsamen Speicher gelesen, so dass der Compiler im Hintergrund derzeit nichts optimiert.
Obwohl der resultierende Code ein bisschen doof aussieht, erreicht dieser Regex-Ansatz viel von dem, was ich will, da es einfach anzuwenden ist und die Abhängigkeit von den Aufrufen entfernt, während das Verhalten des Codes und wahrscheinlich auch der Compiler nicht verändert wird kann dann viel davon optimieren, wenn man weiß, dass ein Block niemals aufgerufen werden kann oder eine Überprüfung immer wahr zurückgibt. Es macht es auch relativ einfach (vor allem, wenn sie gegen die Versionskontrolle diffing) um zu sehen, was sich verändert hat und nehmen Sie den letzten Schritt der es nach oben, so dass die obige Code Code Reinigung sieht schließlich wie folgt:
// do something
// DONT do more stuff (b being false always prevented this)
// more stuff again
Das Problem, dass ich ist hunderte (möglicherweise tausende) von Änderungen zu machen, um von der zweiten, richtigen, aber doof, Stufe zu kommen, um zum letzten bereinigten Code zu kommen.
Ich fragte mich, ob jemand von einem Refactoring-Tool wusste, das damit umgehen könnte oder mit irgendwelchen Techniken, die ich anwenden könnte. Das Hauptproblem ist, dass die C++ - Syntax eine vollständige Erweiterung oder Eliminierung ziemlich schwierig zu erreichen ist, und es gibt viele Permutationen zu dem obigen Code. Ich glaube, ich brauche fast einen Compiler, um mit der Variation der Syntax umzugehen, die ich abdecken müsste.
Ich weiß, es gab ähnliche Fragen, aber ich kann keine Anforderung ganz so finden und fragte mich auch, ob irgendwelche Werkzeuge oder Verfahren entstanden waren, seit sie gefragt wurden?
Ja, genau das möchte ich. Regexes können mir einiges abverlangen, aber sie sind ungenau und wie du sagst, "wissen" sie die Sprache nicht. Vielen Dank. (Übrigens, Ihr "DMS Software Reengineering Toolkit" -Link ist kaputt) –
Grundsätzlich können Regexes nichts mit Verschachtelung umgehen. (Boolesche) Ausdrücke beinhalten Verschachtelung. QED: Regexes können für Ausdrücke nicht selbstständig arbeiten. PS: Link behoben. –