.net 如何重构WinForms应用程序?

.net 如何重构WinForms应用程序?,.net,winforms,refactoring,legacy-code,.net,Winforms,Refactoring,Legacy Code,我将在不久的将来修复WinForms应用程序(.NET 2.0)的错误。通过查看源代码,我发现了大量的代码文件(超过2000行),其中大多数都是生成的对话框,后面有很多代码 有人给我一些建议吗?有没有关于修复或重构WinForms应用程序的战争故事或最佳实践?我先写一些单元测试。如果代码相当密集,您将需要它们来保持理智 他们会给你一些信心,让你在重构过程中相当积极。 首先,试着理解代码及其背后的逻辑 一旦您理解了一些代码,尝试为业务对象建模必要的类 在新设计中使用某种层方法(3层是经典):接口层

我将在不久的将来修复WinForms应用程序(.NET 2.0)的错误。通过查看源代码,我发现了大量的代码文件(超过2000行),其中大多数都是生成的对话框,后面有很多代码


有人给我一些建议吗?有没有关于修复或重构WinForms应用程序的战争故事或最佳实践?

我先写一些单元测试。如果代码相当密集,您将需要它们来保持理智

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

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

我认为这是最基本的东西。这里的很多人一定有很多建议。祝你好运

从顶部看有两件事:

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

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

      较长版本:

      维护(更改)这样的应用程序时最大的挑战是在不破坏某些东西的情况下进行操作。这意味着您需要了解应用程序的行为,最简单的方法是对其进行测试。正如您所注意到的,一开始这可能会让人望而生畏,但并非不可能。这需要纪律和耐心

      您不必从单元测试开始。通常更容易获得自动化框架,例如NUnitForms或White,首先将应用程序作为黑盒驱动。围绕你需要改变的领域建立一套测试,让你有足够的信心在不破坏某些东西的情况下改变它。然后开始重构以实现单元可测试性

      如果它与我正在开发的应用程序类似,那么它主要包括:

      • 删除未使用的代码(这会分散注意力)
      • 删除公共静态方法调用并用接口替换它们(依赖项注入是这里的关键技术)
      • 将重复代码提取到类中
      • 将文件处理、网络IO和用户界面代码隐藏在适配器后面(这些适配器起初可能是非常薄的包装,足以让您在测试时用存根替换它们)
      • 寻找机会将行为提炼成小班
      有时重写代码部分比重构代码更容易,但这需要通过测试或引用规范(如果存在规范)来理解行为

      除了任何实用的建议外,如果你是这个团队的一员,请确保你们在一起工作。这将使工作更轻松、更愉快,并确保你今天所做的改变不会被不了解你工作内容的人明天撤销


      我可以就这个话题写一整天,但Feathers先生更擅长,我很饿。祝你好运

      如果不是因为不稳定的代码设计,我会开始编写单元测试。代码有不同程度的错误代码设计选择(代码生成文件、god类综合症等),这使得编写单元测试从一开始就不可能。除非您计划提取类,否则如何对单片UI进行单元测试?你是在建议测试驱动重构吗?