私は、非常に大量のコード (主に C++) をリファクタリングして、特定の値に永続的に設定されている多数の一時的な構成チェックを削除しようとしています。たとえば、次のコードがあります。
#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
}
value の呼び出しは bool または int を返します。これらの呼び出しが常に返す値を知っているので、呼び出しを通常の値に展開するためにいくつかの正規表現置換を行いました。
// 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
}
値は固定されていますが、コンパイル時に設定されるのではなく、共有メモリから読み取られるため、コンパイラは現在、舞台裏で何も最適化していないことに注意してください。
結果のコードは少し間抜けに見えますが、この正規表現アプローチは、コードの動作を変更せずに適用が簡単で呼び出しへの依存を削除するため、私が望む多くのことを達成します。ブロックが呼び出されないか、チェックが常に true を返すことを知っているため、多くのことを行います。また、(特にバージョン管理と比較する場合) 何が変更されたかを確認し、それをクリーンアップする最終ステップを実行するのがかなり簡単になり、コードの上のコードは最終的に次のようになります。
// do something
// DONT do more stuff (b being false always prevented this)
// more stuff again
問題は、2 番目の、正しいが間抜けな段階から、最終的にクリーンなコードに到達するまでに、何百 (場合によっては何千) もの変更を加えなければならないことです。
これを処理できるリファクタリング ツールや、私が適用できるテクニックを誰かが知っているかどうか疑問に思いました。主な問題は、C++ 構文が完全な展開または削除を達成するのを非常に困難にし、上記のコードに多くの順列があることです。カバーする必要のあるさまざまな構文に対処するには、ほとんどコンパイラが必要だと感じています。
同様の質問があったことは知っていますが、このような要件を見つけることができず、質問されてからツールや手順が登場したかどうか疑問に思いましたか?