我如何重构WinForms应用程序?

时间:2009-04-11 08:18:56

标签: .net winforms refactoring legacy-code

我将在不久的将来修复WinForms应用程序(.NET 2.0)。通过源代码查看,我发现大型代码文件(超过2000行),其中大部分是生成的对话框,有很多代码隐藏。

有没有提示让我分享?修复或重构WinForms应用程序的任何战争故事或最佳实践?

4 个答案:

答案 0 :(得分:3)

简短版本:

购买Michael Feathers的书,有效地使用遗留代码。

版本较长:

维护(更改)此类应用程序时遇到的最大挑战是不破坏某些内容。这意味着您需要了解应用程序的行为,最简单的方法是围绕它进行测试。正如你所指出的,一开始这可能是令人生畏的,但这并非不可能。这需要纪律和耐心。

您不必从单元测试开始。获得自动化框架(例如NUnitForms或White)通常更容易将应用程序作为黑盒子首先驱动。围绕您需要更改的区域构建一系列测试,以便您有足够的信心在不破坏某些内容的情况下进行更改。然后进入并开始重构单元可测试性。

如果它与我正在处理的应用程序类似,则主要涉及:

  • 删除未使用的代码(这是一种分心)。
  • 删除公共静态方法调用并用接口替换它们(依赖注入是一种关键技术)。
  • 将重复的代码提取到类中。
  • 隐藏文件处理,网络IO和适配器后面的用户界面代码(这些代码最初可能是非常薄的包装器,只需足以在测试时用存根替换它们。)
  • 寻找将行为提取到小班级的机会。

有时重写代码的部分而不是重构它们会更容易,但这需要通过测试或引用规范(如果存在的话)来理解行为。

除了任何实用建议外,如果您是参与此工作的团队的一员,请确保您一起工作。它将使工作变得更轻松,更有乐趣,并确保您明天所做的更改不会被那些不了解您正在处理的人明天所取消。

我可以整天写这个话题,但是Feathers先生在这方面要好得多,而且我很饿。祝你好运!

答案 1 :(得分:2)

  • 首先尝试理解代码及其背后的逻辑。
  • 了解了一些代码后,尝试为业务对象建模必要的类
  • 在新设计中使用某种层方法(3层是经典的):接口层,业务层,数据访问层(或其他一些服务层)。
  • 很有耐心,记录一切!

我认为这是基本的东西。这里的很多人必须有很多建议。祝你好运!

答案 2 :(得分:1)

我首先编写一些单元测试。如果代码相当密集,你将需要那些保持理智。

他们会给你一些信心,让你在重构时相当积极。

答案 3 :(得分:1)

高层领导的事情:

  • 将所有生成的代码放入部分类或区域(我使用区域
  • 将所有代码从操作移动到单独的区域或类中作为函数
  • 为每个功能编写单元测试
  • 在此之后执行常见的重构模式,将相同/相似的功能组合到一个函数中
  • 确保不同的按钮不使用不同的功能来执行相同的操作(特别是在VB.NET中,这是非常常见的设计,因此您可以在应用程序中找到)
  • 尽可能正确使用发件人对象,而不是在控件事件处理程序中对控件名称进行硬编码
  • 如果您看到任何此代码可以转换为一个好的类,那就去做吧。摆脱WinForms中的所有非GUI代码。有时需要重构原始类以使其可以与GUI一起工作,编写单元测试并重构它们。 (通常即使没有单元测试也应该没问题)