将WinForm ClickNCode重构为MVP被动视图

Ken*_*ran 5 c# mvp refactoring winforms

我正在尝试重构现有的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();
    }
Run Code Online (Sandbox Code Playgroud)

进入:

    private void OneOfManyFormEventHandlers(object sender, System.EventArgs e)
    {
         this.FormPresenter.DoSomething();
    }
Run Code Online (Sandbox Code Playgroud)

gro*_*ver 2

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

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

我在单独的步骤中重构演示者(现在包含事件处理程序),并仅在将这些对象的所有使用移出所有表单后才引入域对象。

所以我的步骤是:

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

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