С помощью конфигурационных файлов изменять поведение программы можно только в узких пределах,
в основном внешний вид. Все реализуемые функции должны быть реализованы, изменить существующую или
добавить новую функцию невозможно.
Изменять отдельные функции можно, используя загружаемые библиотеки (.DLL, .so).
Тогда в программе должна быть предусмотрена загрузка такой библиотеки и вызов функций из нее.
Более универсальным подходом являются плагины (plugin), которые обеспечивают единый интерфейс (API) для доступа
к функции и используют аналогичный интерфейс для доступа к объектам программы.
Плюсы: код плагина компилируется, т.е. выполняется быстро, нет ограничений на реализуемую функциональность.
Минусы: единый код для всех, нет возможностей настройки на конкретного пользователя,
поэтому они используются для частей программы, которые меняются редко,
например, плагины для работы с внешними устройствами, СУБД.
* Плагин DrawLine для редактора Far Manager
* Плагин Colorer для редактора Far Manager с большим набором конфигурационных файлов
Плагины не подходят для изменения алгоритмов, формул, диалоговых форм и отчётов.
Для настройки формул, логических условий, входных и выходных форм можно предусмотреть в программе вспомогательные
редакторы с сохранением результата во внешних файлах.
Для отчётов можно использовать шаблоны документов в офисных приложениях. Тогда легко менять шрифты,
положение выводимой информации, но при добавлении новых полей
опять возникает вопрос изменения основной программы.
Можно предусмотреть запуск внешних программ.
Но тогда внешняя программа должна получить доступ к обрабатываемой информации и вернуть каким-то образом результат.
Примеры:
* универсальные генераторы отчётов, использующие прямой доступ к БД (Crystal Reports в SAP SE);
* интеграция astyle для форматирования кода в SciTE.
Универсальным способом для обеспечения гибкости программы является скриптовый язык.
В программе должна быть предусмотрена загрузка скрипта из внешнего файла и API для доступа к объектам программы.
Отличие от внешнего интерпретатора: скриптовый язык является частью программы и имеет полный доступ
к внутренним объектам программы.
Пример из SciTE. Здесь editor - глобальный объект, обеспечивающий доступ к редактируемому тексту.
```lua
local function handleChar(char, calledByHotkey)
local pos = editor.CurrentPos
if compile_state=='running' then
return
end
local line=editor:LineFromPosition(pos)
local str=editor:GetLine(line)
if str==nil then
return
end
...
end
scite_OnChar(handleChar)
```
Примеры скриптовых языков:
* JavaScript - доступ к DOM
* Lua - объекты определяются разработчиком
* Visual Basic for Application (VBA) - доступ к документу в Word или к таблице в Excel
* Язык командных файлов в DOS/Windows - переменные среды, текущий путь
Также для автоматизации (повторения) иногда используются макросы, т.е. последовательности нажатий клавиш и
выбранных пунктов меню.
Минусы: нельзя указать какие-либо параметры, линейный алгоритм, изменить сложно
или невозможно, только замена целиком (исключение - макросы в офисных приложениях,
где макрос записывается как программа на VBA).
В некоторых программах вместо макросов
можно выбрать группу действий в истории команд повторить её.