是否有重构工具将大型函数自动拆分为小函数?

时间:2012-05-05 04:08:34

标签: c function ide refactoring

我想从一个函数中使用一些C代码,但是,该函数有300多行代码和20个变量,这让我很难处理。

我只是想知道是否有这样的工具可以自动地将小函数与大函数分离(重构)。那么它将节省我很多时间来处理这样的长期功能。

(我认为这不是一件非常困难的事情,因为这个工具只需要分析第一次定义变量的位置,以及最后使用变量的位置,然后给我一些建议,告诉我去哪里分裂..)

2 个答案:

答案 0 :(得分:6)

问题在于计算机很难知道函数的用途是什么。如果碰巧所有20个变量和300行代码都是一个任务所需要的,并且将该任务分开是没有意义的,那么它就是一个很好的功能。这有点难以想象,但仍然。

不要破坏 ,因为它很长。分手,因为这样做是有意义的。保持功能只执行一件事。到目前为止,计算机还不够聪明,无法弄清楚函数的用途,特别是不够聪明,无法确定哪些函数的子部分可以合理分割出来。

答案 1 :(得分:0)

是的,有些工具可以做到这一点。你想要的是一个程序转换工具,它可以将C解析为AST,可以确定函数内的数据流,并可以使用数据流作为指导来转换AST,并可以从转换后的树中重新生成文本。

您必须面对的一个问题是如何告诉工具 分割功能。您想要什么部分作为子功能?可以说,你可以在函数中指定函数(赋值,子表达式或语句)中的任何set 操作来进入子函数,一般来说你需要那么多的控制;这可能是一个非常详细的描述(可能是一组行/列对)。但是你经常需要一些自动选择,比如“把只支持操作的东西”放到子程序中;然后,具有数据流分析的工具可以从操作计算后向切片,找出后向切片的哪个部分仅用于操作,并移动相应的代码。实际上,您需要结合这些想法。在任何一种情况下,该工具现在都知道必须移动什么。将指定代码移动到子程序中只是“一组”标准程序转换;大多数编译器都有内部机制来执行此操作。

您甚至可能希望该工具提供代码的交互式图形切片视图,以便您做出此决定。 (Grammatech提供了一个C切片工具调用CodeSurfer来完成这个)。

可以计算此类切片并执行代码转换的工具是DMS Software Reengineering Toolkit及其C Front End。 (它不像CodeSurfer那样具有交互性;但CodeSurfer无法更改代码)。 您需要配置DMS以实现该特定任务;它有上面提到的所有机器。实际上,这可能比你手动拆分一个功能所花费的工作更多。

话说回来,你仍然坚持决定如何分割功能。而且,而不是工具,似乎是你遇到的实际问题。