重构 WinForm ClickNCode 到 MVP 被动视图

5
我正在尝试重构一个现有的Winform应用程序,以使用MVP被动视图模式。该应用程序的UI、业务逻辑和数据存储代码已经自由混合了多年。看起来它要么从一开始就有独立的层,要么就是有人试图将其分成层。无论哪种情况,层边界都没有得到尊重。
由于表单直接操作领域对象和数据源(反之亦然),我的第一个任务是创建Presenter/Controller对象并委托这些责任。
该应用程序是一个.NET 1.1应用程序,我正在使用带有相当有限的重构插件的VS.NET 2003进行开发。我使用测试生成器为现有代码创建样板单元测试,然后逐个手动编辑每个测试。显然,这将测试代码执行的内容,而不一定是它应该做的事情。对于新类,我正在采用TDD。
在进行这种规模的重构工作时,有哪些技巧、资源和需要注意的问题?
我已经掌握了几个资源:
- 编程书籍集合;《重构》、《企业应用架构模式》、《Web应用架构基础》; - 互联网(当然); - 大量的含咖啡因饮料。
更新: 举个例子,您会采取什么步骤将以下内容转换为:
    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();
    }

你推荐《Working Effectively With Legacy Code》吗?我以前从未听说过。顺便祝你好运,恐怕我没有任何有用的建议可以提供给你。 - Patrick McDonald
是的,这是一本非常好的书。它提供了一些非常有用的技术,用于测试代码,这些代码最初并不是为此而设计的。对我来说,最有用的是提取接口 - Kenneth Cochran
3个回答

2
我采用的方法是先将代码从事件处理程序中移出。实际上,我在表单旁边放置了一个类,它实现了事件处理程序并在控件旁边保存UI状态。
通过这种方式,我获得了一个相当清晰的表单和其余应用程序实际交互的分离,并能够在该级别引入测试。这样做的另一个结果是,视图很快变得被动起来。
我在单独的步骤中重构了Presenter(现在包含事件处理程序),并在将所有使用这些对象的地方移出所有表单之后才引入域对象。
所以我的步骤是:
1. 从逻辑中删除UI依赖项 2. 创建域对象(如果尚未可用) 3. 重构Presenter以使用域对象 4. 在你进行设计选择时引入服务
在我这样做的同时,我开始在新引入的边界引入测试,以确保我不会破坏工作代码或找到我正在移动的现有代码中的错误。

0

0
如果您有时间,我建议您首先使用WinForms测试框架(如White)编写一些烟雾测试来测试现有应用程序。这样,在开始重构代码时,您就可以检查是否引入了任何新的错误。

@Igor:白色对我来说效果不佳(至少对于基于C++的MFC应用程序而言)。 - Vyas Bharghava

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接