Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/392.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
Java 如何验证重构是否等于原始代码_Java_Validation_Refactoring - Fatal编程技术网

Java 如何验证重构是否等于原始代码

Java 如何验证重构是否等于原始代码,java,validation,refactoring,Java,Validation,Refactoring,我使用的是遗留java代码,没有任何单元测试。许多类需要重构才能使用项目 许多重构都可以用eclipse完成,我也在手工完成。经过一些重构后,我检查了与cvs头部的差异,但我不能确定所有内容都是100%正确的 问题是:我如何验证一个与前一个版本在数学上相同的重构?我希望有一个工具,但我也接受“基本人类算法”作为解决方案 我知道,“运行JUnit测试”是最好的答案,但遗憾的是,在我的项目中没有 谢谢大家! 我恐怕要说的是,没有一种算法可以验证一个程序在语义上与另一个程序相同——这有点像是一个停顿的

我使用的是遗留java代码,没有任何单元测试。许多类需要重构才能使用项目

许多重构都可以用eclipse完成,我也在手工完成。经过一些重构后,我检查了与cvs头部的差异,但我不能确定所有内容都是100%正确的

问题是:我如何验证一个与前一个版本在数学上相同的重构?我希望有一个工具,但我也接受“基本人类算法”作为解决方案

我知道,“运行JUnit测试”是最好的答案,但遗憾的是,在我的项目中没有


谢谢大家!

我恐怕要说的是,没有一种算法可以验证一个程序在语义上与另一个程序相同——这有点像是一个停顿的问题,而这被证明是无法解决的

另一种自动化程度稍高的方法是比较两个程序的输出。然而,这对于任何大型程序来说都是困难的,因为可能没有定义好的输入范围

也许是时候编写您觉得如此缺乏的单元测试了

编辑:考虑到你会接受人工算法,这是我通常做的。我将研究要重构的代码,并理解其语义。至少编写一个单元测试,或者为代码库的该部分编写某种自动测试。执行重构,然后查看测试是否仍然通过。如果确实如此,那么重构(*)很有可能没有破坏任何东西


(*)在这里,我的意思是重构是改变实现/算法等,而不仅仅是简单的重命名和混叠代码,并将普通代码行转换成方法/基类等。只要您对代码库有很好的理解,您几乎可以看到这些代码。

我仍然会说“运行您的单元测试”;)。您必须真正确保结果相同的唯一选项是单元测试。您可以在重构特定代码之前自己添加它们。一开始需要更长的时间,但从长远来看会为您节省大量的时间。

如果您认为可以通过对程序的关注来发现这一点,那么您正在走下坡路。正如另一位回应者已经说过的,两个程序是否相等的问题是不可判定的(通过图灵机器)

如果您没有单元测试,我建议您至少设置一个回归测试工具。拍摄程序的一些输入和一些输出的快照版本1获取/生成,运行到版本2,并确保结果相同

如果它是一个GUI,我希望它有MVC分离,这样您就可以单独测试模型,否则您可能会被卡住。

在“”中有一个特定的部分讨论它。问题是重构需要单元测试,但复杂的代码通常是不可测试的。因此,您需要重构以使其可测试。循环

因此,最佳策略如下:

执行微小的重构步骤。当步骤很小时,人类更容易确保整体行为完好无损。只选择增加可测试性的重构。这是你当前的目标。不要考虑支持未来的功能(或任何类似的花哨的东西)。试想一下“我如何使单元测试能够测试这个方法/类”

一旦一个方法/类成为可测试的,就为它编写单元测试

重复这个过程将逐渐使您处于一个有测试的位置,因此您可以更积极地重构。通常,这个过程比预期的要短

问题是:如何验证 重构,也就是数学上的重构 与以前的版本相同吗?我 真希望有个工具,但我也 接受“基本人类算法”为 解决方案

严格地说,重构是一组众所周知的转换,已被证明可以保留代码的语义。看见 其他一切都应该称为重新设计,但我同意两者可以互换使用

语义保持推理是一个比较困难的问题,也是一个开放的研究课题。例如,见

除非我们有有效的工具来检查语义保留,否则最好的方法就是依赖测试。另一种让你的改变更有信心的方法是添加断言和契约。它将迫使你做一个回顾,思考什么可能已经改变,什么是不变量,什么可能被更深入地打破

问题是:我如何验证一个与前一个版本在数学上相同的重构?我希望有一个工具,但我也接受“基本人类算法”作为解决方案


我同意Chii的观点,这在本质上是不可能的。如果您真的需要重构它(而不是为遗留代码编写适配器,使新代码与旧代码松散耦合),您必须特别注意子类、重写的方法等。编写单元测试可能会有所帮助,但如果您实际上不知道代码应该做什么,如何为它编写单元测试?您只能编写单元测试,以确保新代码与您假设的旧代码相同。

对于一个需要重构的大型god类项目,我做了以下工作:

在方法开始和结束时,使用AOP“转储”对象状态和参数。也转储返回值

然后用需要更改的代码记录大量场景,并使用重构代码重播它们

这不是数学上的,设置起来有点重,但是在得到一组好的非回归测试之后


使用诸如XStream之类的工具很容易设置转储程序

我同意Itay的答案,但只是给出另一个选择。
如果你愿意付钱,有一种产品