编写C ++“脚本”

时间:2012-11-24 06:15:36

标签: c++ design-patterns coding-style main

我是一个用于研究的大型C ++库的独立开发人员(我是博士生)。假设库有一堆实现很酷算法的类:Algorithm1Algorithm2等。然后我写了一堆C风格的函数,它们是使用库的独立“脚本”要么测试最近添加的功能,要么运行模拟产生的情节,然后包含在奇妙的(我在拒绝)期刊出版物中。该库的设计遵循良好的软件工程原则(据我所知和能力),但链接main.cpp库的“脚本”不遵循任何原则,除了:“完成工作”。

我现在在一个文件中有超过300个这样的“脚本”(20,000多行代码)。我没有问题,我仍然非常富有成效,这才是最终的目标。但我想知道这种方法是否存在我刚学会过的主要弱点。

// File: main.cpp

#include <cool_library/algorithm1.h>
#include <cool_library/algorithm2.h> 
...
#include <cool_library/algorithmn.h> 

void script1() {
    // do stuff that uses some of the cool library's algorithms and data structures
    // but none of the other scriptX() functions
}

void script2() {
    // do stuff that uses some of the included algorithms and data structures
}

... 

// Main function where I comment in the *one* script I want to run.
int main() {
    // script1();
    // script2();
    // script3();
    ...
    script271();

    return 0;               
}

编辑1:我在这个过程中有几个目标:

  • 最小化启动新脚本功能所需的时间。
  • 使用我的指尖提供所有旧脚本功能以进行搜索。因此,我可以将这些脚本的位复制并粘贴到新脚本中。请记住, NOT 应该是其他人使用的好设计。
  • 我不关心脚本文件的编译时间,因为它在一秒钟内编译,就像现在使用20,000行代码一样。

顺便说一句,我在Linux中使用Emacs作为我的“IDE”,使用Autoconf / Automake / Libtool流程来构建库和脚本。

编辑2:基于这些建议,我开始怀疑在这种情况下提高工作效率的部分方法是不重构代码,而是自定义/扩展IDE的功能(在我的案例中是Emacs) )。

4 个答案:

答案 0 :(得分:3)

如果我是你,我会将这个巨大的文件分成300个较小的文件:每个只有一个scriptNN()main()只调用它。

现在,当你编译它时,你将有300个小scriptNN个可执行文件(你可能需要为此创建适当的Makefile)。

这有什么好处 - 现在你可以使用这些脚本可执行文件作为构建块来放置或调用其他脚本,如bash,python,perl等。

编辑说明此设计如何实现您的目标。

  • 启动新脚本功能的时间 - 只需复制一个现有文件并稍微调整一下。

  • 在我的搜索指针中提供所有旧脚本功能 - emacs可以对您拥有的所有其他脚本文件进行多文件搜索。

  • 我不关心脚本文件的编译时间 - 那不重要。但是,您可以立即使用所有这些内容,而无需编辑一个大main()并重新编译。

答案 1 :(得分:2)

您的示例可能是scripting language的一个很好的用例。更具体地说,您可以将所有script* C ++函数粘贴到某个解释器,例如LuaPythonOcamlGuile等等。让你的测试用例用脚本语言编写。

所有脚本语言都可以粘合C(因此也是C ++)函数。 对于Lua,请参阅其Lua API章节。对于Python,请参阅其Extending & Embedding Python部分。对于Ocaml,请参阅Interfacing C with OCaml部分。对于Guile,请参阅Programming in C章节。

您可能希望将解释器嵌入main函数中,或者您可以使用新的C++函数扩展现有解释器(因此使用解释器提供的一些main)。

请注意,使用某种脚本语言可能会对您的库和软件的设计和架构产生深远的影响

答案 2 :(得分:1)

如果你对它感到满意,并且它适合你,那就坚持下去吧。你说你是唯一的开发者,然后只做你想做的事。我总是花太多时间为我的项目考虑这样的事情:P。我学会了专注于重要而富有成效的事情。理论事物只在理论上起作用......

答案 3 :(得分:1)

所有建议的答案都很好,你甚至可以将它们结合起来。只需添加5美分:您的执行流程完全符合StrategyCommand设计模式。您可能希望了解它们的好处,但这是一个利益与投资的问题。