Обсуждение статьи "Реализация шаблона "Декоратор" в MQL5: Добавление логирования, измерения времени выполнения и фильтрации к любому индикатору без изменения исходного кода"

 

Опубликована статья Реализация шаблона "Декоратор" в MQL5: Добавление логирования, измерения времени выполнения и фильтрации к любому индикатору без изменения исходного кода:

Сквозные аспекты, такие как логирование, измерение времени и пороговая фильтрация, не должны находиться внутри классов индикаторов. В данной статье показано, как применить шаблон проектирования "Декоратор" в MQL5 с общим интерфейсом IIndicator, базовым декоратором-владельцем CBaseDecorator и конкретными слоями-декораторами CLoggingDecorator, CTimingDecorator и CThresholdFilterDecorator. Для каждого советника можно комбинировать поведение декораторов, оставлять вычислительный код закрытым для изменений и обеспечивать детерминированную очистку удалением только внешнего декоратора.

Чтобы добавить измерение времени выполнения в существующий класс индикатора RSI, разработчик обычно размещает вызовы GetMicrosecondCount() до и после вычислений. Когда второму разработчику требуется логирование, он открывает тот же файл и добавляет вызовы Print(). Когда третьему разработчику требуется пороговая фильтрация, он добавляет условную логику возврата. После нескольких итераций класс RSI накапливает код, не связанный с вычислением RSI. Он содержит инфраструктурные сквозные аспекты, относящиеся к вызывающему контексту, а не к индикатору.

Такой подход нарушает принцип открытости/закрытости, согласно которому класс должен быть открыт для расширения, но закрыт для модификации. Каждое изменение исходного кода для добавления сквозного аспекта увеличивает риск регрессий в основной вычислительной части индикатора. Изменение необходимо проверить на всех существующих сценариях использования. Если класс индикатора используется несколькими советниками, изменение одновременно влияет на все эти советники. Если класс находится под контролем версий и другой разработчик внес несвязанные изменения в тот же файл, вероятность конфликтов слияния повышается.

Более глубокая проблема состоит в том, что добавляемые аспекты не являются свойствами индикатора. Измерение времени, логирование и фильтрация относятся к способу использования индикатора в конкретном контексте. Другому советнику может потребоваться измерение времени, но не логирование. Окружению для тестирования на исторических данных может не потребоваться ни то, ни другое. Класс индикатора вообще не должен содержать эти аспекты.

Decorator runtime chain and class structure


Автор: Ushana Kevin Iorkumbul