ReSharper 2024.1 ヘルプ

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

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

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

  2. 以下のいずれか 1 つを実行します:

    • メインメニューから ReSharper | リファクタリングを選択し、目的のリファクタリングを選択します。このメニューで使用できるリファクタリングのリストは、現在のコンテキストによって異なります。ReSharper がコンテキストのリファクタリングを提案できない場合、メニュー全体が無効になります。

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

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

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

  3. 選択したリファクタリングにユーザー入力が必要な場合は、リファクタリングウィザードが開きます。ウィザードのダイアログはモーダルではないため、ウィザードが開いている間にコードを編集できます。

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

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

一部のリファクタリングは、エディターでコードを変更した直後に使用できます。詳細については、インプレースリファクタリングを参照してください。

シグネチャーの変更

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

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

Changing signature of a C++ function

スコープ付き列挙型に変換

スコープ付き列挙型に変換リファクタリングは、C スタイルの列挙宣言を C++11 スコープの列挙に変換できます。これを呼び出すには、キャレットを列挙子に置き、リファクタリングメニューからスコープ付き列挙型に変換を選択するか、メインメニューから ReSharper | リファクタリング | 変換 | スコープなし列挙型からスコープ付き列挙型へを選択します。

ReSharper: Convert to Scoped Enum

メソッドの抽出

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

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

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

Extract method in C++: Selecting expression

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

Extract method in C++: Specifying method details

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

Extract method in C++: Extracted method

フィールドの導入

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

専用のショートカット Control+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; };

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

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

このリファクタリングを呼び出すには、名前空間の使用箇所と Control+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; }

typedef の導入 / インライン

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

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

ReSharper: Introduce/Inline typedef refactoring in C++

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

Enum を使用して紹介する

C++20 using enum 構文を使用すると、ターゲット列挙からすべての列挙子を追加できます。その結果、メンバー列挙子を使用するときに、列挙名の繰り返しを省略できます。

Enum を使用して紹介するリファクタリングは、using enum ステートメントの追加に役立ちます。このリファクタリングを呼び出すには、キャレットを列挙子に置き、Control+Shift+R を押すか、メインメニューから ReSharper | リファクタリング | リファクタリング…を選択し、リファクタリングポップアップで Enum を使用して紹介するを選択します。ドキュメント内に列挙型の使用箇所が複数ある場合は、現在の使用箇所を置き換えるか、すべての使用箇所を置き換えるかを選択できます。

ReSharper: Introduce Using Enum

変数の導入

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

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

ReSharper: Introduce Variable

変数のインライン化

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

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

関数のインライン化

このリファクタリングにより、関数呼び出しを関数の本体に置き換えることができます。ReSharper は、必要な変換を実行し、すべての名前の競合を処理し、結果のコードを再フォーマットするか、メソッドをインライン化するのが得策ではない理由を説明する短いポップアップメッセージを表示します。

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

Inline Function

名前変更

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

ReSharper: Rename

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

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

関連ページ:

コンテキストアクション

コンテキストアクションは、エディターで直接利用できるコード変換ヘルパーです。クイックフィックスとは対照的に、コンテキストアクションは問題の解決やコードの改善を目的としているためはなく、アクセス修飾子の変更、null をチェックするコードの生成、'foreach' の 'for' への変換などの小さな変更を素早く導入できます。ReSharper は、サポートされているすべての言語で数百のコンテキストアクションを提供します。完全なリストは、ReSharper オプション Alt+R, O のページとコン...

構造別にファイルを移動する

ReSharper では、ファイル構造ウィンドウを使用して現在のドキュメントの構造を移動でき、大きなファイルでのナビゲーションが大幅に簡素化されます。ウィンドウはエディターと同期されます。別のエディタータブに切り替えると、ウィンドウには対応するファイルの構造が表示されます。ファイル構造ウィンドウを開いて使用するを押すか、メインメニューからを選択します。または、を押して、ポップアップにコマンド名を入力し、そこで選択することもできます。現在のドキュメントの内容はツリー構造で表示され、ドキュメント内...

デフォルトのキーボードショートカットスキーム

すべての ReSharper アクションは、キーボードショートカットで呼び出すことができます。ほとんどのアクションには既定のショートカットがあり、そのまま使用できます。残りのアクションでは、必要に応じて、好きなショートカットキーを割り当てることができます。ReSharper は、2 つのデフォルトのキーボードショートカットスキームを提供します。Visual Studio — このスキームは、Visual Studio 独自のキーボードショートカットとの競合を最小限に抑えることを目的としています。I...

キーボードショートカットを設定する

すべての ReSharper アクションは、キーボードショートカットで呼び出すことができます。ほとんどのアクションには既定のショートカットがあり、そのまま使用できます。残りのアクションでは、必要に応じて、好きなショートカットキーを割り当てることができます。ReSharper は、2 つのデフォルトのキーボードショートカットスキームを提供します。Visual Studio — このスキームは、Visual Studio 独自のキーボードショートカットとの競合を最小限に抑えることを目的としています。I...

リファクタリングの競合を解決する

ReSharper のすべてのリファクタリングはソリューション全体に適用されるため、多くのファイルが影響を受ける可能性があり、一部の変更は既存のコードと競合する可能性があります。競合がある場合、ReSharper はそれらを検出し、リファクタリングウィザードの最後のページに競合のリストを表示します。例: 安全な削除リファクタリングをメソッドに適用するときに表示されるいくつかの競合を次に示します。競合には 2 つの型があります。コンパイルを中断することなく削除できる使用箇所は、アイコンでマークされて...

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

一部のリファクタリングは、コマンドを呼び出さずに適用できます。エディターでコードを変更するだけで十分です。変更がコードをリファクタリングするためのインテンションである可能性があることを ReSharper が検出すると、変更されたコードの周囲に灰色の境界線が表示され、対応するアクションインジケーターが左側に表示されます。このアクションを使用して、ソリューション全体にリファクタリングを適用できます。以下のリファクタリングがその場で利用可能です: 名前変更:エディターで宣言の権利を変更し、クイックフ...