web-dev-qa-db-ja.com

動作するC ++リファクタリングツールはありますか?

大規模なコードベース(約100.000行)で確実に動作するC++用のフル機能のリファクタリングツールを知っている人はいますか?

SlickEdit、Eclipse CDTなど、私は過去何年も何度も何度も見つけました。それらはすべてまったく使用できませんでした。

[〜#〜] summary [〜#〜]:時間をかけて「Visual Assist X」と「C++のリファクタリング」を評価しました。どちらも印象的な機能を備えていますが、両方とも完璧にはほど遠い状態です。コードの大きなブロックを抽出することは、通常、手動で修正しない限り満足のいくものではありません。したがって、成果はありません。

「Visual Assist X」には、より完全なオートコンプリートなどの優れた機能があります。しかし、特定のポイントでちらつきが非常に遅くなります。

したがって、私の意見では、答えは「いいえ、C++用のプロダクション対応のリファクタリングツールはありません」です。

2015年3月更新今日のhdoghmensの返信に関しては、Resharper for C++を試しました。彼のリンク https://www.jetbrains.com/resharper/ はC++について何も言っていません。しかし、ここで1年以上前に発表されたResharper C++を見つけました。

https://www.jetbrains.com/resharper/features/cpp.html

20MBのコードベースを使用してVC2010で試してみました。

テスト1:抽出メソッド:Resharper例外が発生します。ソースコードは変更されていません。

テスト2:別のソースでメソッドを抽出:正常に動作します

テスト3:抽出された関数の署名を変更します:破損したC++コードが発生します:

bool myclass::do_work123(<unknown long Color>int& Filled*&, long, int&)

たぶんそれがC++がメインページにリストされていない理由です。

私の意見では、この質問に対する答えはまだ "NO"です。

158
RED SOFT ADAIR

Visual Assist X Visual Studioを使用すると非常に便利です。もう1つの選択肢は、 C++のリファクタリング です。

37
Gant

Visual Assist およびVisual Studioにより、大規模なコードベースの処理がはるかに簡単になります。ビジュアルアシストは、クラスまたはメンバーの使用方法を追跡するのに優れており、検索と置換よりも誤検知なしで名前を変更するのに効果的です。

41
Tom Leys

clang は、今後数年間でC++リファクタリングツールの状況を大きく変えると期待しています。これは、C++コードを解析および意味論的に分析するためのAPIを公開する、オープンソースのモジュラーコンパイラです。 IDEや他のツールは、独自のパーサーとセマンティックアナライザーを作成するという難しい作業を行うのではなく、このAPIを使用できます。

Googleは既にclangを使用した大規模なリファクタリングツールを作成しています

23
HighCommander4

MozillaにはPorkという名前の独自のリファクタリングツールがあります( WikiDeveloper Wiki )。 ここ はPorkの開発者のブログです。私が読んだことから、ポークはMozillaでのリファクタリングに使用されました。

* nix landから来た場合、ポークが役立ちます。VisualStudioの場合、Visual Assistもお勧めします。

17
Cristian Adam

DMS Software Reengineering Toolkit は、C++を含む大規模なコード本体で複雑な変換を実行するように設計された変換エンジンです。数百万行のコードのシステムで信頼できる変更を行うために使用されています。コンパイラーで正確な言語解析アナライザーとトランスフォーマーを使用して動作します。

名前と型の解決を備えた完全なC++パーサーがあり、コードのASTを構築し、手続き型またはソースからソースへの変換(C++サーフェス構文を使用)を適用してこれらのツリーを修正し、コメントを保存したままコンパイル可能な出力を再生成できます。 (編集:2011年7月1日:標準を理解できる範囲でC++ 1Xを実行するようになりました:)

C++コンポーネントの再設計、言語間の完全自動化された翻訳など、大規模なリエンジニアリングプロジェクトで使用されています。これについてはウェブサイトで読むことができます。

DMSは、任意のソース分析ツールの構築にも使用されます。例には、クローン検出、テストカバレッジ、スマートな違い(単純な挿入と削除の行ではなく、ソースコード構造と抽象的な編集操作の比較)などが含まれます。

そうでないもの(現在)は、インタラクティブなリファクタリングツールです。ほとんどのリファクタリングを適切に行うには、詳細な制御とデータフロー分析が必要であると考えています。 DMSにはこれをサポートする汎用的な機構があり、その機構はC、COBOL、およびJavaに実装されており、C++が次に並んでいます。これは困難な仕事です。この種の問題が十分に解決されるまで、多くの深刻なC++リファクタリングツールが必要です。まず、完全なC++パーサーが必要です:-}

編集7/5/2011:インタラクティブバージョンで実行する予定です。これを行う方法を調査するためにエネルギー省のフェーズI SBIRを獲得しました。http://science.energy.gov/sbir/awards-and-general-statsを参照してください。/fy-2011/phase-i-by-state /?p = 1#tx (「テキサス」の下のセマンティックデザインを探します)。急いで結果を期待しないでください。これは、ツールに到達するための3段階の複数年プログラムのほんの始まりに過ぎません。

EDIT 8/11/2011:最初の進捗状況...すべてのC++ 0xおよびOpenMPディレクティブを処理するようになりました。

EDIT 1/4/2012:C++コードのフルコントロールフロー分析を行います。

EDIT 9/15/2014:C++ 14フロントエンドパーサー/変換エンジンが手元にあります。この時点でもかなり確実に名前を変更します:-}

9
Ira Baxter

Emacsを使用している場合は、 Xrefactory を試してください。メソッドの抽出、クラス/関数/変数の名前変更、パラメータの挿入/削除/移動をサポートします。また、非常に優れた/高速なコード補完エンジンを備えています。

8
bmeric

現在、C++用のanyリファクタリングツールはお勧めできませんが、10万行以上の大規模なコードベースには使用できません。私はこれがOPのように変わることを望んでいました、そしていつか何かがあることを願っています。本当に良いツールが見つかる前に、言語自体を大幅に変更する必要があるのではないかと心配しています。

ところで、SlickEditはリファクタリング機能を落としましたか?

6
quamrana

Emacsを使用していて、まだ試していない場合は、 rtags を試すことをお勧めします(vimには package もあります)。 C/C++コードのインデックスを作成するclangベースのクライアント/サーバーアプリケーションであり、次の機能が含まれています。

  • 定義/宣言に移動
  • すべての参照を検索し、次/前に移動します
  • シンボルの名前を変更
  • clangの「fixits」との統合

これを見てから試してみることにしました talk rtag(およびemacs)を導入してくれました。

(QtCreatorがいくつかのシンボルの名前を適切に変更できなかった場合にのみ、ここまで行ったと言わざるを得ません。これは、この素晴らしいIDEを今のところ使用している場合の

Rtagsでサポートされているものに加えて、次のような追加の機能も必要です。

  • 関数定義/プロトタイプを作成する
  • 抽出機能
  • ゲッター/セッターメソッドを作成する

これらの場合、emacsには semantic-refactor パッケージを使用することをお勧めします(vimの代替手段があるかどうかはわかりません)

一般的に、clangベースのツールは有望veryに見えます。大規模なコードベースを含むプロジェクトなど、C++リファクタリング用のclangツールの詳細に興味がある場合は、Chandler Carruthによる somegreat の講演があります。

3

DMSソフトウェアrengineeringツールキット はこれを行うと思います。これは、大規模向けに設計されたコード変換エンジンであり、C++を処理します。しかし、出力がどれほどエレガントかはわかりません。

3
Saltash Matt

確かに Klocwork を商用コードリファクタリングスイートとして言及する必要があります。デモビデオを見ると、とても有望に見えます。

2
muenalan

問題はC++テンプレートです。 2019年の時点では、C++テンプレートをサポートするリファクタリングツールを認識していません。 VS2019、VisualAssist、Clion、QtCreatorを試しました。

例を考えてみましょう:

#include <iostream>

struct foo { void print() {} };
struct bar { void print() {} };

template <typename T>
void call_print(T&& v) { v.print(); }

void print() {}

int main()
{
    call_print(foo{});
    call_print(bar{});
    return 0;
}

foo::printで名前変更リファクタリングを実行すると、bar::printも自動的に名前変更されます。 call_print関数テンプレートのインスタンス化によってリンクされているためです。

1
random

CLion は非常に有望に見えます。

免責事項:プロジェクトを使用するにはCMake形式にプロジェクトを変換する必要があるため、まだ試していません。

1
Adamski

Lattix を試すことをお勧めします。大規模なC/C++コードベースを分析してアーキテクチャを検出し、問題のある依存関係を特定し、コードをリエンジニアリングしてモジュール性を改善し、技術的な負担を軽減できます。 Lattixは、リファクタリングプロセスを支援する多くのアルゴリズムも提供します。これらのアルゴリズムは、階層のある部分から別の部分に要素を移動する方法、サイクルを破る、サブシステムを移動する方法を見つけて、サブシステムの結合と結合を改善するのに役立ちます。 Lattixが Android Kernel (C/C++の160万LOC)を分析した結果を次に示します。完全な開示:Lattixで働いています

1
S Barow

コードベースを再設計する場合:MOOSE。しかし、それは分析ではなく編集ツールの大規模なコレクションです。

1

遅くなってこの質問を見つけてすみません。私の学生とアシスタントは、2006年頃からC++リファクタリングに取り組んでいます。インフラストラクチャをリファクタリングするCDTのほとんどは、IFSソフトウェア研究所の私のチームによって作成されました。数年以来、私たちはCDTのバージョンであるCevelopにC++コードのモダナイゼーションリファクタリングなどのサポートを提供しています。Cevelopは、ワークスペースが正しく設定されていれば、大きなコードベースで動作します。無料で利用可能 https://cevelop.com

1
PeterSom

MicrosoftのVisual Studio 2013用のC++リファクタリング拡張機能があります。 http://visualstudiogallery.msdn.Microsoft.com/164904b2-3b47-417f-9b6b-fdd35757d194

1
Robert Hegner

Visual C++(Express Editionは無料)を使用している場合は、 www.wholetomato.comのVisual Assist (C++リファクタリング機能へのリンク)を使用できます。

30日間の試用期間があり、Visual C++製品に組み込まれているインテリセンスよりも高速で機能が充実していることがわかりました。

1
JBRWilkinson

間違いなく Resharper Ultimate が道です。幸福を保証:)

2015年3月のベータ版。

0
hdoghmen

Visual Studio 2013の次のプラグインを見つけました: Visual C++ Refactoring by Microsoft。

それは単なる名前変更ツールですが、完璧に機能します。シンボルを右クリックすると、次のコンテキストメニューが追加されます。

enter image description here

0
Zac