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

 
Alexey Navoykov:
На самом деле не столь важно, на какой язык похож MQL.  Главное то, что он по идее должен быть более высокоуровневым, чем тот же C++, и код на нём должен быть проще и лаконичней.  Но по факту всё наоборот.  Код на MQL значительно более громоздкий и неповоротливый.  Многое приходится шаманить на костылях.
Мне он по ощущениям WinApi навевает)))
 

кто-нибудь силен показать как портировать в MQL :

https://ru.wikipedia.org/wiki/Хранитель (шаблон проектирования)/Нестандартный вариант шаблона на C++

попробовал в лоб, что то пошло не так с форвардными описаниями

//+------------------------------------------------------------------+
class Originator
{
public:
   int state;
   Originator() : state(0)    {                             }
   class Memento;
   Memento* getMemento();
   void setState(int s)       { state = s;                  }
   void dumpState()           { printf("State: %i", state); }
   class Memento
   {
   public:
      class Originator;
      int state;
      Originator* org;
      Memento() : state(0)    {                             }
      void restoreState();
   };
};
//+------------------------------------------------------------------+
Originator::Memento* Originator::getMemento()
{
   Originator::Memento* m = new Originator::Memento();
//   m.org = this;
//   m.state = state;
//   m->org = this;
//   m->state = state;
   return m;
}
//+------------------------------------------------------------------+
void Originator::Memento::restoreState()
{
//   org->state = state;
}
//+------------------------------------------------------------------+
void OnStart()
{

}
//+------------------------------------------------------------------+
 
Igor Makanu:

кто-нибудь силен показать как портировать в MQL :

https://ru.wikipedia.org/wiki/Хранитель (шаблон проектирования)/Нестандартный вариант шаблона на C++

попробовал в лоб, что то пошло не так с форвардными описаниями

Моя версия:

//+------------------------------------------------------------------+
class Originator
  {
public:
   int               state;
                     Originator() : state(0)    {                             }
   class             Memento;
   Memento*          getMemento();
   void              setState(int s)       { state = s;                  }
   void              dumpState()           { printf("State: %i", state); }
   class Memento
     {
   public:
      //class          Originator;
      int            state;
      Originator*    org;
                     Memento() : state(0)    {                             }
      void           restoreState();
     };
  };
//+------------------------------------------------------------------+
Originator::Memento* Originator::getMemento()
  {
   Originator::Memento* m = new Originator::Memento();
   m.org = GetPointer(this);
   m.state = state;
   return m;
  }
//+------------------------------------------------------------------+
void Originator::Memento::restoreState()
  {
   this.state = state;
  }
//+------------------------------------------------------------------+
void OnStart()
  {
   Originator org_obj;
   Originator::Memento* ptr_mem_obj = org_obj.getMemento();
   delete ptr_mem_obj;
  }
//+------------------------------------------------------------------+
 
Denis Kirichenko:

Моя версия:

отлично! хороший пример

Спасибо!

 
Alexey Navoykov:
На самом деле не столь важно, на какой язык похож MQL.  Главное то, что он по идее должен быть более высокоуровневым, чем тот же C++, и код на нём должен быть проще и лаконичней.  Но по факту всё наоборот.  Код на MQL значительно более громоздкий и неповоротливый.  Многое приходится шаманить на костылях.

Не, ну это короткий анекдот)) Может бы вы по жизни со специальностью ошиблись, может быть, надо было идти в кулинарный техникум?

 
Alexey Navoykov:
На самом деле не столь важно, на какой язык похож MQL.  Главное то, что он по идее должен быть более высокоуровневым, чем тот же C++, и код на нём должен быть проще и лаконичней.  Но по факту всё наоборот.  Код на MQL значительно более громоздкий и неповоротливый.  Многое приходится шаманить на костылях.

Основная проблема здесь - само это портирования, и даже не оно вообще, а то, как можно угораздиться до такой идеи.

 

Вот какие последствия бывают от изучения STL детишками с неокрепшей психикой.

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

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

 
Igor Makanu:

отлично! хороший пример

Спасибо!

class Originator
  {
   int               state;
public:
   class Memento;
   Originator() : state(0){}
   Memento*          getMemento()      {return new Memento(&this);}
   void              setState(int s)   {state=s;}
   int               State()           {return state;}
   void              dumpState()       {printf("State: %i", state);}
///////////////////////////////////////////////////////////
   class Memento{
      int            state;
      Originator*    org;
      public:
                        Memento(Originator* mOrg):state(mOrg.State()),org(mOrg){}
         void           restoreState() {org.setState(state);}
   };
///////////////////////////////////////////////////////////
  };

void OnStart()
  {
   Originator org_obj;
   Originator::Memento* ptr_mem_obj = org_obj.getMemento();
   org_obj.setState(6);
   org_obj.dumpState();
   ptr_mem_obj.restoreState();
   org_obj.dumpState();
   delete ptr_mem_obj;
  }

Вот так, вроде, правильно будет

 
Vladimir Simakov:

Вот так, вроде, правильно будет

ОК, сохраню, мне принцип работы нужно было потестить, возможно это то, что искал - один код для тестера и для рабочего ЕА который может сохранять свое состояние, а в тестере наоборот не тратить ресурсы на "лишние телодвижения" - часть такого паттерна можно же #ifdef -ами прикрыть ;)

 

Паттерн одиночка, если, конечно, кому-то надо:

class Alone{
private:
   int state;        
   Alone():state(0){}
public:
   static Alone* Get(){
      static Alone alone;
      return &alone;}
   int State() {return(state);}
   void State(int _state) {state=_state;}
};

void OnStart()
  {
   Test(123);
   Alone* test=Alone::Get();
   Print(test.State());
  }
  
void Test(int x){
   Alone* test=Alone::Get();
   test.State(x);}

Что-то с пива на доброе потянуло)))

Старею наверное))))

Причина обращения: