1

我是用于研究的大型 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)。

4

4 回答 4

3

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

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

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

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

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

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

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

于 2012-11-24T06:24:12.227 回答
2

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

所有脚本语言都使您能够粘合您的 C(因此也是 C++)函数。对于 Lua,请参阅其Lua API章节。对于 Python,请参阅其扩展和嵌入 Python部分。对于 Ocaml,请参阅将C 与 OCaml 接口部分。对于 Guile,请参阅《C 语言编程》一章。

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

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

于 2012-11-24T06:19:45.790 回答
1

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

于 2012-11-24T06:19:03.833 回答
1

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

于 2012-11-24T07:32:08.807 回答