自动重构

时间:2011-11-23 07:18:53

标签: c++ refactoring

请建议一个可以自动替换的工具,如:

Mutex staticMutex = Mutex(m_StaticMutex.Handle());
staticMutex.Wait();

boost::unique_lock<boost::mutex> lock(m_StaticMutex);

如您所见,必须考虑这些论点。有没有比正则表达式简单的方法?

2 个答案:

答案 0 :(得分:3)

如果你可以通过适量的手工工作(甚至包括“搜索和替换”)来做到这一点,那么这个答案是无关紧要的。

如果代码变化太大(缩进,注释,不同的变量名称),并且有很多这些,您可能需要一个Program Transformation工具。这些工具倾向于在程序表示(如抽象语法树)上运行,因此不会因布局或空格或甚至由于基数而拼写不同的数字而烦恼,但实际上具有相同的值。

我们的DMS Software Reengineering Toolkit就是其中之一,并且有一个C++ Front End

你需要给它一个重写规则,如下所示:

 domain Cpp; -- tell DMS to use the C++ front end for parsing and prettyprinting

 rule replace_mutex(i:IDENTIFIER):statements -> statements
      "Mutex \i = Mutex(m_StaticMutex.Handle());  
       \i.Wait();" =>
      "boost::unique_lock<boost::mutex> lock(m_StaticMutex);";

在两个地方使用元变量 \ i 将确保只有在两个地方的名称完全相同时才会触发规则。

我不清楚你要完成的是什么;看起来你想要用一个全局互斥替换每个私有互斥,但我不是一个助推专家。如果你试图这样做,我希望你的程序行为不同。

答案 1 :(得分:0)

如果这些行频繁出现在您的代码中,类似格式化,只是使用不同的变量名称,但不是“太”频繁(<200~300次),我建议您使用具有记录重放功能的编辑器(对于示例Windows下的Visual Studio)。记录用新的替换2行的步骤(但保留变量名称)。然后根据需要重复“搜索Mutex” - “重播宏”。

当然,任何具有良好“文件中查找和替换”功能的文本编辑器都可以同时解决所有出现的特定情况。