ReSharper 2019.1ヘルプ

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

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

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

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

  2. 以下のいずれか 1 つを実行します:
    • メインメニューで、ReSharper | リファクタリング を選択し、目的のリファクタリングを選択します。このメニューで使用可能なリファクタリングのリストは、現在のコンテキストによって異なります。ReSharperがコンテキストのリファクタリングを示唆できない場合、メニュー全体が無効になります。

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

    • メインメニューで、ReSharper | リファクタリング | リファクタリングを選択するか、または Ctrl+Shift+R を押して適用可能なリファクタリングのリストを表示し、それらのいずれかを選択します。また、選択項目のコンテキストメニューでリファクタリングを選択することもできます。

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

  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; };

ネームスペースエイリアスを導入する

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

このリファクタリングを呼び出すには、名前空間の使用箇所でキャレットを設定し、Ctrl+Shift+R を押すか、メニューでReSharper | リファクタリング | リファクタリング…を選択し、リファクタリング pop-upでネームスペースエイリアスを導入するを選択します。ドキュメントに名前空間の使用が複数存在する場合は、現在の使用箇所またはすべての用途を置き換えるかどうかを選択できます。

以下の例では、このリファクタリングを使用して、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 を削除し、そのすべての用途を宣言されたデータ型に置き換えます。

最終更新日: 2019年6月7日

関連事項

関連ページ:

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

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

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

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

ファイル構造ウィンドウ

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

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

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

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

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

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

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