5

我正在尝试重构现有的 Winform 应用程序以使用 MVP Passive View 模式。应用程序的 UI、业务逻辑和数据存储代码多年来一直自由混合。看起来它要么从单独的层开始,要么有人试图将其分成层。在任何情况下,层边界都没有得到尊重。

由于表单直接操作域对象和数据源(反之亦然),我的首要任务是创建演示者/控制器对象并委派这些职责。

该应用程序是一个 .NET 1.1 应用程序,我正在 VS.NET 2003 中使用相当有限的重构加载项进行开发。我使用现有代码的测试生成器来创建样板单元测试,然后通过并手动编辑每个测试。当然,这最终会测试代码的作用,而不一定是它应该做的事情。对于新课程,我正在做 TDD。

在这种规模的重构工作中,有什么技巧、资源、陷阱需要注意吗?

我已经掌握了一些资源:

  • 编程书籍合集;重构, PEAA , WELC
  • 互联网(显然)
  • 大量含咖啡因的饮料

更新:作为一个例子,你会采取什么步骤来改变这个:

    private void OneOfManyFormEventHandlers(object sender, System.EventArgs e)
    {
        string LocalVariable;
        decimal AnotherLocal;
        if (!this._SomeDomainObject.SomeMethod(ClassField, out LocalVariable, out AnotherLocal))
        {
            MessageBox.Show("An error occurred calling method");
            return;
        }

        this.FormControl.Value = LocalVariable;
        this.AnotherFormContorl.Value = AnotherLocal;

        this.AnotherPrivateMethod();
    }

进入这个:

    private void OneOfManyFormEventHandlers(object sender, System.EventArgs e)
    {
         this.FormPresenter.DoSomething();
    }
4

3 回答 3

2

我采取的方法也是先将代码移出事件处理程序。本质上,我在表单旁边放置了一个类,它实现了事件处理程序并将 UI 状态保存在控件旁边。

通过这一举措,我将表单和与剩余应用程序的实际交互清晰地分开,并能够在该级别引入测试。这样做的另一个结果是视图很快变得被动。

我在一个单独的步骤中重构了演示者(它现在拥有事件处理程序),并且仅在我将这些对象的所有用途从所有形式中移出之后才引入域对象。

所以我的步骤是:

  1. 从逻辑中移除 UI 依赖
  2. 创建域对象(如果尚不可用)
  3. 重构演示者以使用域对象
  4. 在您使用时根据您的设计选择介绍服务

当我这样做时,我开始在新引入的边界处引入测试,以确保我不会破坏工作代码或在我正在移动的现有代码中发现错误。

于 2009-04-17T16:32:27.377 回答
0

如果您有时间,我建议您首先使用 WinForms 测试框架(如White)在现有应用程序上编写一些冒烟测试。这样,当您开始重构代码时,您将能够检查任何新引入的错误。

于 2009-04-20T16:44:12.253 回答
0

您可能会发现使用 Windows 窗体实现 MVC的答案很有帮助,因为他们讨论了实现 MVC 和 MVP 时的不同选项

于 2009-08-21T08:48:14.813 回答