0

Resharperを使用して、以下のメソッドEatが別のクラスに抽出され、新しく抽出されたDinnerクラスが外部依存関係としてクラスに挿入されるようにコードをリファクタリングすることは可能ですか?

元のコード

public class Dinner
{
    public Dinner()
    {

    }

    public void Eat()
    {
        //do the eating
    }
}

リファクタリングされたコード

public interface IEatService
{
    void Eat();
}

public class EatService : IEatService
{
    public void Eat()
    {

    }
}
public class Dinner
{
    private readonly IEatService _eatService = null;

    public Dinner(IEatService eatService)
    {
        _eatService = eatService;
    }

    public void Eat()
    {
        _eatService.Eat();
    }

}

リファクタリングされたコードとまったく同じである必要はありません。これは、アイデアを与えるために示されています。

4

2 に答える 2

3

3ステップのリファクタリングを使用して、R#7でほぼ必要に応じて実行できます。

  1. Eatメソッドに注意を向け、Extract Classリファクタリング(VSではCtrl-Shift-R)を呼び出し、クラスにEatServiceという名前を付けます。
  2. EatServiceクラスにキャレットを配置し、ExtractInterfaceリファクタリングを呼び出します。
  3. EatServiceクラスにキャレットを配置し、可能な場合はUseBasetypeリファクタリングを呼び出します。

残っているのは、Dinnerクラスのコンストラクターを修正して、パラメーターとしてIEatServiceを取得することだけです。

于 2013-01-06T21:30:42.493 に答える
0

R# 6 を使用してこれを実現する 1 つの方法は、次の一連の操作を使用することです。リファクタリングはReSharper | Refactor、メニュー バーの両方で、または (より迅速に) Ctrl+ Shift+のコンテキストで利用できることに注意してくださいR。まだ少しタイピングがあります。何も入力する必要のない方法があったとしても、私は驚かないでしょう。

  • という名前のファイルの元のコードから始めますDinner.cs
  • カーソルを に合わせて、リファクタリングをEat使用し、インターフェイスに名前を付けますExtract InterfaceIEatService
  • カーソルを に置きIEatServiceAlt+Enterの提供された名前を受け入れて派生型を作成しEatServiceAlt+Enterメソッド実装本体を入力します。
  • 入力する必要がある場所は次のとおりDinner.Eat()です_eatService.Eat();_eatService赤であることに注意してください。Alt+Enterその上で、「フィールドの作成」を選択し、提供されたタイプをに変更しますIEatService
  • _eatServiceの定義にカーソルを置いてAlt+Enterを選択し、'Initialize from ctor paramater' を選択してから、もう一度Alt+を選択して提案Enterを受け入れます。readonly

_eatServiceへの初期化nullは冗長であることに注意してください。R# はこれを知らせてくれます。

これで、ターゲット コードに到達しました。

R# 7 にはいくつかの新しいリファクタリング (Extract Class など) があると思います。

于 2013-01-04T15:32:37.883 に答える