非常に大量のコード、主にC++をリファクタリングして、与えられた値に永続的に設定された多数の一時的な構成チェックを削除しています。たとえば、私は次のコードを持っています: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
}
ここで、値の呼び出しは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
}
注値が固定されているが、それらはコンパイル時に設定されていないことが、共有メモリから読み込まれるため、コンパイラは現在、何もしていない状態で最適化を行っていません。
この正規表現のアプローチは少しばかげているようですが、コードの振る舞いを変更せずに、呼び出しに依存することをやり直すのは簡単で、コンパイラブロックが決して呼び出されない、またはチェックが常に真を返すことを知って、多くのものを最適化することができます。また、(バージョン管理に対する差分の時は特に)、それは合理的に簡単に変更されているかを確認し、それをクリーンアップする最後のステップを取るようになり、次のようにコード上記のコードは、最終的になります。
// do something
// DONT do more stuff (b being false always prevented this)
// more stuff again
トラブルがIということです2番目の正しい、ばかげた段階から最終的なクリーンコードに到達するまでに何百(何千もの)変更を加える必要があります。
これを処理するリファクタリングツールを知っている人がいれば、私はそれを適用することができます。主な問題は、C++の構文が完全拡張または削除を非常に困難にし、上記のコードに多くの順列があることです。私は、私がカバーする必要がある構文のバリエーションに対処するためにコンパイラがほとんど必要だと感じています。
似たような質問がありましたが、私はこれに似た要件を見つけることができず、質問されてからツールや手順が出てきたのか疑問に思っています。
はい、これはまさに私が欲しいものです。正規表現はかなり私を得ることができますが、それらは不正確です。あなたが言うように、重要なことに、彼らは言語を「知っていません」。どうもありがとう。 (あなたの "DMSソフトウェアリエンジニアリングツールキット"のリンクは壊れています) –
基本的に正規表現では入れ子になるものは扱えません。 (ブール)式にはネストが含まれます。 QED:regexesは式では動作しません。 PS:リンクが固定されました。 –