将WinForm ClickNCode重构为MVP被动视图

时间:2009-04-17 15:46:41

标签: c# winforms refactoring mvp

我正在尝试重构现有的Winform应用程序以使用MVP被动视图模式。应用程序的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();
    }

3 个答案:

答案 0 :(得分:2)

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

通过这一举措,我已经非常明确地分离了表单以及与剩余应用程序的实际交互,并且能够在该级别引入测试。另一个结果是视图很快变得被动。

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

所以我的步骤是:

  1. 从逻辑
  2. 中删除UI依赖项
  3. 创建域对象(如果尚未提供)
  4. 重构演示者以使用域对象
  5. 根据您的设计选择介绍服务
  6. 虽然我这样做,但我开始在新引入的边界引入测试,以确保我不会破坏正在运行的代码或查找我正在移动的现有代码中的错误。

答案 1 :(得分:0)

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

答案 2 :(得分:0)

您可能会发现Implementing MVC with Windows Forms的答案很有帮助,因为他们在实施MVC和MVP时讨论了不同的选项