Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/292.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 重构WinForm ClickNCode到MVP被动视图_C#_Winforms_Refactoring_Mvp - Fatal编程技术网

C# 重构WinForm ClickNCode到MVP被动视图

C# 重构WinForm ClickNCode到MVP被动视图,c#,winforms,refactoring,mvp,C#,Winforms,Refactoring,Mvp,我正在尝试重构现有的Winform应用程序,以使用MVP被动视图模式。多年来,应用程序的UI、业务逻辑和数据存储代码一直在自由混合。看起来它要么是从单独的层开始的,要么是有人试图将它分成层。在任何情况下,层边界都没有得到尊重 由于表单直接操作域对象和数据源(反之亦然),因此我的第一个任务是创建presenter/controller对象并委派这些职责 该应用程序是一个.NET1.1应用程序,我正在VS.NET2003中使用一个相当有限的重构插件进行开发。我为现有代码使用了一个测试生成器来创建锅炉

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

由于表单直接操作域对象和数据源(反之亦然),因此我的第一个任务是创建presenter/controller对象并委派这些职责

该应用程序是一个.NET1.1应用程序,我正在VS.NET2003中使用一个相当有限的重构插件进行开发。我为现有代码使用了一个测试生成器来创建锅炉板单元测试,然后完成并手工编辑每个测试。诚然,这最终会测试代码的功能,而不一定测试它应该做什么。对于新课程,我在做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状态

通过这一步,我已经获得了一个相当清晰的分离形式和实际互动与其余的应用程序,并能够引入测试在该级别。这样做的另一个结果是视图很快变得被动

我在一个单独的步骤中重构presenter(它现在拥有事件处理程序),并且只有在我将这些对象的所有用途移出所有表单之后,才引入域对象

因此,我的步骤是:

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

  • 当我这么做的时候,我开始在新引入的边界引入测试,以确保我没有破坏工作代码或在我正在移动的现有代码中发现bug。

    如果您有时间,我建议您首先使用WinForms测试框架编写一些冒烟测试,比如在现有应用程序上。通过这种方式,您可以在开始重构代码时检查任何新引入的bug。

    您可能会发现这些问题的答案很有帮助,因为他们讨论了在实现MVC和MVP时的不同选项。

    您是否建议“有效地处理遗留代码”?我以前从没听说过。顺便说一句,祝你好运。恐怕我没有什么有用的建议给你。是的,这是一本好书。它为测试中的代码提供了一些非常有用的技术,这些代码最初不是为它设计的。对我来说,最有用的是提取物Interface@IgorWhite对我来说并不是很好(至少是基于C++的MFC应用程序)。