Fragen zu OOP in MQL5 - Seite 48

 
Alexey Navoykov:
Das Wichtigste ist, dass MQL auf einer höheren Ebene als C++ angesiedelt ist und der Code darin einfacher und lakonischer sein sollte. Aber in Wirklichkeit ist es genau umgekehrt. Der Code in MQL ist viel schwerfälliger und unbeholfener. Man muss eine Menge Dinge knacken.
Es erinnert mich an WinApi von sensation)))
 

jemand stark , um zu zeigen, wie man auf MQL portiert:

https://ru.wikipedia.org/wiki/Хранитель (Entwurfsmuster) / C++ Nicht-Standardversion des Musters

versuchte es frontal, irgendetwas ging bei den Vorwärtsbeschreibungen schief

//+------------------------------------------------------------------+
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:

jemand stark , um zu zeigen, wie man auf MQL portiert:

https://ru.wikipedia.org/wiki/Хранитель (Entwurfsmuster) / C++ Nicht-Standardversion des Musters

versuchte es frontal, irgendetwas ging bei den Vorwärtsbeschreibungen schief

Meine Version:

//+------------------------------------------------------------------+
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:

Meine Version:

Großartig! Ein gutes Beispiel!

Ich danke Ihnen!

 
Alexey Navoykov:
Die Hauptsache ist, dass es auf einer höheren Ebene als C++ angesiedelt ist und der Code darin einfacher und lakonischer sein sollte. Aber in Wirklichkeit ist es genau umgekehrt. Der Code in MQL ist viel schwerfälliger und unbeholfener. Viele Dinge müssen verkrüppelt werden.

Nee, das ist ein kurzer Scherz.) Vielleicht haben Sie im Leben das falsche Fach gewählt, vielleicht hätten Sie eine kulinarische Fachschule besuchen sollen.

 
Alexey Navoykov:
Eigentlich ist es egal, wie MQL aussieht. Die Hauptsache ist, dass es mehr High-Level als C++ sein soll und der Code darin einfacher und prägnanter sein sollte. Aber in Wirklichkeit ist das Gegenteil der Fall. Der Code in MQL ist viel schwerfälliger und unbeholfener. Viele Dinge müssen verkrümelt und manipuliert werden.

Das Hauptproblem ist hier die Portierung selbst, nicht einmal die Portierung im Allgemeinen, sondern wie man auf eine solche Idee kommen kann.

 

Das passiert, wenn Kinder mit unreifem Verstand STL lernen.

Und MQL - seine Schöpfer haben gerade perfekt gezeigt, dass sie, mehr als jeder andere, die tatsächlichen Probleme der Programmierer und die Herausforderungen der Programmierung verstehen. Wenn Sie das nicht verstehen, sollten Sie vielleicht wirklich über eine kulinarische Fachschule nachdenken.

Das Hauptproblem bei MQL, das wichtigste und einzige, besteht darin, den Algorithmus zu durchdenken, der die zuverlässige Ausführung der Strategie gewährleistet. Das ist überhaupt kein Sprachproblem. Keine Sprache oder Syntax kann dies von sich aus leisten. Deshalb ist Ihr Herumstochern auf der Ebene der Syntax ein deutlicher Beweis dafür, dass Sie sich noch auf Kindergartenniveau befinden. Das heißt, Sie haben noch nicht einmal gelernt, wie man programmiert, geschweige denn, dass Sie stabile Algorithmen entwickeln können. Aber wenigstens hast du... eine ganze Wagenladung.

 
Igor Makanu:

Ausgezeichnet! Gutes Beispiel!

Ich danke Ihnen!

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;
  }

Das scheint richtig zu sein

 
Vladimir Simakov:

Dies scheint der richtige Weg zu sein

OK, ich werde es speichern, ich brauchte, um das Prinzip der Arbeit zu testen, vielleicht ist dies, was ich suchte - ein Code für Tester und für die Arbeit EA, die ihren Zustand zu speichern, und in der Tester im Gegenteil nicht zu verschwenden Ressourcen auf "extra Gesten" - Teil eines solchen Musters kann durch #ifdef -ami abgedeckt werden ;)

 

Einzelne Muster, falls jemand sie braucht, natürlich:

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);}

Seit dem Bier sehne ich mich nach einem guten Bier)))

Ich werde alt, schätze ich))))

Grund der Beschwerde: