我必须处理一些旧的旧代码,不幸的是,其代码风格是在方法开始时声明所有变量。

代码看起来像这样:现在,我想在我的代码库(http://refactoring.com/catalog/reduceScopeOfVariable.html)上应用以下重构,以便我的代码看起来像这样,因此我可以使用Extract Method进行进一步的重构。任何商业产品。

有人知道支持这种重构的任何工具吗?我研究了NetBeans / Eclipse / IntelliJ IDEA,但似乎都不支持这种开箱即用的方法。
因为我有大约3000个遗留方法,不幸的是,它们的结构是这样的,有些保留了1500 LoC每种方法,因此手工完成将非常繁琐。

评论

IntelliJ的C#版本Resharper支持“可以在内部作用域中声明局部变量”修复程序。我以为IntelliJ也是。

代码质量工具可以帮助您跟踪这些问题,例如SonarQube。我仍然不认为这些更改可以通过软件自动修复:(。祝您好运!

尽管OP没有以项目符号列表的形式表达其要求,但OP想要做的事情对我来说似乎很清楚:将所有数据声明移到最新且最里面的作用域,从而使程序功能保持不变。有些可以移动。有些将真正地移到最深处。有些将转移到中级范围,因为在该范围和子范围内需要它们。现在,他所需要的只是一个可以做到这一点的工具。 (有这样的工具,称为“程序转换系统”)。我认为“保留”是不合理的,包括那些不认为可以通过软件来实现的人。

使用Eclipse。将光标移到变量上,按Ctrl + 1并选择“内联局部变量”以减小其范围。之后,突出显示的代码可用于使用Alt + Shift + M提取方法。

@ATG:能否请您将此作为答案?谢谢!

#1 楼

您不可能立即找到这样的工具。

OP需要一种工具,该工具可以解析Java,构建AST,确定作用域并准确标识标识符的每个声明以及该声明在何处在代码中使用。

利用这些信息,人们可以构建一种工具来完成自己想要的事情。解决方案示意图:

 For all scopes, outer to inner:
    For each identifier I in a scope S
        If all uses/assignments of I are in a nested scope T,
            Move I to the nested scope T.
        else if I is first used/assigned in statement F in this scope S,
             and last used in statement L in this scope S,
           Introduce a scope X starting at statement F
             and going to/including statement L;
             insert I into this scope.


Java的各种范围(文件,类,枚举,字段,构造函数/析构函数,方法,参数,本地变量,匿名类等)和标识符的类型。拥有带有符号表的AST应该使它在技术上简单明了,但实际上通过检查符号表并修改AST来实现这一点有点混乱。工作量。 3000种方法可能值得,也可能不值得; 450万行(3000种方法乘以1500行)肯定比任何手动过程都要好。在某种程度上,这将是一个胜利。 (我怀疑您的管理层不会真正忍受这样做,因为您正在尝试“修复不会损坏的东西”)。

您可以使用Eclipse Java解析器尝试此操作。我不确定在此过程可能导致的大量树更改下,它能否承受得起。特别是,我不确定它能否使您检查更改的AST,这对于连续插入嵌套作用域和标识符是必需的。

我们的DMS软件再造工具包具有Java解析器,符号表,标识符列表,以及用于导航AST,模式匹配和源到源转换的工具,以用于匹配模式和进行代码更改,以及元编程胶水将所有这些联系在一起一起。我们没有专门用它来执行此操作,但是我们已经使用DMS在C ++代码上执行了类似的复杂符号作用域改组任务,这甚至更加复杂。 (有关C ++版本的详细信息,请参见案例研究:通过自动程序转换重新设计C ++组件模型,信息和软件技术49(3):275-291 2007)。我是作者/供应商,所以您可以加一点盐。