2

我想从一个函数中使用一些 C 代码,但是,该函数有 300 多行代码和 20 个变量,这让我非常头疼。

我只是想知道是否有这样的工具可以自动将小功能与大功能分开(重构)。然后它将为我节省大量时间来处理像这样的长函数。

(我认为这不是一件很难的事情,因为这个工具只需要分析第一次定义变量的位置,以及最后使用变量的位置,然后给我一些关于在哪里拆分的建议.. )

4

2 回答 2

6

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

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

于 2012-05-05T04:16:43.417 回答
1

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

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

您甚至可能希望该工具提供代码的交互式图形切片视图,以便您做出此决定。(Grammatech 提供了一个名为CodeSurfer的 C 切片工具,它正是这样做的)。

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

话虽如此,您仍然无法决定如何拆分功能。这似乎是您遇到的实际问题,而不是工具。

于 2012-05-05T06:49:13.507 回答