ReSharper 2019.2ヘルプ

C++のリファクタリング

ReSharperは、C++に対して以下のリファクタリングを提供します。

リファクタリングを実行する

  1. キャレットをシンボルに設定するか、リファクタリングするコードフラグメントを選択するか、ツールウィンドウで項目を選択します。

  2. 以下のいずれか 1 つを実行します:
    • メインメニューでReSharper | リファクタリング を選択してから、必要なリファクタリングを選択します。このメニューで利用可能なリファクタリングのリストは現在の状況に依存します。ReSharperがコンテキストのリファクタリングを提案できない場合は、メニュー全体が無効になります。

    • エディター、ファイル構造ウィンドウ、またはその他のReSharperウィンドウで、変換したい項目を右クリックし、コンテキストメニューからリファクタリングを選択してから、必要なリファクタリングを選択します。

    • メインメニューでReSharper | リファクタリング | リファクタリングを選択するか、または Ctrl+Shift+R を押して該当するリファクタリングのリストを表示し、そのうちの1つを選択します。選択のコンテキストメニューでリファクタリングを選択することもできます。

    • 特定のリファクタリングに割り当てられているデフォルトのキーボードショートカットを使用するか、お気に入りのリファクタリングコマンドにカスタムショートカットを割り当てます。

  3. 選択したリファクタリングにユーザ入力が必要な場合は、リファクタリングウィザードが開きます。ウィザードのダイアログはモーダルではないため、ウィザードが開いている間にコードを編集できます。
    リファクタリングアクションをロールバックするために、ウィザードはオプション元に戻すを有効にするには、変更のあるすべてのファイルを編集用に開きますを提供します。このオプションを選択すると、ReSharperはすべての修正ファイルを新しいエディタータブで開き、リファクタリングをロールバックすることができます。この場合は、自分で変更を保存する必要があります。このオプションが選択されていない場合、ReSharperは修正ファイルを開かずに自動的に保存します。

  4. リファクタリング操作によってコードの競合(名前の重複、可視性の競合など)が発生する場合、ウィザードは、リファクタリングを適用する前に、最後の手順で競合のリストを表示します。一部の競合では、ウィザードはクイックフィックスを提案することもできます。詳しくは、リファクタリングで競合を解決を参照してください。

エディターでコードを変更した直後に利用できるリファクタリングもあります。詳しくは、インプレース・リファクタリングを参照してください。

シグネチャーの変更

シグネチャーの変更リファクタリングでは、関数のシグネチャーに対して1つ以上の異なる変更を加えることができます。関数のすべての用途、実装、オーバーライドはそれに応じて更新されます。

専用のショートカット Ctrl+F6を使用してこのリファクタリングを呼び出すこともできます。

Changing signature of a C++ function

メソッドの抽出

このリファクタリングでは、選択したコードフラグメントに基づいて新しいメソッドを作成できます。ReSharperは選択されたステートメントを分析し、メソッドパラメータに変換するか、その戻り値を表す変数を検出します。

専用のショートカット Ctrl+Alt+Mを使用してこのリファクタリングを呼び出すこともできます。

別の方法の判別式を計算するロジックを抽出するとします。

Extract method in C++: Selecting expression

メソッドの抽出ダイアログでは、メソッドの引数を選択し、戻り値を選択して結果のメソッドをプレビューできます。

Extract method in C++: Specifying method details

次へをクリックするとすぐに、新しいメソッドが作成され、選択された式がメソッド呼び出しに置き換えられます。

Extract method in C++: Extracted method

フィールドの導入

このリファクタリングでは、選択した式に基づいて新しいフィールドを作成し、式またはコンストラクターで初期化し、現在のタイプの式の出現を新しく導入されたフィールドへの参照に置き換えることができます。

専用のショートカット Ctrl+Alt+Dを使用してこのリファクタリングを呼び出すこともできます。

以下の例では、このリファクタリングを使用して、同じ文字列の2つの出現箇所を新しいプライベートフィールドに置き換え、既存のコンストラクターから初期化します。

リファクタリング前

リファクタリング後

#include <exception> #include <iostream> class ErrorHandler { ErrorHandler() { } public: void logError(std::exception& e) { auto errorLogFIle = fopen("log.txt", "w"); fprintf(errorLogFIle, "Something has failed: %s", e.what()); fclose(errorLogFIle); } void printError(std::exception& e) { printf("Something has failed: %s", e.what()); } private: };
#include <exception> #include <iostream> class ErrorHandler { ErrorHandler(): error_message("Something has failed: %s") {} public: void logError(std::exception& e) { auto errorLogFIle = fopen("log.txt", "w"); fprintf(errorLogFIle, error_message, e.what()); fclose(errorLogFIle); } void printError(std::exception& e) { printf(error_message, e.what()); } private: const char* error_message; };

ネームスペースエイリアスの紹介

このリファクタリングは、名前空間の使用箇所の名前空間エイリアスを作成し、現在選択されている使用箇所または現在の文書のすべての用途をエイリアスに置き換えるのに役立ちます。選択された用途に応じて、ネームスペースエイリアスは、使用可能な範囲内で最も近い範囲で宣言されます。

To invoke this refactoring, set the caret at a namespace usage and press Ctrl+Shift+R or choose ReSharper | リファクタリング | リファクタリング… in the menu, and then select ネームスペースエイリアスを導入する in the リファクタリング popup. If there are multiple occurrences of the namespace usage in the document, you will be able to choose whether to replace the current usage or all usages.

以下の例では、このリファクタリングを使用して、SpaceOne::SpaceTwo 名前空間の名前空間エイリアスを追加します。

リファクタリング前

リファクタリング後

namespace SpaceOne { namespace SpaceTwo { int ten = 10; inline void foo() { // do something } } } inline int test() { SpaceOne::SpaceTwo::foo(); return SpaceOne::SpaceTwo::ten; }
namespace SpaceOne { namespace SpaceTwo { int ten = 10; inline void foo() { // do something } } } inline int test() { namespace s_two_alias = SpaceOne::SpaceTwo; s_two_alias::foo(); return s_two_alias::ten; }

変数を導入する

このリファクタリングでは、選択した式に基づいて新しいローカル変数を作成し、式で初期化し、最後にメソッド内の式のすべてを新しく導入した変数への参照に置き換えることができます。

専用のショートカット Ctrl+Alt+Vを使用してこのリファクタリングを呼び出すこともできます。

変数のインライン化

このリファクタリングでは、コード内の変数のすべてをその初期化子で置き換えることができます。リファクタリングは、初期化後に変数値が変更されない場合にのみ適用される必要があることに注意してください。

専用のショートカット Ctrl+Alt+Nを使用してこのリファクタリングを呼び出すこともできます。

名前変更

ほとんどのtime-consumingリファクタリングの1つがC++でサポートされています。シンボルの名前を変更すると、手動で行うと多くの問題が発生する可能性があります。名前変更リファクタリング(専用の F2 ショートカットでも使用可能)を呼び出すと、すべてのチェックはReSharperによって行われます。コンフリクトがない場合は、すべての変更がスムーズに実行されるか、手動で解決できるコンフリクトのリストが表示され、必要な変更のみが行われるようにします。

このリファクタリングを使用してクラスの名前を変更すると、ReSharperは対応するファイル(ソースとヘッダー)の名前を自動的に変更します。

ソリューションエクスプローラーのファイルでこのリファクタリングを呼び出すこともできます。ファイルの新しい名前を指定するとすぐに、ReSharperはインクルードの中のすべての使用箇所を更新します。

導入/インラインtypedef

typedef の導入リファクタリングを使用すると、選択したデータ型の typedef をすばやく作成し、選択したデータ型とオプションで現在のファイル内のこのデータ型のすべてを新しく作成した typedefで置き換えることができます。

Typedef のインライン化リファクタリングは正反対です。選択した typedef を削除し、そのすべての用途を宣言されたデータ型に置き換えます。

If you want the typedef の導入 refactoring to use type alias instead of typedef , select the corresponding checkbox on the コード編集 | С++ | コード・スタイル page of ReSharper options ( Alt+R,,O ). For more information, see Microsoft Docsのエイリアスとtypedef(C++)(英語) .

最終更新日: 2019年8月16日

関連事項

関連ページ:

コンテキスト・アクション

コンテキストアクションのいくつかの例をReSharperWebサイトでチェックすることができます。コンテキストアクションは、エディターで直接利用できるコード変換ヘルパーです。クイックフィックスとは対照的に、コンテキストアクションは問題の解決やコードの改善を目的としているためはなく、アクセス修飾子の変...

C++のコンテキストアクション

ReSharperはCppに次のコンテキストアクションを提供します。名前説明定義なしで関数に '= default'指定子を追加する定義されていない関数をデフォルトとしてマークします。定義なしで関数に '= delete'指定子を追加する定義なしで関数を削除済みとしてマークします。定義なしで仮想関数...

ファイル構造ウィンドウ

ReSharperでは、ファイル構造ウィンドウを使って現在のドキュメントの構造をナビゲートすることができます。これは大きなファイルでのナビゲーションを非常に簡単にします。ウィンドウはエディターと同期しています。別のエディタータブに切り替えると、ウィンドウには対応するファイルの構造が表示されます。ファ...

キーボードショートカットの設定

すべてのReSharperアクションは、キーボードショートカットで呼び出すことができます。ほとんどのアクションには既定のショートカットがあり、そのまま使用できます。残りのアクションでは、必要に応じて、好きなショートカットキーを割り当てることができます。ReSharperは2つのデフォルトのキーボード...

リファクタリングで競合を解決

ReSharperのすべてのリファクタリングはソリューション全体に適用されるため、多くのファイルが影響を受ける可能性があり、一部の変更は既存のコードと競合する可能性があります。競合がある場合、ReSharperは検出し、リファクタリングウィザードの最後のページに競合のリストを表示します。例:安全な削...

インプレース・リファクタリング

リファクタリングの中には、コマンドを呼び出さずに適用できるものがあります。エディターでコードを変更すれば十分です。ReSharperが、変更がコードをリファクタリングするためのインテンションである可能性があることを検出すると、変更されたコードの周囲に灰色の枠線が表示され、対応するアクションインジケー...