Обсуждение статьи "Шаблон проектирования MVC и возможность его использования"

 

Опубликована статья Шаблон проектирования MVC и возможность его использования:

В статье рассматривается распространенный шаблон MVC, возможность, плюсы и минусы его применения в программах на MQL. Его суть в том, чтобы "разделить" имеющийся код на три отдельных компонента: Модель (Model), Представление (View) и Контроллер (Controller).

Нас в этой статье будет интересовать "классический MVC", без усложнений и дополнительного функционала. Его суть в том, чтобы "разделить" имеющийся код на три отдельных компонента: Модель (Model), Представление (View) и Контроллер (Controller). Суть шаблона MVC в том, что эти три компонента могут разрабатываться и сопровождаться независимо друг от друга. Над каждым компонентом может работать отдельная группа разработчиков, выпускать новые версии, устранять ошибки. Вполне очевидно, что в таком случае становится значительно легче работа над общим проектом, и в чужом разобраться бывает быстрее и проще.

Рассмотрим, что представляет собой каждый компонент по отдельности.

  1. Представление (View). Представление отвечает за визуальное отображение. В более общем случае оно отправляет данные пользователю. Заметим, что в действительности способов представления данных пользователю может быть несколько. Например, данные могут быть представлены таблицей, графиком или диаграммой одновременно. Другими словами, в рамках одного приложения, построенного по схеме MVC, может быть несколько Представлений. Представления получают данные от Модели, не имея никакого понятия о том, что происходит внутри Модели.
  2. Модель (Model). Модель содержит данные. Она устанавливает связь с базами данных, посылает запросы в сеть, в другие источники. Она модифицирует данные, проверяет их, хранит и удаляет. Модель ничего не знает о том, как работает Представление и сколько вообще Представлений имеется в наличии, но она имеет необходимые интерфейсы, по которым Представления могут запрашивать данные. Ничего большего Представления делать не могут — они не могут заставить Модель изменить свое состояние. Этим занимается Контроллер. Внутренне, Модель может состоять из нескольких других Моделей, выстроенных в иерархию или работающих равноправно. В этом отношении на Модель не накладывается ограничений, кроме уже упомянутого — Модель держит свое внутреннее устройство в секрете от Представления и Контроллера.
  3. Контроллер (Controller). Контроллер осуществляет связь между пользователем и Моделью.  Контроллер не знает о том, что Модель делает с данными, но он может сказать Модели, что пора обновить содержимое. В общем случае, Контроллер, по своему интерфейсу, работает с Моделью, не пытаясь понять, что происходит у нее внутри.

Визуально, связь между отдельными компонентами шаблона MVC выглядит примерно так:

Автор: Andrei Novichkov

 

хорошо написан материал статьи, очень легко читается, спасибо!

для тестера этот шаблон, имхо, идеален - легко изменять логику ЕА, дополнять новым функционалом

по MVC - как предлагаете обрабатывать ошибки? например ошибки при закрытии/открытии ордеров для реальной торговли

 

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

Про обработку ошибок я не додумал, когда писал, спасибо. А по существу, думаю, их надо обрабатывать в том компоненте, где они возникли. Т.е. если установку ордеров относить к Представлению, то там и обрабатывать. Но и проблема тоже имеется, если асинхронно это делать. Обработчики событий в Контроллере, несколько корявенько получается.

Спасибо за доброе мнение )

 
Andrei Novichkov:

 А по существу, думаю, их надо обрабатывать в том компоненте, где они возникли.

все так и делают, это логично - но проблема, что делать если возникла ошибка и дальнейшее выполнение кода (который ниже) требуется не выполнять (прервать/ или откатиться), думал может Ваша статья осветит этот момент

 
Вы описываете исключение )
 
Andrei Novichkov:
Вы описываете исключение )

какие такие исключения!? - их нет в MQL, и возможно, кто то из разработчиков писал, что это плохой стиль написания программ, это не нужно... ну в общем, это не точно! ))))


ЗЫ:  имхо, для тестера писать по MVC, для реала переносить часть кода с критическими секциями в OnTimer() и ... и опять вместо простого читаемого кода по общепринятым шаблонам (методикам) программирования получим.... наверно MQL-стайл программу )))

 

Да пример просто не очень, по сути view находится за пределами советника.

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

 
MVC не жесткий шаблон и допускает отклонения. Есть конечно "поборники чистоты", ну к этому нужно относиться, как к явлению природы
 

В принципе, ужос. Вроде анонсировали полезный паттерн, но показали как не надо делать: все-таки MVC - это ООП, а тут под предлогом мнимого упрощения кода получились какие-то дебри. Хотя бы прокинули init (он же контроллер) в модель и представление:

int OnInit()
{
   init.Initialize(smb);
   view.Initialize(&init);
   // model.Initialize(&init);
  
   return INIT_SUCCEEDED;
}
Как можно глобальный объект использовать внутри чужого класса, в чужом заголовочном файле?!
 
Stanislav Korotky:

В принципе, ужос. Вроде анонсировали полезный паттерн, но показали как не надо делать: все-таки MVC - это ООП, а тут под предлогом мнимого упрощения кода получились какие-то дебри. Хотя бы прокинули init (он же контроллер) в модель и представление:

Как можно глобальный объект использовать внутри чужого класса, в чужом заголовочном файле?!

Вы до конца дочитали? Я же пишу в конце о коммуникациях между компонентами. И о доступе к глобальным объектам тоже. В данном случае я считаю представленный способ допустимым, именно для понимания большинства. А тот способ, который предлагаете Вы, подразумевает такой же неконтролируемый доступ к глобальным объектам, только вид сбоку.

 

оказывается все намного сложнее - MVC , MVP , MVVM хабр: https://habr.com/ru/post/215605/

если верить хабру, то у автора все правильно изложено, в MVC модель не должна ничего знать (зависеть) кроме своих задач