шаблоны проектирования — Написание C ++ «Скрипты»

Я сольный разработчик большой библиотеки 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: У меня есть несколько целей в этом процессе:

  • Минимизируйте время, необходимое для запуска новой функции скрипта.
  • Сделайте все старые функции скрипта доступными на кончиках пальцев для поиска. Поэтому я могу скопировать и вставить биты этих скриптов в новый. Помни это НЕ должен быть хорошим дизайном для использования другими.
  • Меня не волнует время компиляции файла скрипта, потому что он компилируется менее чем за секунду, как сейчас с 20 000 строк кода.

Кстати, я использую Emacs в качестве своей «IDE», в Linux, используя процесс Autoconf / Automake / Libtool для сборки библиотеки и сценариев.

Редактировать 2: Исходя из предложений, я начинаю задумываться, не является ли одним из способов повышения производительности в этом сценарии не реструктуризация кода, а настройка / расширение функциональности IDE (в моем случае Emacs).

1

Решение

На вашем месте я бы разбил этот огромный файл на 300 меньших: у каждого был бы только один scriptNN() а также main() зову только это.

Теперь, когда он будет скомпилирован, у вас будет 300 маленьких scriptNN исполняемые файлы (может потребоваться создать соответствующие Makefile для этого хотя).

Что в этом хорошего — теперь вы можете использовать эти исполняемые файлы скриптов в качестве строительных блоков, которые будут помещаться или вызываться другими скриптами, такими как bash, python, perl и т. Д.

РЕДАКТИРОВАТЬ Объяснение того, как этот дизайн позволяет решать ваши задачи.

  • Время запустить новую функцию скрипта — просто скопируйте один из существующих файлов и немного подправьте его.

  • Сделайте все старые функции скрипта доступными для поиска — Emacs может выполнять многофайловый поиск по всем другим имеющимся у вас файлам скриптов.

  • Меня не волнует время компиляции файла скрипта — тогда это не имеет значения. Но все они будут вам доступны сразу, без редактирования одного большого main() и перекомпиляция.

2

Другие решения

Ваш пример может быть хорошим примером использования скриптовый язык. Чтобы быть более конкретным, вы могли бы все ваши script* Функции C ++, приклеенные к некоторому интерпретатору, например Lua, питон, Ocaml, коварство и т.д. … и ваши тестовые примеры должны быть написаны на языке сценариев.

Все языки сценариев позволяют вам склеивать функции C (а значит и C ++).
Для Луа, см. Его Lua API глава. Для Python см. Его простирающийся & Встраивание Python раздел. Окамль, см. Интерфейс C с OCaml раздел. Для Guile, см. Программирование на С глава.

Вы можете встроить переводчика в свой main функция, или вы могли бы расширить существующий переводчик с вашим новым C++ функции (следовательно, используя некоторые main предоставляется переводчиком).

Обратите внимание, что использование некоторого языка сценариев может оказать глубокое влияние на дизайн и архитектуру вашей библиотеки и программного обеспечения.

2

Если вам это удобно, и это работает для вас, просто придерживайтесь этого. Вы сказали, что вы единственный разработчик, тогда просто делайте что хотите. Я всегда трачу слишком много времени на размышления о таких вещах в своих проектах: P. Я научился просто сосредотачиваться на важных и продуктивных вещах. Теоретические вещи работают только в теории …

1

Все предложенные ответы хороши, и вы даже можете объединить их. Просто добавьте мои 5 центов: ваш поток выполнения точно вписывается в стратегия а также команда шаблоны проектирования. Возможно, вы захотите взглянуть на их преимущества, но это вопрос выгоды и инвестиций.

1
По вопросам рекламы [email protected]