Java中的自动化和可编程重构

4

我遇到了一个国际化项目的任务,其中包括代码(现在有80%的变量名是意大利语,需要改成英语)。翻译部分没问题,但如何找到重构代码的方法让我很困扰。市场上几乎每个IDE都有这样的重构功能,但它们没有一个自动或可编程的工作。

我的问题是,它们只是使用正则表达式扫描项目中的所有文件,然后重构它们,还是遵循一些复杂的规则?


不清楚你的问题是什么。如果你的问题是“如何将所有意大利变量名自动转换为英文变量名?”,那么答案是另一个问题:“IDE应该如何知道要执行哪些替换?” - Oliver Charlesworth
2
不要使用正则表达式,Eclipse使用ANTLR,但我会获取Eclipse源代码,在其中查找重构工具,并查看是否可以构建一个自动调用它们的插件。编写Eclipse插件相对容易,所以不应该需要很长时间。 - biziclop
1
@OliCharlesworth 我明白了:基本上OP想要根据映射文件批量重命名字段/方法。 - biziclop
我认为IntelliJ有一个功能,可以将代码中的所有硬编码字符串文字提取到属性文件中,然后您可以将其克隆到第二个属性文件中,用于所有意大利语翻译。请参见:http://www.jetbrains.com/idea/webhelp/extracting-hard-coded-string-literals.html - blurfus
2
@biziclop 嗯...当您在Eclipse中使用重构工具来重命名标识符时,我相信它可以找到对该特定变量或方法的引用,以便仅重命名这些引用并避免重命名其他具有相同名称的引用。但是,如果他想基于文件进行批量重命名,那么工具无论如何都无法区分两个具有相同名称的标识符。因此,也许可以简单地完成这项工作(甚至可以使用40年前的工具,例如 sed)? - ajb
显示剩余5条评论
2个回答

3

OP似乎想要进行批量重命名。

虽然不是您期望的工具,但您可以使用我们的Java混淆器来实现这一点。这个解决方案会进行批量重命名,忽略作用域,但我认为对于这个问题来说这样做是可以的。

许多源代码混淆器采用一致的方式对标识符进行混淆。这意味着在混淆器中,存在一个从旧标识符到混淆标识符的映射表,例如,“foo” -> “bar”,意思是“用‘bar’替换‘foo’”。

我们的混淆器在开始之前读取这样的映射表(这是解决方案的关键)。这个映射表可能是由先前的混淆步骤生成的;读取和重复使用这样的映射表确保任何增量/附加混淆都以与原始混淆相同的方式完成。

如果您在一组源文件上运行我们的混淆器,您将获得每个标识符及其被映射到的内容(随机)的完整映射表,该表以文本文件的形式呈现,如上所示:

 foo -> i3718234
 fas -> h823478
 ...

如果您再次运行混淆器并将其输入相同的源代码和此映射文件,则它将(按设计)以相同的方式进行标识符映射,从而产生与第一次相同的结果。
为了完成运营任务,可以对他的代码运行我们的混淆器以获得:
  italianID1 -> i23432
  italianID2 -> g232343
  ...

使用文本编辑器,他可以修改此文件为:
  italianID1 -> englishID1
  italianID2 -> englishID2
  ...

他不想被更改的名称会被编辑为以下形式(显然):
   foo -> foo
   bar -> bar

(A shorthand for this, is to simply leave off the "-> id" part. "foo" by itself is interpreted as "foo -> foo").
现在运行混淆器将把所有意大利ID重命名为英文ID。
查看我的个人简介获取链接。这是一款商业工具,但它可能比一个开发者一天的工资更便宜,并且我认为它解决了他的问题,比构建自己的重构工具要容易得多。
缺点是:我认为他将被迫重新格式化代码。没关系,混淆器包含一个重格式化工具。

3
我曾经使用过JavaParser和另一个我忘记名称的工具的组合,该工具允许我从编译后的.class/.jar文件中跟踪类中所有变量的用法。
JavaParser肯定是可以完成这项工作的工具。明天我会看一下其他组件是什么。可能是Class Dependency Analyser

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接