我的任务是维护和重构遗留Java系统。我目前正在做C#和.NET,尽管我对Java很熟悉。
遗留系统使用RMI,这是一种客户端/服务器架构,是为1.4JVM设计的。它用于UI (据我所知)、Swing和AWT。
我的问题是:与我刚刚收到的代码库达成协议的最佳方式是什么?我正在考虑屏幕的流程图,定义RMI调用之间的边界,并编写单元测试(针对可测试的部分)。
当你得到一个不熟悉的代码库时,你会怎么做?
谢谢!
-Jarrod
发布于 2009-02-09 00:37:41
我对任何新代码所做的第一件事就是查看现有的单元测试。编写新测试通常是第二件事。
发布于 2009-02-09 01:06:22
这在很大程度上取决于代码库的质量。实际上,您可以更狭义地定义它-这取决于代码的清晰度和注释的好坏(我写这篇文章的人反复处于继承文档不佳的遗留代码库的位置)。
代码库越差,你就越需要从外到内推断它的功能--如果你不能弄清楚一个函数在做什么,你至少可以弄清楚GUI似乎暗示着它在做什么。拥有RMI接口可能是一件好事,因为它可以让您简化GUI需要看到的内容-从远程接口中抽象出来是一个非常好的想法。
如果代码库真的很差,单元测试不太可能对您有所帮助,因为即使正确实现,您也可能测试出一些错误的东西。我继承的最后一个东西的例子:(故意删除名称和描述-它们在任何情况下对原始文件都没有帮助)
public static int[] a (List<int[]> input){
... lots of opaque rubbish
return b(input);
}
public static List<int[]> b{ List<int[]> input)
{
... more crap....
return some horribly mangled list of int[];
}事实证明,a完成的是根据数组的第二个元素的值对数组进行排序。在这种情况下,测试b的正常行为是没有用的。
帮助你保持理智的建议:
当然,如果代码库写得很好,这大部分都是不必要的,但在任何情况下,你的工作都会容易得多。祝你好运。
发布于 2009-02-09 01:41:02
有一件事可以帮助我处理对我来说是新的代码--这对于写得很好的代码来说就不那么必要了--那就是对它进行一两天的大规模重构,然后放弃所有的更改。这个过程帮助我理解代码的作用;使用代码帮助我理解它。它还开始教我代码的哪些部分是脆弱的。
如果您有机会迁移到较新版本的Java,那么泛化所有集合将有助于理解传递的数据类型。
当然,我是在测试实验室中安装了该软件并尝试了一下,以了解它的作用之后才这样做的。
编辑:根据我的回答,同样有用的是启用所有诊断跟踪和日志记录,使用系统,然后研究日志。如果存在通信协议跟踪,那么查看此跟踪将有助于理解代码使用的通信协议,也许可以使用相同测试的Wireshark跟踪。
另一个有用的迁移是从旧的并发库迁移到新的Java5(和6)并发库。这将帮助您了解线程的位置以及它们何时启动和何时关闭。
当然,对于不熟悉的代码库上的任何代码更改,我都假定进行了适当的测试,以确保没有任何损坏!然而,为了平衡这一点,我了解到,在重构编写得很差的代码之后,新引入的bug通常比重构之前存在的bug更容易找到。
https://stackoverflow.com/questions/526767
复制相似问题