Oop 折衷的设计与实践;与现有模块集成的代码质量

Oop 折衷的设计与实践;与现有模块集成的代码质量,oop,refactoring,Oop,Refactoring,你好 我继承了一个C#.NET应用程序,我已经扩展和改进了一段时间。总的来说,这显然是一项仓促的工作(或者写这篇文章的人似乎不如我胜任)。该应用程序从嵌入式设备中提取一些数据,并对其进行显示和操作。核心是主应用程序表单中的一个通信线程,它执行一个600多行代码的方法,该方法到处调用函数,实现一个状态机——很多if-state-then-do类型代码。与设备的交互是通过全局设置状态/模式并让线程完成它的工作来完成的。(这只是代码不好的一个例子——总的来说,它不太像OO,它让人想起了编写设备固件的嵌

你好

我继承了一个C#.NET应用程序,我已经扩展和改进了一段时间。总的来说,这显然是一项仓促的工作(或者写这篇文章的人似乎不如我胜任)。该应用程序从嵌入式设备中提取一些数据,并对其进行显示和操作。核心是主应用程序表单中的一个通信线程,它执行一个600多行代码的方法,该方法到处调用函数,实现一个状态机——很多if-state-then-do类型代码。与设备的交互是通过全局设置状态/模式并让线程完成它的工作来完成的。(这只是代码不好的一个例子——总的来说,它不太像OO,它让人想起了编写设备固件的嵌入式C代码的风格)

我的问题是这段代码是应用程序的核心。软件、通信协议或设备固件根本没有记录。显然,为了继续我的工作,我必须与这个代码交互

我想要的是一些指导,是否值得放弃这段代码&尝试从我可以逆向工程的信息中拼凑出更合理的东西?我不能决定!我不想重构的原因是因为代码已经可以工作了,修改它肯定是一项漫长、费力和令人不快的任务。另一方面,不重构意味着我有时不得不牺牲其他模块的设计,以便从这个状态机调用我的代码

我听说过“如果它没有坏,就不要修复它!”,所以我想知道当“它”影响未来代码的设计时,它是否应该应用!任何建议都将不胜感激


谢谢

如果你觉得代码很垃圾,我绝对建议你重构它。是的,在重构过程中,一开始可能会出现一些不一致/问题。但这就是为什么我们有迭代和测试。既然你将来要在这个核心引擎上建造,为什么不让地下室尽可能稳定呢

但是,要非常确定你将要做什么。因为有时长代码行并不一定意味着邪恶。另一方面,它们在运行时间上可能非常有效。如果你问我,If/else块还不错,因为从微处理器的角度来看,它们在分支方面非常智能。所以,在你接触这个之前,你必须判断清楚


但是一旦你重构了代码,你肯定能很好地控制它。别忘了把它记录下来!!明天,很可能会有人来谈论你,不管你对这个写了核心代码的家伙说了什么。

而且,你等待的时间越长,代码库的味道就越差。我的建议是首先创建一个测试套件,您可以根据它来评估重构。这使您更容易看到您是在重构还是只是在简单地破坏东西:)。

首先,将所有业务逻辑从表单中取出。其次,定位代码与全局状态交互的所有部分(例如访问嵌入式系统)。将所有这些访问权委托给方法。然后,将这些方法移动到一个新类中,并在该类的构造函数中创建一个实例。最后是类要使用的实例


按照这些步骤,您可以将嵌入式系统逻辑(“现有模块”)移动到您编写的包装类中,这样接口就可以很好、干净并且更易于管理。然后您可以更好地处理monster方法的重构问题,因为需要担心的全局状态(只有局部状态)更少。

如果代码有效,并且您可以集成您的部件,对其进行最小的更改,然后让代码保持原样并进行集成

如果代码在添加新功能的过程中只是一个很大的障碍,那么最好重构它

与负责该项目的其他人交谈,解释情况,给出评估,解释重构代码后获得的好处,我确信(我希望)会做出最佳选择。最好说出你的想法,不要把任何东西藏在里面,特别是如果这会影响你的工作效率、动机等


注意:通常,重写代码是不可能的,但根据情况和需要重写的代码量,决定可能会有所不同。

这取决于您面临的约束,决定要基于实践基础,而不是理论基础。你需要考虑三件事。

  • 时间:你需要有足够的时间来学习、实施和测试它,而不会有太多其他任务打扰你
  • 老板1:如果你为某人工作,他需要知道并批准你立即花费多少时间和精力来重建你的解决方案
  • 老板2:你的老板还需要知道,拥有新的、干净的软件的好处是以可能的倒退为代价的,因此在部署之初,可能会出现意想不到的bug

  • 如果你有这三个,那么继续重构它。这肯定是值得的

    您说这将对系统的未来设计产生影响。在这种情况下,我会说它坏了,需要修理

    但您必须考虑业务需求。现实常常会妨碍你

    是否有可能将此代码封装在另一个类中,该类的接口更适合您推进系统的方式?()

    • 这将允许您在不受不良设计影响的情况下继续满足您的需求
    • 它为您提供了一个可以编写单元测试的接口。这些测试可以基于您的设计对此代码的要求。它确保你对它所做的假设是正确的。如果你说t