1

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

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

但我以前从来没有这样做过,在我开始把所有东西都拆开之前,想知道是否有人知道任何好的技巧或陷阱......谢谢!

4

6 回答 6

5

称我为老式,但就个人而言,我仅在用于技术任务(例如重命名等)时使用您描述的自动化功能

对于所有其他重构,例如提取接口等,我更喜欢手动进行。你会发现你可以做更多的重构,而且通常代码会更干净。

于 2008-10-23T11:51:20.303 回答
3

婴儿步。

第 1 步:使用 Resharper 出色的重构进行小改动。
第 2 步:测试(最好是单元测试)以确保代码仍然有效
第 3 步:提交源代码控制

多次重复这 3 个步骤。

如果您正在进行“必须同时迈出一大步”的重构之一,这可能行不通。在这种情况下,在迈出大步之前尽可能多地进行小的重构。

于 2008-10-23T11:50:19.230 回答
1

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

于 2008-10-23T18:50:25.230 回答
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,您就完成了拆分类。现在您可以提取接口,尽可能使用基本类型,并以其他方式整理它。

于 2008-10-23T13:06:18.250 回答
0

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

于 2008-10-23T18:48:27.967 回答
0

在你做之前,投资源代码控制:学习 Git。没有 SCM 的重构就像蒙着眼睛开车。

于 2014-05-19T14:10:40.447 回答