Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Oop “如何减少重构”;破坏性的;?_Oop_Language Agnostic_Refactoring - Fatal编程技术网

Oop “如何减少重构”;破坏性的;?

Oop “如何减少重构”;破坏性的;?,oop,language-agnostic,refactoring,Oop,Language Agnostic,Refactoring,由于非常晚的主要需求更改,当前正在对应用程序执行相当大的重构 我总是觉得当我做这类事情的时候,我没有以一种非常有纪律的方式来处理它。我的应用程序可能一次运行几天/几周,要么不构建,要么需要注释大量代码才能编译 我不喜欢在这种状态下检查源代码管理,所以我经常觉得如果我犯了一个大错误,我就没有退路了。我现在正在销毁我的应用程序,我的脑袋里有100个不同的线程。就像你读到的那些人一样,他们出于好奇把汽车引擎拆开,然后意识到他们不知道如何重新组装 有没有什么好的资源可以用来讨论如何以一种更渐进、破坏性更

由于非常晚的主要需求更改,当前正在对应用程序执行相当大的重构

我总是觉得当我做这类事情的时候,我没有以一种非常有纪律的方式来处理它。我的应用程序可能一次运行几天/几周,要么不构建,要么需要注释大量代码才能编译

我不喜欢在这种状态下检查源代码管理,所以我经常觉得如果我犯了一个大错误,我就没有退路了。我现在正在销毁我的应用程序,我的脑袋里有100个不同的线程。就像你读到的那些人一样,他们出于好奇把汽车引擎拆开,然后意识到他们不知道如何重新组装


有没有什么好的资源可以用来讨论如何以一种更渐进、破坏性更小的方式进行重构?有人能提供一些建议吗?还是每个人都这么想?

您需要一个好的单元测试套件,以确保不会破坏已经运行的功能。Martin Fowler也有一本关于这个主题的好书:

我还建议您对要重构的代码部分进行抽象,并为其他人提供旧的实现,同时您可以访问正在编写的新代码,这样您仍然可以从源代码管理中获益


使用分布式源代码管理系统还可以让您在不中断他人工作的情况下进行提交。

您所描述的实际上是而不是重构

重构是在不改变代码功能的情况下改进代码设计的一项有纪律的工作
,以小步骤(甚至是简单的步骤)完成,由单元测试保护,以确保系统在每个步骤后都能正常运行。此外,它通常是在较长的时间内以小的增量完成的,而不是在一个大的嗖嗖声中

这并不是说我们对任何事情都过于热心,只是为了澄清这些术语:——)当我们以同样的方式理解同一个词时,误解和沟通问题的机会就更少了

当然,如果您有时间同时进行大量重构,那就更好了!但是,在开始这样的工作之前,您绝对需要构建一组好的单元测试,这些测试最好涵盖您将要更改的代码部分中的所有功能

由于您谈论的是一个“主要的需求变化”,所以不清楚您所说的“重构”实际上是在实现新的功能,还是仅仅改进设计以准备引入新的功能。我强烈建议将这两个阶段分开:首先重构,而不更改现有功能,以使您的设计在正确的位置对扩展更加开放,从而使您能够更轻松地合并所需的功能更改


由@Eric链接的重构书是基础;我要补充的是Josh Kerievsky,这是关于重构的实际应用。

使用允许本地分支的版本控制系统,例如git。这样,在重构过程中,您可以在次要的里程碑处不断进行检查。

我正在处理一个类似的问题,下面是我所做的

  • 不管有多困难,只在“小”块中进行重构,即使这意味着您尚未对该代码块进行最终重构
  • 构建/测试重构过程中的每个步骤
  • 首先关注数据结构重构
  • 接下来关注“流程”和“逻辑”
  • 最后关注速度

  • 关键是使每个重构步骤尽可能小并且经常测试/提交

    当您试图通过未提交的更改实现不止一件事情时,您已经正式从“重构”转向“黑客”


    你所做的每一个改变都应该有一个目的,并且是可以测试的。当然,对于许多系统来说,这是一个挑战,但不知何故,您需要验证给定一组输入,输出不会随重构代码而改变。

    我知道这与语言无关,但从.net的角度来看,我使用了一组很好的单元测试,并使用Resharper来帮助完成这一过程。这个工具在我的重构工作中是非常宝贵的。

    正如您所发现的——一个无效或不存在的“设计”意味着随后的更改确实是破坏性的


    首先,在选择设计时,您必须尝试预测和说明您将面临的可能变化。有些设计可以更好地接受更改——例如,如果您的设计是为了适应快速变化的需求,然后使用自动生成的数据层,将验证保留在一个地方,并使GUI易于修改——这是应用程序中的一种规范化。如果您正在寻找速度可伸缩性等,那么您需要对代码进行非规范化,并将验证放在多个位置,编写重层等

    因此,如果你后来发现自己为了进行必要的修复而破坏了你的应用程序,那么接受这个设计没有成功,并从中吸取教训


    当你面对一个无效的设计,而这将花费你大量的时间来做出预期的改变,那么你就可以按照前面的回答来重构设计。这可以在进行其他更改时完成,尽管理想情况下,你会对你的老板说“嘿,我只打算重写这段代码几周,不,我没有解决你真正想要的功能,哦,是的,我也将编写一系列测试用例,但请不要解雇QA人员,因为这不是那种测试”。他会同意的

    好吧,那么当我有一个90%的应用程序都在进行改变时,我该如何实现这一点呢?@fear-你能更具体地描述一下吗