Интеграция ООП (MQL5) и SQL: концепция ORM

Использование базы данных в MQL-программе подразумевает, что алгоритм поделен на 2 части: управляющая пишется на MQL5, а исполнительная — на SQL. В результате исходный код может начать представлять собой лоскутное одеяло и требовать внимания на поддержание согласованности. Чтобы избежать этого, в объектно-ориентированных языках разработана концепция Object-Relational Mapping (ORM), то есть отображения объектов в записи реляционных таблиц и обратно.

Суть подхода в том, чтобы инкапсулировать все действия на языке SQL в классах/структурах специальной прослойки. В результате прикладную часть программы можно писать на чистом ООП-языке (например, MQL5), не отвлекаясь более на нюансы SQL.

При наличии полноценной реализации ORM (в виде "черного ящика" с набором всех команд) у прикладного разработчика вообще появляется возможность не изучать SQL.

Кроме того ORM позволяет "незаметно" поменять "движок" СУБД при необходимости. Это не особо актуально для MQL5, потому что в него встроена только база SQLite, но некоторые разработчики предпочитают применять полновесные СУБД и подключают их к MetaTrader 5 с помощью импорта DLL-библиотек.

Наконец, использование объектов с конструкторами и деструкторами очень удобно для автоматического захвата и освобождения ресурсов. Мы рассматривали эту концепцию (RAII, Resource Acquisition Is Initialization) в разделе Управление дескрипторами файлов, однако, как мы увидим далее, работа с базой данных также строится на выделении и освобождении дескрипторов различного вида.

На следующей картинке схематично изображено взаимодействие разных слоев ПО при интеграции ООП и SQL в виде ORM.

Объектно-реляционное отображение ORM

Объектно-реляционное отображение ORM

В качестве бонуса объектная "обертка" (не только ORM, специфическая для БД) позволит автоматизировать подготовку и преобразование данных, а также проверить их на корректность в целях предотвращения некоторых ошибок.  

В следующих разделах, в процессе знакомства со встроенными функциями для работы с базой, мы будем реализовывать примеры, постепенно формируя собственную простую прослойку ORM. Из-за некоторой специфики MQL5 наши классы не смогут обеспечить универсализм, покрывающий 100% задач, но окажутся полезными для многих проектов.