12

私たちのアプリケーションのソース コードは、数十万行、数千のファイルで構成されており、場所によっては非常に古いものになっています。このアプリケーションは 1995 年か 1996 年に最初に作成されたものです。ここ数年で、私のチームはソースの品質を大幅に改善しましたが、特に私を悩ませている問題が 1 つあります。多くのクラスには、ヘッダー ファイルで完全に定義された多くのメソッドがあります。

場合によっては、ヘッダーでインラインで宣言されたメソッドに問題はありません-構造体のコンストラクター、インライン化によりかなり高速になる単純なメソッドこのような数学関数がいくつかあります)など。しかし、インライン化されたメソッドの自由な使用は明らかではありません理由は次のとおりです。

  • 混雑
  • メソッドの実装を見つけるのが難しくなります (特に、仮想関数のクラスのツリーを検索すると、ヘッダーでバージョンが宣言されているクラスが 1 つだけ見つかります...)
  • おそらくコンパイルされたコードのサイズが増加します
  • おそらく、大規模なコードベースでは不安定であることで有名なリンカに問題が発生します。公平を期すために、ここ数年でかなり良くなりましたが、完璧ではありません。

この最後の理由が問題を引き起こしている可能性があり、コードベースを調べてほとんどの定義をソース ファイルに移動するのは十分な理由です。

私たちのコードベースは巨大です。 これを (ほとんど) 実行できる自動化ツールはありますか?

ノート:

  • Embarcadero RAD Studio 2010 を使用しています。つまり、C++ の方言にはVCL やその他の拡張機能などが含まれています。
  • スタンドアロンのヘッダーもいくつかありますが、ほとんどのヘッダーは通常どおり、対応する .cpp ファイルとペアになっています。拡張子を除けば、ファイル名は同じです。つまり、Xh で定義されたメソッドがある場合は、それらを X.cpp に移動できます。これは、ツールがプロジェクト全体の解析を処理する必要がないことも意味します。本体が定義されたメソッドを確実に認識できる限り、おそらく .cpp/.h ファイルの個々のペアを解析し、インクルードを無視することができます。クラス宣言でそれを移動します。
4

4 に答える 4

6

Lazy C++を試してみてください。私はそれを使用していませんが、必要なことを行うためのコマンド ライン ツールだと思います。

于 2012-01-13T16:04:36.097 に答える
3

コードが機能している場合、主要な自動化された書き換えに反対票を投じます。
それを修正するには、多くの作業が必要になる可能性があります。

個別に各変更をテスト (および単体テストを追加) できるため、時間をかけて小さな反復改善を行う方が優れた手法です。とにかく、コードが見つからないという主な不満は実際の問題ではなく、すでに解決されています。コード ベースのインデックスを作成するツールが既に存在するため、検索しなくてもエディターが正しい関数定義にジャンプします。エディターの ctags または同等のものを見てください。

  • 混雑

    主観的

  • メソッドの実装を見つけるのが難しくなります (特に、仮想関数のクラスのツリーを検索すると、ヘッダーでバージョンが宣言されているクラスが 1 つだけ見つかります...)

    関数を見つけるためのツールはすでにあります。ctags適切なエディター (vim/emacs) から関数に直接ジャンプできるファイルを作成します。これらのいずれかに同等のツールがある場合、編集者は確信しています。

  • おそらくコンパイルされたコードのサイズが増加します

    ありそうもない。コンパイラは、ソースでインラインとマークされていない内部メトリックに基づいて、インライン化するかどうかを選択します。

  • 大規模なコードベースでは不安定なことで有名なリンカに問題が発生する可能性があります。公平を期すために、ここ数年でかなり良くなりましたが、完璧ではありません。

    ありそうもない。リンカーがフレークである場合、それはフレーキーです。関数が定義されている場所に大きな違いはありません。これは、関数がインライン化されているかどうかとは関係がないためです。

于 2012-01-13T17:02:23.633 に答える
1

XE2 には、新しい静的アナライザーが含まれています。新しいバージョンの C++Builer の試用版を試してみる価値があるかもしれません。

于 2012-01-14T16:56:52.377 に答える
1

解決すべき問題がいくつかあります。

  • ソースファイルとヘッダーファイルを理想的に再グループ化する方法
  • これを実行するためのコード変更を自動化する方法

どちらの場合も、依存関係を正確に判断するには、完全な名前解決を備えた堅牢な C++ パーサーが必要です。

次に、C++ ソース コードを確実に変更できる機械が必要です。

これには、 C++ フロント エンドを備えたDMS ソフトウェア リエンジニアリング ツールキットを使用できます。DMS は、大規模な C++ コードの再構築に使用されています。http://www.semdesigns.com/Company/Publications/を参照して、最初の論文「ケース スタディ: 自動プログラム変換による C++ コンポーネント モデルの再設計」を見つけてください。(そこからダウンロードできるこのペーパーの古いバージョンがありますが、公開されているバージョンの方が優れています)。私の知る限り、DMS は大規模な C++ の変換に適用された唯一のツールです。

コードの再編成に関するこのSO の議論では、グループ化の問題に直接対処しています。

于 2012-01-13T20:43:50.163 に答える