機能するC ++リファクタリングツールはありますか?[閉まっている]


161

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

私はここ数年、何度も何度も見つけられるものを試しました:SlickEdit、Eclipse CDT。それらはすべてまったく使用できませんでした。

概要:私は時間をかけて「Visual Assist X」および「C ++のリファクタリング」を評価しました。どちらにもいくつかの印象的な機能がありますが、どちらも完璧とはほど遠いものです。通常、コードの大きなブロックを抽出することは、手動での変更なしでは満足のいくものではありません。そのため、効果はありません。

「Visual Assist X」には、より完全なオートコンプリートなどの優れた機能があります。ただし、特定のポイントでちらつきが多くなり、速度が大幅に低下します。

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

UPDATE 2015年3月 hdoghmensの返信については、今日、C ++用のResharperを試しました。彼のリンク 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 ++がメインページにリストされていない理由です。

私の意見では、この質問への答えはまだ「いいえ」です。


11
これはお気に入りです。C ++の問題は、その非常に複雑で状況依存の構文です。ソース全体を実際に解析しないと、識別子の意味がわかりません。
DevSolar 2009

次も参照してください:stackoverflow.com/questions/249827/…しかし、提供するものは多くありません
dmckee ---元モデレーターの子猫09/09/07

4
Eclipseは、実際にはかなりうまく動作しますが、あなたはちょうどそれがeclipse.iniを編集することにより、より多くのメモリを使用できるようにする必要があります
n0rd

3
C ++のリファクタリングツールを引き続き監視している場合は、JetBrainsが現在、ReSharper別のクロスプラットフォームC ++ IDE
Jura Gorohovsky

1
有名な@RED SOFT ADAIR。このチェックyoutu.be/RT46MpK39rQ?t=1611
ジョージ・C.

回答:


38

私が見つけXアシストビジュアル非常に便利なのVisual Studioと。もう1つの選択肢は、C ++用のリファクタリングです


8
残念ながら、C ++のリファクタリングは、大規模なコードベースでは(たとえあったとしても)うまく機能しません。
ダニエルローズ

1
C ++および大規模なコードベースのリファクタリングでは具体的にどうなりますか?
Ira Baxter、

2
@IraBaxter壊れているだけです。リファクタリングオプションが表示されないか、完了しません。奇妙なエラーメッセージがあるか、まったくありません。
Daniel Rose

4
C ++のリファクタリングは、小さなコードベースでもうまく機能しません。壊れており、まったく使用できません。
kovarex

3
@ニルス:理解できないことの具体的な例を提供できますか?
Ira Baxter 2013年

41

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


23

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

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


2
しかし、Googleの外の単なる人間が使用できるという結果はありますか?
Jan Hudec

1
@JanHudec:ここからリンクされているチュートリアルチェックアウト:comments.gmane.org/gmane.comp.compilers.clang.devel/23203
HighCommander4

17

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

* nixの土地から来た場合は豚肉が役に立ちます。VisualStudioの場合は、Visual Assistもお勧めします。


9

当社のDMSソフトウェアリエンジニアリングツールキットは、C ++を含むコードの大きな本体に対して複雑な変換を実行するように設計された変換エンジンです。何百万行ものコードのシステムで信頼できる変更を行うために使用されています。コンパイラーに正確な言語アナライザーとトランスフォーマーを使用して動作します。

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

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

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(「Texas」でセマンティックデザインを探してください)を 参照してください。急いで結果を期待しないでください。これは、ツールを取得するための3段階の複数年プログラムの始まりにすぎません。

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

EDIT 1/4/2012:C ++コードの完全な制御フロー分析を行います。

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


ダウンロードページにこのツールを評価するためのリンクがないようですsemanticdesigns.com/Products/RegisterEval.html現在、VS2010またはVS2008の試用版と価格はありますか?
SmacL 2012

リファクタリングツールについては、「急いで結果を期待しないでください」。フェーズIのR&Dタスクが終了し、フェーズIIの資金を申請しています。DMSとその評価方法については、会社に問い合わせてください。エンタープライズOracleがダウンロード項目ではないのと同じように、「ダウンロードして評価」するようなものではありません。
Ira Baxter

... DMSはVS2008 / VS2010を変換できますが、対話型ツールとしては変換できません。また、プリプロセッサディレクティブに関して制限があります。(良いニュースは、私たちはこれらの主要な問題を解決したと考えており、フェーズIIのR&Dプログラムにそれを適用する予定です)。
Ira Baxter

フィードバックに感謝しますが、私が求めている種類のツールのようには見えません。私はインタラクティブである必要はありません。大規模なコードベースでかなりシンプルな変換を実行できるもので、腕と脚にコストをかけずに実行できます。VisualAssistは近いですが、少し先に進む必要があります。
SmacL 2012

3
... DMSの目的は、「リファクタリング」か「ノー」かにかかわらず、コーディングとエラーのないコード変換の適用を可能にすることです。はい、それは難しいです、そして私たちはまだそこにいません。私たちは、C ++で見た他のどのツールよりもIMNSHOに近く、ツールの基礎には何の問題もありません。残っているのは、プリプロセッサの厄介な問題、コードスケール、C ++のセマンティクスを適切にコーディングしてそのような変換を可能にする努力です。そして、これがBIGプロジェクトであると私が最初に言うでしょう。
Ira Baxter

8

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


6

現在、私がお勧めすることはできません任意の Cのためのリファクタリングツールを++、確かではない100kのラインと上記の大規模なコードベースのため。これがOPのように変わることを期待しており、いつか何かがあることを願っています。本当に優れたツールが表示される前に、言語自体を大幅に変更する必要があるのではないかと心配です。

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


C ++ 2011標準のリリースにより、言語大幅に変更されました。すべてのユーザーがすべての高度な言語機能リファクタリング機能を必要とするため、追加の複雑化により問題は難しくなり、簡単にはなりません:-{
Ira Baxter

2
最近Slickeditの機能を読んだところ、ヒューリスティック手法による名前の使用に対応する定義を決定しているようです。「正しい」C ++名の検索は行いません。つまり、その変換が正しいとは信じられません。作業内容を確認してもかまわない場合は、これで問題ありません。本当に大きなソフトウェアパッケージでは、これはおそらく良くありません。私の意見。
Ira Baxter

3

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


1
DMSは、C ++コードの大きな本体の再設計を自動化するために使用されています。Akers、R.、Baxter、I.、Mehlich、M.、Ellis、B.、Luecke、K.、Case Study:Re-engineering C ++ Component Models via Automatic Program Transformation、Information&Software Technology 49(3):275 -2912007。発行元から入手可能
Ira Baxter

「エレガントな出力」とはどういう意味ですか。DMSから得られる出力は、それを与えるもの、および適用する変換に明らかに依存します。変換がコードの一部に触れない場合、コードのその部分は、元の場所と同じようにエレガントであるか、そうではありません。コードに触れた場合、エレガンスは、コーダーの手動による変更と同様に、変換の巧妙さによって決まります。私はこれが優雅であるとは思いませんが、結果のフォーマットは「忠実な」印刷(元のフォーマット)か、定義されたprettyprintingスタイルのいずれかになります。
Ira Baxter

3

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

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

rtags(とemacs)を紹介してくれたこの講演を見て、試してみることにしました。

(私がここまで行ったのは、QtCreatorが一部のシンボルの名前を正しく変更できなかった後です。これは、現時点でこの優れたIDEを使用するためのショーストッパーです)

rtagsでサポートされているものに加えて、次のような追加のきちんとした機能も必要です。

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

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

一般的に、clangベースのツールは非常に有望に見えます。あなたが大規模なコードベースのプロジェクトのために含むC ++リファクタリングのための打ち鳴らすツール、詳細情報に興味がある場合は、そこにあるいくつか の素晴らしいチャンドラーCarruthによって協議が。


2

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


2

問題は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;
}

Rename Refactoringをで実行するとfoo::printbar::printも自動的に名前が変更されます。call_print関数テンプレートのインスタンス化を通じてリンクされているためです。


1

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

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


2
エクスプレス版でプラグインを使用できるとは思いませんでした
Yacoby

3
私は確かに過去にVS C ++ ExpressでVAをインストールしようとしましたが、うまくいきませんでした。
quamrana 2009

Visual Studioプラグインを分離モードでインストールすることはできません(ExpressエディションはすべてIDEを分離モードで実行します)。学生の場合DreamSparkまたはMSDNAA からVisual Studioのフルバージョンをダウンロードできます。
Billy ONeal、2011

1

コードベースを再設計する場合:MOOSE。しかし、それはエディターではなく、分析およびリエンジニアリングツールの大規模なコレクションです。




1

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

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


1

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


1

遅くなってこの質問を見つけてすみません。私の生徒とアシスタントは2006年頃からC ++リファクタリングに取り組んでいます。ほとんどのCDTリファクタリングインフラストラクチャは、IFSソフトウェア研究所のチームによって構築されました。数年前から、CevのバージョンのCDTにC ++コードの近代化リファクタリングなどのサポートを提供しています。https://cevelop.comで無料で入手可能


とても興味深い。ダウンロードしたのですが、起動しません。github.com/Cevelop/Issues/issues/84を
RED SOFT ADAIR

0

Visual Studio 2013用の次のプラグインを見つけました: MicrosoftによるVisual C ++ Refactoring

これは単なる名前変更ツールですが、問題なく動作します。シンボルを右クリックすると、次のコンテキストメニューが追加されます。

ここに画像の説明を入力してください

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.