Новички, с какими трудностями в программировании на MQL вы сталкиваетесь в 2025 году? - страница 21

 
Vladislav Boyko #:
template method pattern

Ну без ООП тоже можно что-то подобное, наверное, если раздуть сигнатуру указателями на функции. Так-то, в теории, можно обернуть указатели на функции в структуру чтобы не раздувать сигнатуру шаблонного метода. Я не пробовал так делать, но звучит сложнее, чем с ООП разобраться.

 
Vasiliy Sokolov #:
Поправка: у Вас разбухает в разы, у Вас начинает теряться контекст. Почему: ответил в предыдущем посте. Но важное уточнение: это управление сложностью. Сложность постоянно растет и никуда не девается. Вы можете лишь эту сложность равномерно распределять, так что бы в каждой отдельной единицы программы она была не высока, настолько, что бы ее можно было понять достаточно просто. Весь секрет. ООП для этого не нужен. Но дальше, после определенного уровня сложности, композиции по функциям становится уже не достаточно. Но все равно нужно вначале хорошо так упереться на первом уровне, что бы понять следующий.

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

Буквально на днях был показательный пример, разбирал класс CCustomSymbol, надо было переделать под другую биржу и restapi. Взять готовое, написать виртуальные функции не получилось бы. Стал прикидывать что где надо менять, из-за раздутого кода быстро теряется контекст, много функций мне все равно не нужны были и нужно было еще своих добавить. В общем плюнул, по быстрому сделал в процедурном стиле с нуля. Не ломал голову какой функционал понадобится через 10 лет, как инвертировать зависимости, когда нужно будет тогда и наращу функционал, зато ментальную энергию сохранил. Мне этот код не надо на выставку везти, главное чтоб работал здесь и сейчас.

 
Artyom Trishkin #:
Т.е. как только начинаете не понимать свой код, решаете, что не очень-то он и нужен? 
Нет, к этому моменту все задачи выполнены. Через неделю я этот код забуду и буду долго разбирать, но через неделю он мне не нужен будет
 
Artyom Trishkin #:
Т.е. как только начинаете не понимать свой код, решаете, что не очень-то он и нужен? 
Конгениально. Да, это рецепт понятного кода. 

Объективности ради в research так примерно и происходит. Пишут одноразовый код для проверки гипотез. Если взлетело - начинают энтерпрайзно переписывать, а зачастую и так оставляют, по принципу "раз работает - не трожь".

У меня случай был. Была ТС-ка которая показывала ну очень не дурные результаты. И вот решил я сделать рефакторинг. Сразу попалось подозрительное условие if, с явной ошибкой. Убар его и привел ТС к первоначальному замыслу. Прогнав ее на тестере ужаснулся, прибыль практически полностью исчезла и ТС кардинальным образом ухудшилась.

 
Yuriy Bykov #:
Алексей, мне кажется, это неправильный пример для демонстрации понятия виртуальная функции. Так как если вы уберёте только слово "virtual" в этом коде, то по идее получите точно такие же результаты. И тогда не понятно, что привносит указание virtual.

Возможно не самый наглядный пример.

Я столкнулся вплотную с виртуальными функциями когда мне пришлось добавлять объекты в список проверяя не добавлен ли такой ранее. В этой проверке списка участвует виртуальный метод Compare из класса CObjekt который просто возвращает 0

class CObject
  {
private:
   CObject          *m_prev;               // previous item of list
   CObject          *m_next;               // next item of list

public:
                     CObject(void): m_prev(NULL),m_next(NULL)            {                 }
                    ~CObject(void)                                       {                 }
   //--- methods to access protected data
   CObject          *Prev(void)                                    const { return(m_prev); }
   void              Prev(CObject *node)                                 { m_prev=node;    }
   CObject          *Next(void)                                    const { return(m_next); }
   void              Next(CObject *node)                                 { m_next=node;    }
   //--- methods for working with files
   virtual bool      Save(const int file_handle)                         { return(true);   }
   virtual bool      Load(const int file_handle)                         { return(true);   }
   //--- method of identifying the object
   virtual int       Type(void)                                    const { return(0);      }
   //--- method of comparing the objects
   virtual int       Compare(const CObject *node,const int mode=0) const { return(0);      }
  };
//+------------------------------------------------------------------+

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

 
Alexey Viktorov #:

Возможно не самый наглядный пример.

Я столкнулся вплотную с виртуальными функциями когда мне пришлось добавлять объекты в список проверяя не добавлен ли такой ранее. В этой проверке списка участвует виртуальный метод Compare из класса CObjekt который просто возвращает 0

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

Да, это пример очень хороший, так как сама библиотека CObject получилась удачной. Написать свою функцию сравнения несоизмеримо проще, чем под каждый тип данных придумывать алгоритм сортировки и коллекцию для его хранения. В этом и смысл полиморфизма. Замечу, что тот же, довольно популярный в определенных кругах CDictionary тоже требует CObject, потому что это базовый универсальный класс, позволяющий делать с его потомками многое.
 
Лично я с Ленью, она меня пока побеждает......я ручками, по старинке.
 
Artyom Trishkin #:
Vladislav Boyko #:

Уже где то спрашивал, ответа не получил

Подскажите пожалуйста, как остановить принудительное обновление и перезагрузку МТ5?

 
VVT #:

Уже где то спрашивал, ответа не получил

Подскажите пожалуйста, как остановить принудительное обновление и перезагрузку МТ5?

Подключаясь к MetaQuotes-Demo серверу, вы разрешаете автоматическую загрузку и установку бетта билдов. Если не подключаться к демо серверу от MQ, то терминал не должен самовольно обновляться до бетта сборок.
 
Vladislav Boyko #:
Подключаясь к MetaQuotes-Demo серверу, вы разрешаете автоматическую загрузку и установку бетта билдов. Если не подключаться к демо серверу от MQ, то терминал не должен самовольно обновляться до бетта сборок.
Спасибо но, я не подключаюсь к демо серверу от MQ, и уже несколько раз находил терминал самопроизвольно выключенным а в истории сообщение о новой версии
В винде есть опция паузы обновлений
Как остановить принудительные обновления в МТ5? чтобы терминал мог работать месяцами без остановки