かなり大きく (>300K)、かなり成熟した C コードベースを C++ に変換するにはどうすればよいでしょうか?
念頭に置いている種類の CI は、モジュールにほぼ対応するファイルに分割され (つまり、典型的な OO クラスベースの分解よりも粒度が低い)、プライベート関数とデータの代わりに内部リンケージを使用し、パブリック関数とデータには外部リンケージを使用します。グローバル変数は、モジュール間の通信に広く使用されます。非常に広範な統合テスト スイートが利用可能ですが、ユニット (モジュール) レベルのテストはありません。
私は一般的な戦略を念頭に置いています:
- C++ の C サブセットですべてをコンパイルし、それを機能させます。
- モジュールを巨大なクラスに変換して、すべての相互参照がクラス名によってスコープされるようにしますが、すべての関数とデータを静的メンバーとして残し、それを機能させます。
- 適切なコンストラクターと初期化された相互参照を使用して、巨大なクラスをインスタンスに変換します。必要に応じて、静的メンバー アクセスを間接アクセスに置き換えます。そしてそれを機能させます。
- 次に、問題のある OO アプリケーションとしてプロジェクトにアプローチし、依存関係が扱いやすいユニット テストを作成し、そうでない場合は個別のクラスに分解します。ここでの目標は、変換のたびに 1 つの作業プログラムから別のプログラムに移行することです。
明らかに、これはかなりの作業になります。この種の翻訳に関するケーススタディ/戦争の話はありますか? 代替戦略?その他の役立つアドバイスはありますか?
注 1: プログラムはコンパイラであり、おそらく何百万もの他のプログラムがその動作が変更されないことに依存しているため、大規模な書き換えはほとんどオプションではありません。
注 2: ソースはほぼ 20 年前のものであり、おそらく 1 年あたり 30% のコード チャーン (変更された行 + 追加された行 / 以前の合計行数) があります。言い換えれば、それは大幅に維持および拡張されています。したがって、目標の 1 つは保守性を高めることです。
[質問のために、 C++への変換は必須であり、C のままにしておくことは選択肢ではないと仮定します。この条件を追加するポイントは、「C に残す」という回答を除外することです。]