如何重构:将一个类拆分为两个通过接口进行通信的类

时间:2008-10-23 11:45:03

标签: visual-studio visual-studio-2008 refactoring resharper

我刚刚开始使用我的第一个大型重构,需要将一个(不幸的是大)类拆分为两个,然后只通过一个接口进行通信。 (我的Presenter原来是一个Controller,需要从App逻辑中分离GUI逻辑)。在VisualStudio 2008和Resharper中使用C#,实现这一目标的最简单方法是什么?

我要尝试的是 a)收集新课程的成员并“提取新课程” b)清理由此产生的混乱 c)“提取界面” d)追查对类的任何引用并将它们转换为接口引用

但我之前从未这样做过,并且想知道在我开始撕掉所有东西之前是否有人知道任何好的提示或陷阱... 谢谢!

6 个答案:

答案 0 :(得分:5)

叫我老式,但就个人而言,我只使用你所描述的自动化功能来处理技术任务(例如重命名......等)

对于所有其他重构,比如提取接口等,我更喜欢手动完成。你会发现你可以做更多的重构,通常代码会更清晰。

答案 1 :(得分:3)

宝贝步骤。

步骤1:使用Resharper卓越的重构进行小改动 第2步:测试(最好是单元测试)以确保代码仍然有效 第3步:提交源代码管理

多次重复这3个步骤。

如果你正在做其中一个“必须同时迈出重要的一步”重构,那么这可能不会起作用。在这种情况下,在进入大步之前,尽可能多地进行小型重构。

答案 2 :(得分:1)

我只有一条重要建议 - 绝对确保在启动重构之前可以恢复到状态而不会丢失任何东西。然后潜入并继续前进。你可能最终不得不停下来重新开始,但这没什么好害怕的(只要你听从我的一条建议)。你会学到很多东西。

答案 3 :(得分:0)

首先简短的回答,我将写一篇关于它的博客文章,感谢您的想法!

所以,我们假设我们有这个:

class PresenterAndController
  {
    public void Control()
    {
      Present();
    }

    public void Present()
    {
      // present something
    }
  }

首先,我们需要将所有直接成员用法转换为间接成员,即用字段限定它们。为此,使用提取超类重构将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,您就完成了拆分类。现在,您可以提取接口,尽可能使用基本类型,然后整理它。

答案 4 :(得分:0)

我从未使用过VisualStudio,但我发现Eclipse中的自动重构非常可靠 - 至少和我做同样工作一样可靠。

答案 5 :(得分:0)

在你做之前,投资源控制:学习Git。没有SCM的重构就像被蒙上眼睛一样。