Language agnostic 如何重构一个凌乱的大型代码库?

Language agnostic 如何重构一个凌乱的大型代码库?,language-agnostic,oop,refactoring,Language Agnostic,Oop,Refactoring,我有一大堆代码。诚然,这是我自己写的——一年前。它没有很好的注释,但也不是很复杂,所以我可以理解它——只是还不足以知道从哪里开始重构它 我违反了我在过去一年里读到的每一条规则。有些类具有多重职责,有些是间接访问(我忘记了这个术语,比如foo.bar.doSomething()),就像我说的,它没有得到很好的注释。最重要的是,这是一个游戏的开始,因此图形与数据耦合,或者在我试图将图形与数据解耦的地方,我将数据公开,以便图形能够访问它所需的数据 真是一团糟!我从哪里开始?您将如何开始这样的工作? 我

我有一大堆代码。诚然,这是我自己写的——一年前。它没有很好的注释,但也不是很复杂,所以我可以理解它——只是还不足以知道从哪里开始重构它

我违反了我在过去一年里读到的每一条规则。有些类具有多重职责,有些是间接访问(我忘记了这个术语,比如
foo.bar.doSomething()
),就像我说的,它没有得到很好的注释。最重要的是,这是一个游戏的开始,因此图形与数据耦合,或者在我试图将图形与数据解耦的地方,我将数据
公开
,以便图形能够访问它所需的数据

真是一团糟!我从哪里开始?您将如何开始这样的工作?

我目前的方法是将变量转换为私有变量,然后重构那些中断的部分,但这似乎还不够。请提出其他的策略,让我能从这乱七八糟的事情中走出来,把它变成一个干净的东西,这样我就可以继续我刚才说的话了


两天后更新:我一直在为我的类绘制类似于UML的图表,并在此过程中收获了一些“低垂的果实”。我甚至发现了一些新特性的开始代码,但当我试图精简所有内容时,我已经能够删除这些代码,让项目感觉更干净。在装配测试用例之前,我可能会尽可能多地重构(当然,只有那些100%确定不会影响功能的东西!),这样我就不必在更改功能时重构测试用例。(你认为我做得对吗?或者,在你看来,我会更容易接受它并首先编写测试吗?)

请投票选出最佳答案,以便我能公正地评分!你也可以随意添加你自己的答案,还有你的空间我会再给它一天左右的时间,然后可能会将投票率最高的答案标记为已接受

感谢所有到目前为止作出回应的人


2010年6月25日:我从一个似乎对编程相当精通的人那里发现了直接回答这个问题的答案:(或者,如果你读了他的文章,也许没有:)

为此,我做了四件事,当我 需要重构代码:

  • 确定代码的用途
  • 绘制所涉及类的UML和动作图
  • 四处寻找合适的设计模式
  • 为当前类和方法确定更清晰的名称

  • 你总是可以从头开始。这并不意味着放弃它,从无到有,而是试着从一开始就重新思考高层次的事情,因为你似乎从上一次的工作中学到了很多

    从更高的层次开始,在构建新的和改进的结构的框架时,获取所有可以重用的代码,如果您愿意通读这些代码并进行一些小的更改,这些代码可能比您想象的要多

    当你做出改变时,一定要严格要求自己遵守你现在知道的所有好的实践,因为你以后会真正感谢自己

    正确地重新制作程序,使其完全像以前一样,只是更加“干净”,这可能会令人惊讶地耳目一新


    正如其他人也提到的,单元测试是您最好的朋友它们帮助您确保重构工作正常进行,如果您是从“零开始”的,那么现在正是编写它们的最佳时机。

    您比许多面临此问题的人处于更好的位置,因为您了解代码应该做什么

    正如您所做的那样,将变量移出共享范围是一个很好的开始,因为您正在划分职责。最终,您希望每个类都表达一种责任。您可能会看到其他一些东西:

    • 重构的简单目标是在许多地方重复的代码和长方法
    • <> LI>如果您是通过静态初始化的单体或更糟的方式管理应用程序状态,即所有事情都在讨论的全局状态,请考虑将其移动到托管的初始化系统(即依赖性注入框架,如Spring或Guice),或者至少确保初始化不与代码的其余部分纠缠在一起。
    • 集中和标准化您访问外部资源的方式,特别是如果您已经硬编码了文件位置或URL之类的内容
    在不同的场合,对我来说最重要的是单元测试:我花了几天时间为旧代码编写测试,然后我可以放心地进行重构。这是一个完全不同的问题,但通过测试,我可以对代码进行真正、实质性的更改。

    您可能想看看Martin Fowler的书。这本书推广了这个术语和技术(我在学习他的课程时的想法是:“我一直在做很多这方面的工作,我不知道它有个名字”)。链接中的引用:

    重构是一种可控的技术 用于改进一个 现有代码库。其实质是 应用一系列小程序 行为保持变换, 每一个都“太小而不值钱” 做”。然而,累积效应 这些转换中的每一个都是 相当重要。通过在 小步骤可以降低风险 引入错误。你也要避免 当你在工作时系统被破坏了 进行重组-哪些 允许您逐步重构 在很长一段时间内 时间

    正如其他人所指出的,单元测试将允许您自信地重构。并从减少代码重复开始。这本书将给你许多其他的见解