Вопросы по ООП в MQL5 - страница 40

 
Dmitry Fedoseev:

const - если надо запретить выполнять переменной присвоение (кроме одного раза при инициализации). Если переменная объявлена как conts, тогда при передаче ее в функцию по ссылке, аргумент функции тоже должен быть const, но это компилятор заставит, можно не задумываться. Если переменной не выполняется присвоение, то ее тоже можно отметить как const - быстрее будет работать, это касается аргументов функций. Однако в любой момент может потребовать доработка...

static - если это переменная в классе, то это редкий случай, даже редчайший. Если метод класса, то если в методе обрабатываются только аргументы этого метода и статические переменные класса, тоже редкий случай (впрочем, не такой и редкий, если просто для удобства в класс собирать функции). 

Еще не дошли руки попробовать C# DLL под MQL5. Раньше делал с обертками на C++, из плюсов создавался экземпляр класса на C#. Есть подозрение, что сейчас в DLL будет использоваться статический класс, что сильно ограничивает возможности. Кто-нибудь знает, сейчас создается статический класс или динамический?

 
Alexey Volchanskiy:

Еще не дошли руки попробовать C# DLL под MQL5. Раньше делал с обертками на C++, из плюсов создавался экземпляр класса на C#. Есть подозрение, что сейчас в DLL будет использоваться статический класс, что сильно ограничивает возможности. Кто-нибудь знает, сейчас создается статический класс или динамический?

я статические только использовал для MQL5 - если есть модификатор static, то сигнатура будет видна прямо из МЕ, очень удобно

насчет ограничения, ну как вариант в отдельный thread выбросить задачу, потом прибить его, на C# делается очень быстро

или можно написать вызовы внутри dll

по моему это не проблема


UPD:

сомневаюсь, что сумею обьяснить свои недавние исследования в разумности использования ООП в задачах MQL, но напишу, что вижу

В общем если использовать ООП стиль, полностью с разграничением доступа и осознанно выставлять все модификаторы private/protected/public и в обязательном порядке использовать const при описании каждого метода и сигнатуры (затем можно убрать если цели метода модифицировать данные ) , и писать все доступы к защищенным данным через get / set - то результат правильно использования ООП, это выявление сложных багов по непреднамеренной модификации данных на этапе разработки.

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

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

Интересное наблюдение, что когда переписывал все вызовы через get / set , то исходник класса сначала рос в обьеме, а потом начал значительно сокращаться, когда начал подставлять в вызовы get / set  - т.е. не скажу, что это сильно раздувает код в обьеме, но еще раз - это обеспечит контроль за целостностью данных!


ЗЫ: ну и если в душе Вы перфекционист, и считаете, что лишний вызов через get / set это  лишние такты процессора, то когда задача выполнена на 100%, то не сложно через поиск в исходнике посчитать вызовы каждого get / set и применить старое правило - если вызов участка кода более одного раза, то необходимо этот участок кода оформить в виде подпрограммы.... ни кто не запрещает это сделать наоборот ---> всего один раз вызов get / set раскрыть в присвоение / чтение поля....но это так сказать "грязные трюки" с сомнительной выгодой

 
Igor Makanu:

я статические только использовал для MQL5 - если есть модификатор static, то сигнатура будет видна прямо из МЕ, очень удобно

насчет ограничения, ну как вариант в отдельный thread выбросить задачу, потом прибить его, на C# делается очень быстро

или можно написать вызовы внутри dll

по моему это не проблема

Я для шарпа имел в виду не статические члены, а вот это

public static class ClassName {}

Экземпляр статического класса нельзя создать через new, уничтожить через delete, у него нет конструкторов и деструкторов, все члены и методы только статические. Короче, давно не работал, но помню, сколько было неудобств, как прокрустово ложе.

Их обычно используют, как контейнер для библиотечных функций, например математических.

 
Alexey Volchanskiy:

Я для шарпа имел в виду не статические члены, а вот это

думаю, что не увидит MQL без модификатора static это класс, а вот если методы внутри с модификатором static увидит

локально внутри dll юзайте как угодно классы, я WinForm делал в dll класс без static все прекрасно работает, но вызывал через static объявленные функции, а где эти функции объявлены внутри какого класса - для вызова dll  из MQL вообще не принципиально, хоть весь класс static хоть не весь

проверить пока не смогу, на ноуте после замены на SSD студию не устанавливал, пока не нужна

 
Alexey Volchanskiy:

Еще не дошли руки попробовать C# DLL под MQL5. Раньше делал с обертками на C++, из плюсов создавался экземпляр класса на C#. Есть подозрение, что сейчас в DLL будет использоваться статический класс, что сильно ограничивает возможности. Кто-нибудь знает, сейчас создается статический класс или динамический?

Класс обычный, методы статические. Другие варианты не пробовал. 

 
Игорь, Дмитрий, короче надо самому пробовать. Я так понимаю, в любом случае надо обращаться по имени класса, а не по имени объекта класса. Попробую, спс.
 
Добрый день! А если у меня вопрос по сигналам, то куда мне писать? Я хотела бы узнать, целесообразно ли подписываться на сигналы, если депозит= 312$ ? И как вообще не зависеть от брокера и работать эффективно, если начал торговать полтора месяца назад? Спасибо.
 
Alexey Volchanskiy:
Игорь, Дмитрий, короче надо самому пробовать. Я так понимаю, в любом случае надо обращаться по имени класса, а не по имени объекта класса. Попробую, спс.

По имени класса обращаться. 

 
Alexey Volchanskiy:Игорь, Дмитрий, короче надо самому пробовать. Я так понимаю, в любом случае надо обращаться по имени класса, а не по имени объекта класса. Попробую, спс.

не могу утверждать, что только так можно вызывать C# из MQL5 , я использовал пример от разработчиков https://www.mql5.com/ru/forum/285631

#import "TestLib.dll"

//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
   int x=41;
   TestClass::Inc(x);
   Print(x);
  }

public class TestClass
{
   public static void Inc(ref int x)
   {
    x++;
   }
}

чтобы получить точку входа в C#, другими способами не пользовался, при определенном пританцовывании с бубнами, один и тот же код .dll может быть скомпилирован для MT4

статья и мои исследования почему код из статьи не работает как задумано  https://www.mql5.com/ru/forum/3153/page4#comment_10366498 - все работает до сих пор

 

просмотрел результаты своей битвы с кодом в стиле ООП - хм... превосходно! ))))


вопрос появился, а вот у меня в коде ну раза три точно используется конструкция вида:

private:
   COrder            *m_order;
.......

// использую так
return(CheckPointer(m_order)==POINTER_INVALID ? true : m_order.Orderclose());

//или так

if(CheckPointer(m_order)==POINTER_INVALID)

 вызовы все в privat методах, но есть ли "джедайский прием ?" чтобы уйти в тексте исходника от CheckPointer(m_order)==POINTER_INVALID  

я про некие гет / сет спрашиваю

проблем особых нет, но так сказать прихоть, ну или пока еще не утихла жажда познания приемов ООП в С++