リファクタリング

ReSharperのリファクタリングセットは、数、使い勝手、適用範囲の面で、Visual Studioが提供する機能を上回っております。リファクタリングでは毎回、異言語間のコードを含め、適用対象となるコード全体(ソリューション全体と同程度の範囲)を解析し、その解析データを基に、可能な限りインテリジェントにコードを更新いたします。

ReSharper のリファクタリング機能はすべて C# で使用できます。また、その大部分は VB.NET で、一部は ASP.NET、XAML および他のサポート対象言語でも使用できます。

また、ReSharperのコンテキストアクションもチェックしてみてください。これはあまり洗練されたものではなく、主にローカルなコード変換を行うもので、Martin Fowlerが定義する意味での真のリファクタリングを実装したものではありません。

C#の「これをリファクタリング」メニュー

コードリファクタリングの使用

リファクタリングを使用するには、次の場所にキャレットを置いてください:

  • テキストエディタ内のシンボル。
  • テキストエディタ内のコード選択領域。
  • ソリューションエクスプローラーツールウィンドウ内のファイルまたはファイル選択領域。
  • File Structureまたは別のReSharperツールウィンドウ内の型メンバーまたは型メンバーの選択領域。

その後、ReSharperのRefactorメニューから、または個別のキーボード ショートカットを使用すると必要なリファクタリングを呼び出せます。または、Ctrl+Shift+RRefactor Thisコマンドを呼び出すと、現在のキャレット位置 または選択領域で適用可能なリファクタリングが 表示されます。

ReSharperでの署名の変更リファクタリング

署名の変更

このリファクタリングでは、以下の方法でメソッドの署名を変更できます:

  • パラメータの追加、削除、名前の変更、並べ替え
  • 戻り値の型の変更
  • パラメータの型の変更
  • メソッドの名前を変更

署名の変更と共に、ReSharperは該当メソッドの使用箇所をすべて検索し、該当メソッドのすべての呼び出し、実装、オーバーライドを修正し、変更を反映させます。新たに追加されたパラメータの場合、ユーザーによって割り当てられたそれらのデフォルト値はすべてのメソッド呼び出しで置き換えられます。オーバーライドでは、メソッドに渡された元のパラメータは基底クラスの呼び出しに渡されます。

ReSharperでの「拡張メソッドを静的に変換」リファクタリング

Convert Extension Method to Plain Static(拡張メソッドを普通の静的メソッドに変換)

ダイアログのないこのリファクタリングは、同じクラス内で拡張メソッドを静的メソッドに変換します。逆の動作を行う機能は、静的メソッドから拡張メソッドに変換が提供しています。

Convert Static to Extension Method(静的メソッドを拡張メソッドに変換)

このリファクタリングは、静的メソッドを拡張メソッドに変換します。変換が正常に完了すると、静的メソッドは、(1) 少なくとも1つの引数を持ち、(2) 静的クラスに属することになります。逆の動作を行う機能は、Convert Extension Method to Plain Staticが提供しています。

ReSharperのリファクタリングを使った、インターフェースの抽象クラスへの変換

Convert Interface to Abstract Class(インターフェースを抽象クラスに変換)

このリファクタリングは、インターフェースにロジックを追加したり、クラスにした方が良いと思われる場合に使用すべきです。このリファクタリングは競合、つまり、すでに基本型を持っているインターフェースを実装した型をチェックします(多重継承できないC#ではエラーになります)。

Convert Abstract Class to Interface(抽象クラスをインターフェースに変換)

このリファクタリングを適用すると、抽象クラスをインターフェースに変換できます。これは、あるクラスを1つ以上の抽象クラスから継承させ、それらの抽象クラスの1つをインターフェースに変換する必要がある場合に、特に役立ちます。

ReSharperでのスーパークラスの抽出リファクタリング

Extract Superclass(スーパークラスの抽出)

このリファクタリングを使うと、あるクラスの基底クラスを作成して一部のメンバーをその中に移動できます。クラスの宣言部にキャレットを置き、抽出したいメンバーを選択してリファクタリングを実行するだけです。ロジックを後で共有できるよう、上位の継承階層内に移動すると非常に便利です。

ReSharperでのパラメータの導入リファクタリング

Introduce Parameter(パラメータの導入)

メソッド内の式またはローカル変数を選択し、このリファクタリングを使うと、そこから新しいパラメータが作成されます。すべての呼び出しサイトが更新され、署名の変更が反映される一方で、ロジックとセマンティクスは維持されます。

式が、呼び出しサイトでアクセスできないローカル変数を使用する場合、このリファクタリングを使うとそれらをデリゲートとして渡せます。

Make Method Static/Shared(メソッドの静的化/共有化)

このリファクタリングは、thisをメソッドのパラメータにすることで、非静的メソッドを静的メソッド(VB.NETのShared)に変換します。リファクタリング後、対象のメソッドはstatic(VB.NETのShared)として宣言され、必要なパラメータがその呼び出しサイトに追加されます。また、このリファクタリングは非静的メソッド(VB.NETではSharedではないもの)を移動する場合にも便利です。この場合、「メソッドを静的化」を「メソッドを非静的にする」リファクタリングの準備段階として使用してください。

Make Method Non-Static/Non-Shared(メソッドの非静的化/非共有化)

このリファクタリングは、静的メソッド(VB.NETのShared)を、選択したパラメータの型のインスタンスメソッドに変換し(すなわち、該当メソッドをパラメータの型に移動し、パラメータをthisに変換)、それに応じてメソッドの呼び出しを変換します。

Move Instance Method(インスタンスメソッドの移動)

このリファクタリングを使うと、インスタンスメソッドを現在の型からメソッドのパラメータに表示される型のいずれかにすばやく移動できます。

Move Static Member(静的メンバーの移動)

このリファクタリングは、静的フィールドやメソッドを別の型に移動します。非静的メソッドを移動する場合は、インスタンスメソッドの移動を代わりに使ってください。

Move String to Resource(文字列をリソースに移動)

ReSharperの国際化機能の一つであるこのリファクタリングは、ローカライズ可能な文字列をリソースファイルに抽出するのに役立ちます。リファクタリング中、明確に文字列が使用されている箇所はリソースラッパーへの参照と置き換えられます。

このリファクタリングは専用のショートカット、またはこれをリファクタリングコマンドで呼び出せます。しかし、ReSharperはコードインスペクションとしてリソースファイルに移されていない文字列をハイライト表示し、文字列をリソースに移動リファクタリングをクイックフィックスとして提案することもできます。これを実行できるように ReSharper を構成する方法については、ReSharper のヘルプをご覧ください。

Pull Members Up(メンバーのプルアップ)

このリファクタリングは、型メンバーをスーパークラスやインターフェースに移動するのに役立ちます。この操作は動作を一般化する方法として役立ちます。 ReSharperは、現在のクラス内にあるすべてのメンバーを解析し、プルアップ可能なメンバーの一覧を作成します。リファクタリングを完了する前に、ReSharperは、スーパークラスに移動しようとしているメンバーが目的の型でアクセス可能になるかどうかなど、潜在的な競合もチェックします。逆の動作を行う機能は、メンバーのプッシュダウンで実行できます。

Push Members Down(メンバーのプッシュダウン)

このリファクタリングは型メンバーをサブタイプに移動し、型階層をクリーンアップするのに役立ちます。この操作は動作を特殊化する方法として役立ちます。 ReSharperは、選択した型のすべてのメンバーを解析し、プッシュダウン可能なメンバーの一覧を作成します。リファクタリングを完了する前に、ReSharperは、プッシュダウンしようとしているメンバーが目的の型でアクセス可能になるかどうかなど、潜在的な競合もチェックします。逆の動作を行う機能は、メンバーのプルアップで実行できます。

ReSharperでのパラメータのプルリファクタリング

Pull Parameter(パラメータのプル)

メソッドに新しいパラメータを追加する際(クイックフィックスChange Signatureリファクタリングのいずれかを使った場合)、ReSharperは署名と該当メソッドの使用箇所をすべて更新するだけでなく、該当メソッドが含まれる呼び出しチェーンを解析し、該当チェーン内の任意の場所に新しいパラメータを「引き寄せ」られるようにします。

XAMLでの名前の変更リファクタリング

名前の変更

名前の変更リファクタリングを使うと、名前空間、型、メソッド、パラメータ、ローカル変数、プロパティ、フィールド、イベントなどの任意のシンボル名を変更できます。また、シンボルに対するすべての参照箇所を検出し、修正します。名前の変更リファクタリングはエディタから直接、および時々その他のビュー(クラスビュー、オブジェクトブラウザ)から呼び出せます。

名前の変更は C#、VB.NET、ASP.NET、XML、XAML、およびビルドスクリプトを含むすべてのサポート対象言語と技術に対応しています。

名前の変更リファクタリングを使用する際、XAMLマークアップでも完全に、参照箇所を自動修正できるようになりました。また、名前空間エイリアスやリソースなどの特定のXAMLシンボルの名前を簡単に変更できます。

ビルドスクリプトの場合、ReSharperでプロパティやターゲットの名前を変更する際には、その参照箇所のみならずコメントや文字列内の使用箇所もすべて自動的に更新され、変更が反映されます。

ReSharperでのパラメータの変換リファクタリング

Transform Parameters(パラメータの変換)

このリファクタリングは新しいクラスや構造体を作成し、選択したメソッドのパラメータを、新しく作成された型のカプセル化されたフィールドに変換します。パラメータの使用箇所は、作成された型のプロパティを使用するように変換されます。

また、outパラメータの削除もできます。voidメソッドの場合、1つ以上のoutパラメータを、必要に応じてタプルオブジェクトを使用するreturnに変換します。また、非voidメソッドの場合も、タプルオブジェクトを使用して、それらのパラメータを既存の戻り値の型と組み合わせることができます。

パラメータの変換リファクタリングは、outパラメータの変換パラメータからクラスを抽出という2つのリファクタリングを組み合わせ、置き換えます。

Replace Constructor with Factory Method(コンストラクタをファクトリメソッドで置換)

このリファクタリングはコンストラクタを、あるクラスの新しいインスタンスを返す静的メソッドでカプセル化します。

ファクトリメソッドパターンは、作成されるオブジェクトの正確なクラスを指定せずにオブジェクトを作成する方法です。 ReSharperは作成したオブジェクトに独立したメソッドを作成します。サブクラスでは該当メソッドをオーバーライドして、作成されるオブジェクトの派生型を指定できます。

Use Base Type where Possible(可能であれば基本型を使用する)

このリファクタリングでは、特定の型が使用されている箇所を、可能な部分で(つまり派生型のメンバーが使用されていない部分で)、基本型かインターフェースへの参照に置き換えてコードを一般化します。これは特に、メンバーを引き上げるリファクタリングの後で役立ちます。

型のコピー

この機能を使うと、ほんの数秒で型のコピーを異なる名前で作成したり、別の名前空間内に作成したりできます。 ReSharperはそのために個別のファイルを作成します。 partial型の場合、すべての部分が(仮に別々のファイルに別れていても)コピーされます。

Convert Anonymous to Named Type(匿名型を名前付き型に変換)

このリファクタリングは、現在のメソッド内(ローカル)またはソリューション全体(グローバル)の範囲で、匿名型を名前付き型に変換します。このリファクタリングのダイアログボックスでは、ReSharperが自動プロパティまたはバッキングフィールドを持つプロパティを生成するかどうかを指定できます。また、equalityメソッドとformatメソッドのオーバーロードを生成するかどうかも指定できます。

Convert Indexer to Method(インデクサーをメソッドに変換)

このリファクタリングはConvert Property to Methodによく似た機能を提供しますが、その適用対象はインデクサー(VB.NETのデフォルトプロパティ)です。 getterのみ、setterのみ、あるいは両方をメソッドに変換できます。逆の動作を行う機能は、メソッドをインデクサーに変換が提供しています。

Convert Method to Indexer(メソッドをインデクサーに変換)

これはインデクサーをメソッドに変換の逆です。これはダイアログなしで動作しますが、インデクサーでgetterとsetterの両方を生成するには、2つのメソッドに適用する必要があるかもしれません。

Convert Method to Property(メソッドをプロパティに変換)

このリファクタリングを使うと、パラメータのない非voidメソッドを読み取りアクセス権限のあるプロパティに、厳密に1つのパラメータを持つvoidメソッドを書き込みアクセス権限のあるプロパティに変換できます。対になったメソッドは、単一の読み取り/書き込みプロパティに変換できます。

Convert Property to Auto-Property(プロパティを自動プロパティに変換)

このリファクタリングを使うと、privateバッキングフィールドを持つプロパティを自動実装プロパティ(自動プロパティとしても知られる)に変換できます。このリファクタリングはバッキングフィールドを削除して、その使用箇所すべてを新たに作成した自動プロパティで置き換えます。

ReSharperでの「プロパティをメソッドに変換」リファクタリング

Convert Property to Method(プロパティをメソッドに変換)

このリファクタリングを使うと、読み取りアクセス権限のあるプロパティはgetter型のメソッド(パラメータのない非voidメソッド)に変換され、書き込みアクセス権限のあるプロパティはsetter型のメソッド(厳密に1つのパラメータを持つvoidメソッド)に変換されます。読み書き両方のアクセス権限のあるプロパティについては、getter型とsetter型メソッドのペアに変換できます。

ReSharperでの「クラスの抽出」リファクタリング

Extract Class(クラスの抽出)

実際には2つの異なるクラスを使って実行すべき処理を行っているクラスがありますか?このリファクタリングを使って、込み入ったクラスを個別の役割を持つ2つのクラスに分解してください。クラスの抽出は、選択したメソッドとフィールドを古いクラスから新しいクラスに移動するのに役立ちます。また、依存関係の破損やアクセスに関する問題を警告し、競合の解決方法を提案いたします。

Extract Interface(インターフェースの抽出)

このリファクタリングを使うと、あるクラスからインターフェースを作成して、該当クラスに作成したインターフェースを実装させることができます。インターフェースに抽出するメンバーを選択し、インターフェース名を指定できます。

Extract Method(メソッドの抽出)

コードブロックを選択してメソッドの抽出リファクタリングを呼び出すと、そのコードブロックをメソッド(VB.NETのSubまたはFunction)に変換できます。 ReSharperは自動的にコードを解析して、戻り値やout/refパラメータを検出します。

Introduce Field(フィールドの導入)

式またはローカル変数を選択してこのリファクタリングを適用してください。すると、新しいフィールドや定数が作成され、式またはローカル変数初期化子でそれが初期化されます。フィールドはその初期化子、型コンストラクタまたは現在のメンバーで割り当てられます。

Inline Field(フィールドのインライン化)

一回しか書き込まないフィールドがある場合、このリファクタリングは該当フィールドの読み込み箇所を、その初期化式で置換し、フィールドの宣言部と書き込み部分をまとめて削除します。

Encapsulate Field(フィールドのカプセル化)

フィールドのカプセル化リファクタリングを使うと、既存のフィールドからアクセサプロパティをすばやく作成できます。該当フィールドの使用箇所は、プロパティの使用箇所と自動的に置換されます。このリファクタリングには、プロパティを使用したフィールドへの直接アクセスを禁止できるという、明確な利点があります。

Inline Method(メソッドのインライン化)

このリファクタリングを使うと、可能な限り、メソッドの本文を呼び出し元の本文に移動し、該当メソッドを完全に削除できます。逆の動作を行う機能は、メソッドの抽出が提供しています。

ReSharperのリファクタリングを使った変数の導入

Introduce Variable(変数の導入)

メンバーコード内の任意の式を選択し、変数の導入リファクタリングを呼び出してください。新たに暗黙的または明示的に型指定されたローカル変数が宣言され、選択した式で初期化されます。元の式は変数名で置換されます。コード内に元の式が複数箇所存在する場合、それらを新たに作成された変数に置換するかどうかを選択することができます。同様に、定数式に定数を導入することもできます。

Inline Parameter(パラメータのインライン化)

このリファクタリングは、あるメソッドのパラメータをその本文に移動するのに役立ちます。例えば、あるメソッドの呼び出し箇所すべてで、同じ定数値が渡されている場合、該当パラメータを削除して、対応するローカル変数をメソッドの本文に追加できます。

Inline Variable(変数のインライン化)

任意の変数またはローカル定数を選択して「変数のインライン化」リファクタリングを呼び出してください。コード内に存在する選択した変数すべてが、その初期化子で置換されます。逆の動作を行う機能は、変数の導入が提供しています。

部分文字列変数の導入リファクタリング

Introduce Variable(部分文字列変数の導入)

このリファクタリングを使うと、ある文字列の一部を別の変数にすばやく移動できます。対象となるC#のバージョンに応じて、このリファクタリングは文字列補間を使用するか、文字列をString.Format()に入れ込みます。

ReSharperでの「型を一致するファイルに移動」リファクタリング

Move Types into Matching Files(型を一致するファイルに移動)

このリファクタリングは単一のファイルか、それぞれ複数の型を持つ、選択した複数のファイルに適用できます。 ReSharperはこれらの各タイプに対して専用のファイルを作成し、そこへ各タイプを移動します。

「Move Types into Matching Files」は、まず型を使用してから、それをReSharperのCreate from Usage機能を使って宣言したい場合には絶対に欠かせないヘルパーです。

また、このリファクタリングには、作業中のファイル名に一致しないクラス名の上で、Alt+Enterを押したときに使用できるショートカットもあります。

Move to Folder(フォルダに移動)

このリファクタリングは、クラス、ファイル、または選択した複数のクラスやファイルを、ソリューション内の別のプロジェクトやフォルダへ移動するのに役立ちます。移動を実行する際、ReSharperは必要に応じて使用中のディレクティブを更新します。必要に応じて、名前空間を新しい場所に合わせて改名したり、移動対象のクラスを別々のファイルに分散させたりもできます。

Move Type to Outer Scope(型を外部スコープに移動)

このリファクタリングは、ネストされた型を上位の階層に移動します。ネストされた型がその親の型のメンバーを使用している場合、親の型への参照は引数として、移動対象の型のコンストラクタに渡されます。このリファクタリングはMoveリファクタリングコマンドでアクセスできます。

Move Type to Another File or Namespace(型を別のファイルまたは名前空間に移動)

ReSharperを使うと、型が属する名前空間を簡単に変更し、参照を自動的に更新できます。型を外部スコープまたはネストされたスコープ、あるいは別ファイルに移動させることもできます。
このリファクタリングを使うと、所定の型を実装したコードを独立したファイルにすばやく移動できます。このリファクタリングはMoveリファクタリングコマンドでアクセスできます。

XAMLを使用しており、ある.NETのクラスを別の名前空間に移動する場合、該当クラスを参照するXAMLマークアップが更新され、それに応じてXAMLのimportディレクティブが挿入/変更されます。また、このリファクタリングは、任意の型参照でXAMLマークアップから直接呼び出すこともできます。

Safe Delete(安全な削除)

C#またはVB.NETのコードファイル、ASP.NETのコードやマークアップ、ビルドスクリプト、またはXAMLで、型、型メンバー、あるいはその他の任意のシンボルを削除する際、このリファクタリングを使うと削除操作を安全に実行できます。シンボルの使用箇所が見つからない場合や、見つかった使用箇所が安全に折りたたみ可能な場合は、シンボルが削除されます。これらの条件に当てはまらない場合、ReSharperは安全に削除できない使用箇所をすべて表示し、編集できるようにいたします。

このリファクタリングは選択した複数のファイルやファイルのメンバーに適用可能であるため、サブシステム全体を安全に削除できます。

ビルドファイル内のターゲットやプロパティで安全な削除を呼び出すと、ReSharperは選択したシンボルを削除するために必要な検証と操作をすべて実行いたします。また、ReSharperは競合する参照もすべて削除できます。

メンバーをpartialに抽出リファクタリング

Extract Members to Partial(メンバーをpartialに抽出)

このリファクタリングは、型メンバーを複数のpartialクラスの異なる型の部分間で移動するのに役立ちます。入力内容に応じて、このリファクタリングは既存の型の部分を使用するか、新しい型の部分を作成します。

また、#region全体にリファクタリングを実行することで、すべてのリージョンメンバーをリージョン名から推測した名前を持つ新しいファイルに移動することもできます。

ショートカットに関する注意

このページに記載されたキーボードショートカットはすべて、ReSharperデフォルトの「Visual Studio」キーマップのものです。 ReSharperの2種類のキーマップの詳細は、ReSharperのドキュメントをご覧ください。