IRONSOFTWAREHOME

C# WinForms重构 — 深入分析Tim Corey

C# App Start To Finish Lesson 24 - Refactoring

Tim Corey

1h 10m 16s

重构是那些让代码不仅仅工作,而是更具可维护性、灵活性和未来导向的主题之一。 在"C#应用程序从头到尾"系列的第24课中,Tim Corey在WinForms应用程序中引导一次真实、实用的重构课程。 而不是理论,Tim重构了一个现有项目,解释为什么需要做出改变以及如何安全地进行这些改变。

在这篇文章中,我们将深入探讨C# WinForms重构,严格遵循Tim在视频中的解释。

本课中重构的涵义

在0:02,Tim介绍了第24课并解释了重构意味着重新设计代码,使其以更好的方式完成相同任务。 他指出应用程序已经工作,但包含"垃圾"和未达到标准的部分。 根据Tim,这是在项目进一步发展前清理的正确时间。

他强调重构不是为了添加功能——而是为了改善结构、可读性和长期可维护性,同时保持行为不变。

清理接口中的不必要返回值

从0:31开始,Tim进入第一个重构:修正接口方法签名。 他解释在项目初期,方法不必要地返回模型。 因为对象已经通过引用传递,再次返回相同的模型没有实质意义。

Tim演示了将这些方法更改为void,这立即打破了实现。 他解释为什么会发生这种情况:当接口改变时,所有实现类必须与新签名完全一致。 他逐步修正SQL连接器和文本连接器以符合更新后的接口。

在2:33,Tim暂停展示如果让Visual Studio自动实现接口会发生什么。 他解释了为什么会出现重复的方法名称,并澄清仅仅返回类型不足以区分方法签名。

修复重构导致的构建错误

在4:00,Tim构建解决方案并有意展示出现的错误。 他解释这些错误是预期的并且非常有帮助。 例如,之前期望返回模型的代码现在失败,因为方法返回void。

Tim通过删除不必要的赋值并重新构建解决方案来解决这个问题。 他强调重构通常会导致短期的破坏,但每个错误直接指向需要改进的代码。

将文件名常量移到GlobalConfig中

从5:25开始,Tim重构了文本连接器中如何处理文件名。 之前,文件路径被存储为类中的私有字符串常量。 Tim解释这些不再需要,因为文件名已经存在于GlobalConfig中。

他用GlobalConfig.PeopleFile、GlobalConfig.PrizesFile和类似属性替换了本地常量。 Tim解释这一变化将配置集中化,并确保整个应用程序使用一致的文件路径。

他还提出一个重要建议:避免同时重构太多东西。 当他注意到可以做的额外改进时,他明确表示稍后会再回过头来处理。

重构文本连接器处理器

在7:44,Tim通过删除文本连接器处理器中多个方法的文件名参数继续重构。 因为文件名现在存在于GlobalConfig中,传递它们是不必要的。

Tim仔细更新方法签名,用GlobalConfig引用替换参数,并依靠Visual Studio的错误列表指导他。 他解释在重构过程中看到很多错误是正常的,而不是值得恐慌的事情。

在13:16,他指出实时错误跟踪在系统地清理项目中的方法调用时有多大帮助。

识别UI逻辑过多的地方

在15:24,Tim强调一个主要设计问题:UI事件处理程序内逻辑过多。 他滚动查看一个按钮点击事件并解释它包含了事件不应具有的更多代码。 在Windows Forms中,用户操作如按钮点击通过事件处理程序处理,这些处理程序定义了事件发生时要执行的具体操作。

Tim解释UI代码应仅关注用户交互。 Windows Forms使用事件驱动编程模型,其中用户操作触发由应用代码处理的事件。 业务逻辑——如计分比赛和推进获胜者——属于类库。 这种分离允许相同的逻辑在以后重用于网络应用或WPF应用程序。

将比赛逻辑提取到类库中

从17:55开始,Tim将比赛计分逻辑移动到比赛逻辑类中的一个新公共方法。 他将其命名为UpdateTournamentResults,并解释为何它接受整个比赛模型,而不是单个比赛。

他将逻辑从表单中复制出来,粘贴到类库中,并调整其独立于UI元素工作。 这种重构确保比赛规则存在于一个地方,并可在任何地方重用。

正确计分比赛和处理轮空

在21:37,Tim重构了比赛计分方式。 他不再处理单个比赛,而是遍历所有轮次和所有比赛,构建需要计分的比赛列表。

他解释了检测已完成比赛和轮空的逻辑。 Tim指出轮空之前通过分配虚假得分以"欺骗"的方式处理。 重构允许他显式且清晰地处理轮空。

将计分提取到私有方法中

在28:17,Tim将计分逻辑提取到一个私有方法中。 他解释较小、集中的方法使代码更易于理解和维护。

他还重命名方法以更准确反映其功能,例如将计分逻辑更改为明显地"标记比赛中的赢家"。

可配置的赢家确定

从29:58开始,Tim重构了获胜者判定逻辑,使其可以处理高分获胜和低分获胜的场景。 他引入了一个新的应用程序设置,并解释了为什么配置比硬编码规则更好。

Tim讨论了其他设计,包括在锦标赛模型中存储此值,但解释了为何该更改超出了本课的范围。

推动赢家和节省结果

在45:40,Tim继续将获胜者晋级到下一轮。 他解释了优胜者如何匹配到父级对决,并说明为何在正确的时间保存数据至关重要。

稍后,大约在52:10,他演示了一种简洁的ForEach方法来更新对决,解释了它在功能上与传统循环相当,但更为紧凑。

修复重构引入的漏洞

在58:33,Tim发现数据库中的数据不正确,并将问题追溯到比赛保存前的调用逻辑。 他解释了重构有时会暴露隐藏的错误,而不是创建新的错误。

通过将更新逻辑移至正确的位置(持久化之后),Tim解决了问题并重新测试了应用程序。

关于重构的最终思考

在1:09:00,Tim总结了这节课中重构所取得的成果。 他解释说,重构不仅仅是为了更清晰的代码——也涉及处理边缘情况,修复设计缺陷,并为未来的变化做好准备。

他强调重构是一个持续的过程,并暗示下一课将重点讲解错误处理。

结束语

课程展示了在真实项目中进行代码重构的过程:是一个渐进的过程,有时会显得杂乱,但最终是值得的。 通过遵循Tim Corey的分步方法,您将获得一个实用的蓝图,以改进WinForms应用程序,而不会破坏功能,也不必猜测下一步该做什么。

Earn More by Sharing What You Love

Do you create content for developers working with .NET, C#, Java, Python, or Node.js? Turn your expertise into extra income!

Let's Stay in Touch!

Join our newsletter, you’ll get exclusive access on article updates. We value your privacy

Key in blue circle

立即获取免费的 30 天试用版密钥

Your trial license will be sent to your email address

无任何限制。100% 解锁。无需信用卡。

bullet_checked无需信用卡或创建账户无任何限制。100% 解锁。无需信用卡。
  • Logo Aetna
  • Logo NASA
  • Logo GE
  • Logo Porsche
  • Logo USDA
  • Logo Qatar
Join Millions of Engineers who’ve tried IronPDF
获取您的无义务咨询
填写下面的表格或通过sales@ironsoftware.com
您的资料将始终保密。
深受全球数百万工程师信赖
Iron Software 的客户徽标
立即获取您的免费30 天试用密钥
无需信用卡或创建账户