我试图重构现有的Winform应用程序以使用MVP Passive View模式。该应用程序的UI,业务逻辑和数据存储代码已自由混合多年。看起来它要么是从单独的层开始的,要么是有人试图将其分成多个层。无论如何,都不会遵守层边界。

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

该应用程序是.NET 1.1应用程序,我正在VS.NET 2003中进行开发,其重构外接程序非常有限。我使用现有代码的测试生成器来创建样板单元测试,然后进行测试并手动编辑每个测试。当然,这可以测试代码的作用,而不必测试它的作用。对于新类(class),我正在做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();
        }
    

    最佳答案

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

    通过此举,我已经很清楚地分离了表单,并与其余应用进行了实际交互,并能够在该级别进行测试。这样做的另一个结果是, View 很快变得被动起来。

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

    所以我的步骤将是:

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

  • 在执行此操作的同时,我开始在新引入的边界处引入测试,以确保我不会破坏正常工作的代码或在我要移动的现有代码中发现错误。

    关于c# - 将WinForm ClickNCode重构为MVP被动 View ,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/760961/

    10-13 06:23