【问题标题】:Writing C++ "Scripts"编写 C++“脚本”
【发布时间】:2012-11-24 06:15:35
【问题描述】:

我是一个用于研究的大型 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:我在这个过程中有几个目标:

  • 尽量减少启动新脚本函数所需的时间。
  • 让所有旧的脚本函数在我的指尖都可以搜索。因此,我可以将这些脚本的一部分复制并粘贴到一个新脚本中。请记住,这应该是供他人使用的好设计。
  • 我不关心脚本文件的编译时间,因为它在 20,000 行代码的情况下在一秒钟内完成编译。

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

编辑 2:根据建议,我开始怀疑在这种情况下提高生产力的部分方法不是重构代码,而是自定义/扩展 IDE 的功能(在我的例子中是 Emacs )。

【问题讨论】:

  • 你的博士课程是什么? (在什么领域)??您希望其他人使用您的图书馆吗?
  • 它是一组用于优化无线网络各个方面的算法。这是我发表的一篇示例论文:goo.gl/lRXtP我确实希望其他人使用该库,但“脚本”函数不是该库的一部分,它们基本上是如何使用该库的个别示例。
  • 那么,我认为我使用一些真正的脚本语言的建议是有道理的。

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


【解决方案1】:

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

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

这有什么好处 - 现在您可以将这些脚本可执行文件用作构建块,以便由其他脚本(如 bash、python、perl 等)放置或调用。

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

  • 是时候开始新的脚本功能了 - 只需复制一个现有文件并稍作调整即可。

  • 让所有旧的脚本函数在我的指尖上都可以搜索 - emacs 可以在你拥有的所有其他脚本文件中进行多文件搜索。

  • 我不关心脚本文件的编译时间——那没关系。但是您可以立即获得所有这些,而无需编辑一个大的main() 并重新编译。

【讨论】:

    【解决方案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)。

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

    【讨论】:

    • 您能否详细说明您建议的“更具体”部分?你能举个例子说明如何将 C++ 与脚本语言联系起来吗?
    • @LexFridman:我添加了对相关文档的具体引用。
    【解决方案3】:

    如果您对它感到满意,并且它对您有用,那就坚持下去。你说你是唯一的开发者,那就随心所欲。我总是花太多时间为我的项目考虑这样的事情:P。我学会了只关注重要和富有成效的事情。理论上的东西只在理论上起作用......

    【讨论】:

      【解决方案4】:

      所有建议的答案都很好,您甚至可以将它们组合起来。只需加上我的 5 美分:您的执行流程完全符合 StrategyCommand 设计模式。您可能想看看他们的利益,但这是利益与投资的问题。

      【讨论】:

        猜你喜欢
        • 2011-08-27
        • 2011-10-02
        • 2013-09-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多