リファクタリング方法:クラスを2つに分割し、インターフェースを介して通信する
-
04-07-2019 - |
質問
私は最初の大規模なリファクタリングに着手したばかりで、(残念ながら大きな)クラスを2つに分割する必要があります。その後、クラスはインターフェースを介してのみ通信します。 (私のプレゼンターはコントローラーであることが判明したため、GUIロジックをアプリロジックから分離する必要があります)。 VisualStudio 2008とResharperでC#を使用して、これを達成する最も簡単な方法は何ですか?
私がしようとしているのは a)新しいクラスのメンバーを収集し、「新しいクラスを抽出する」 b)結果の混乱をクリーンアップします c)" Extract Interface" d)クラスへの参照を追跡し、それらをインターフェース参照に変換します
しかし、私はこれを一度もやったことがなく、すべてを引き裂き始める前に誰かが良いヒントや落とし穴を知っているのだろうか... ありがとう!
解決
赤ちゃんの手順。
ステップ1:Resharperの優れたリファクタリングを使用して小さな変更を加えます。
手順2:テスト(できれば単体テスト)を実行して、コードが引き続き機能することを確認します
ステップ3:ソース管理にコミットする
これらの3つのステップを何度も繰り返します。
「一度に大きな一歩を踏み出す必要があります」のいずれかを実行している場合、これは機能しない可能性があります。リファクタリング。その場合、大きな一歩を踏み出す前に、できるだけ多くの小さなリファクタリングを行ってください。
他のヒント
昔ながらの電話をしますが、個人的には、技術的なタスク(名前の変更など)の場合にのみ説明した自動化された機能を使用します
インターフェースの抽出など、他のすべてのリファクタリングでは、手動で行うことを好みます。さらに多くのリファクタリングを行うことができ、通常はコードがよりきれいになることがわかります。
重要なアドバイスは1つしかありません。リファクタリングを開始する前の状態に戻して、何も失わないようにしてください。それからちょうど飛び込んでそれのために行きます。停止して再度開始する必要が生じる可能性がありますが、それは恐れることではありません(私の1つのアドバイスに注意する限り)。あなたはそれをすることをたくさん学ぶでしょう。
最初にここで簡単な回答をしてください。それについてのブログ記事を書きます。アイデアをありがとう!
だから、これがあると仮定しましょう:
class PresenterAndController
{
public void Control()
{
Present();
}
public void Present()
{
// present something
}
}
最初に、すべての直接メンバーの使用を間接に変換する必要があります。つまり、フィールドで修飾します。これを行うには、extractスーパークラスリファクタリングを使用して、Presenter部分をスーパークラスに抽出します。
internal class Presenter
{
public void Present()
{
// present something
}
}
class PresenterAndController : Presenter
{
public void Control()
{
Present();
}
}
PresenterAndControllerにフィールドを作成します。フィールドを委任し、Generate(Alt-Ins)を使用して委任メンバーを作成します。それらは同じなので、たまたま基本メソッドを隠します:
internal class Presenter
{
public void Present()
{
// present something
}
}
class PresenterAndController : Presenter
{
private Presenter myPresenter;
public void Present() // hides base method
{
myPresenter.Present();
}
public void Control()
{
Present(); // it now references method from this type
}
}
Presenterを継承リストから削除すると、クラスの分割が完了します。これで、インターフェイスを抽出し、可能な場合は基本型を使用し、それ以外の場合は整理できます。
VisualStudioを使用したことはありませんが、Eclipseの自動リファクタリングは非常に信頼性が高く、少なくとも同じ仕事をしているのと同じくらい信頼できると思います。
行う前に、ソース管理に投資してください:Gitを学んでください。 SCMを使用しないリファクタリングは、目隠し運転のようなものです。