レガシ コードに注意することは賢明ですが、レガシ コードのバグを検出することも良いことです。少なくとも、バグを見つけやすくします。
ブライアン・アグニューの困難なケースを考えてみましょう:
// Case #1
if (x) doMethodA(); doMethodB();
実際、JLS と Java コンパイラに関する限り、これは次のことを意味します。
if (x) doMethodA();
doMethodB();
そのため、トランスフォーマーがコードを次のように書き換えると:
if (x) {
doMethodA();
}
doMethodB();
コードの意味を変更するわけではありませんが、誰かがコードを読み違えたり、コードに既に存在する潜在的なバグを見逃す可能性がある問題を修正しています。つまり、2番目の呼び出しが条件付きであると想定されている場合...
// Case #2
if (x)
// doMethodA();
doMethodB();
もう一度書き直すと、次のようになります。
if (x) {
// doMethodA();
doMethodB();
}
これは原文と同じ意味です。さらに、これはプログラマーの意図を反映している可能性が最も高いです...インデントが信じられる場合。しかし、これを考慮してください:
// Case #2a
if (x)
// doMethodA();
doMethodB();
それを次のように書き直すと
if (x) {
// doMethodA();
doMethodB();
}
コードの実際の意味は変わらず、間違ったインデントが誤解を招くこともありません。プログラマーが最初の呼び出しのコメントを解除することにした場合、以前のコメント アウトが意図しない結果をもたらしたことに気付かない可能性があります。(証拠は、元のインデントに「修正済み」でした。) しかし、潜在的な解決策があります。下記参照。
コード変換ツールが Java の構文とセマンティクスを適切に理解して動作すると仮定すると、まだ壊れていないものを壊すことはなく、既存の壊れた部分を (ある程度) 誰かにとってより明白にすることができます。コードを読んでいます。私にとっては、レガシー コードであってもリスクゼロの勝利です。
ここで、トランスフォーマーをよりスマートにすると、元のインデントがバグの可能性を示しているケース (上記のケース #1 と #2a など) を検出し、より詳細なコード検査のためにフラグを立てることができます。