Я сольный разработчик большой библиотеки C ++, которую я использую для исследований (я аспирант). Допустим, в библиотеке есть несколько классов, которые реализуют классные алгоритмы: Algorithm1
, Algorithm2
и т. д. Затем я пишу набор функций в стиле C, которые представляют собой автономные «скрипты», которые используют библиотеку для тестирования недавно добавленной функциональности или для запуска симуляций, которые создают графики, которые я затем включаю в удивительно блестящий (I ‘). м в опровержение) журнальных публикаций. Дизайн библиотеки следует хорошим принципам разработки программного обеспечения (насколько я знаю и насколько я знаю), но «сценарии», которые связывают библиотеку с 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: У меня есть несколько целей в этом процессе:
Кстати, я использую Emacs в качестве своей «IDE», в Linux, используя процесс Autoconf / Automake / Libtool для сборки библиотеки и сценариев.
Редактировать 2: Исходя из предложений, я начинаю задумываться, не является ли одним из способов повышения производительности в этом сценарии не реструктуризация кода, а настройка / расширение функциональности IDE (в моем случае Emacs).
На вашем месте я бы разбил этот огромный файл на 300 меньших: у каждого был бы только один scriptNN()
а также main()
зову только это.
Теперь, когда он будет скомпилирован, у вас будет 300 маленьких scriptNN
исполняемые файлы (может потребоваться создать соответствующие Makefile
для этого хотя).
Что в этом хорошего — теперь вы можете использовать эти исполняемые файлы скриптов в качестве строительных блоков, которые будут помещаться или вызываться другими скриптами, такими как bash, python, perl и т. Д.
РЕДАКТИРОВАТЬ Объяснение того, как этот дизайн позволяет решать ваши задачи.
Время запустить новую функцию скрипта — просто скопируйте один из существующих файлов и немного подправьте его.
Сделайте все старые функции скрипта доступными для поиска — Emacs может выполнять многофайловый поиск по всем другим имеющимся у вас файлам скриптов.
Меня не волнует время компиляции файла скрипта — тогда это не имеет значения. Но все они будут вам доступны сразу, без редактирования одного большого main()
и перекомпиляция.
Ваш пример может быть хорошим примером использования скриптовый язык. Чтобы быть более конкретным, вы могли бы все ваши script*
Функции C ++, приклеенные к некоторому интерпретатору, например Lua, питон, Ocaml, коварство и т.д. … и ваши тестовые примеры должны быть написаны на языке сценариев.
Все языки сценариев позволяют вам склеивать функции C (а значит и C ++).
Для Луа, см. Его Lua API глава. Для Python см. Его простирающийся & Встраивание Python раздел. Окамль, см. Интерфейс C с OCaml раздел. Для Guile, см. Программирование на С глава.
Вы можете встроить переводчика в свой main
функция, или вы могли бы расширить существующий переводчик с вашим новым C++
функции (следовательно, используя некоторые main
предоставляется переводчиком).
Обратите внимание, что использование некоторого языка сценариев может оказать глубокое влияние на дизайн и архитектуру вашей библиотеки и программного обеспечения.
Если вам это удобно, и это работает для вас, просто придерживайтесь этого. Вы сказали, что вы единственный разработчик, тогда просто делайте что хотите. Я всегда трачу слишком много времени на размышления о таких вещах в своих проектах: P. Я научился просто сосредотачиваться на важных и продуктивных вещах. Теоретические вещи работают только в теории …