ReSharper 2019.3ヘルプ

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 | リファクタリング | リファクタリング…を選択して、リファクタリングポップアップでネームスペースエイリアスを導入するを選択します。ドキュメントに名前空間の使用が複数ある場合、現在の使用を置き換えるか、すべての使用を置き換えるかを選択できます。

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

typedef の導入リファクタリングで typedefの代わりにタイプエイリアスを使用する場合は、ReSharperオプション(Alt+R,,O)のコード編集 | С++ | コード・スタイルページで対応するチェックボックスを選択します。詳細については、Microsoft Docsのエイリアスとtypedef(C++)(英語)を参照してください。

最終更新日: 2019年12月12日

関連ページ:

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

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

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

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

ファイル構造ウィンドウ

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

キーボードショートカットを構成する

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

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

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

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

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