MQL5'te OOP hakkında sorular - sayfa 48

 
Alexey Navoykov :
MQL'nin hangi dilde göründüğü gerçekten önemli değil. Ana şey, teoride, aynı C ++ 'dan daha yüksek seviyeli olması ve üzerindeki kodun daha basit ve daha özlü olması gerektiğidir. Ama aslında tam tersi. MQL kodu çok daha hantal ve beceriksizdir. Koltuk değneklerinde yapılması gereken çok şey var.
Bana WinApi gibi geliyor)))
 

MQL'ye nasıl taşınacağını gösterebilen var mı:

https://en.wikipedia.org/wiki/Keeper (tasarım modeli)/Standart olmayan C++ modeli

Baştan denedim, ileriye dönük açıklamalarda bir şeyler ters gitti

 //+------------------------------------------------------------------+
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'ye nasıl taşınacağını gösterebilen var mı:

https://en.wikipedia.org/wiki/Keeper (tasarım modeli)/Standart olmayan C++ modeli

Baş başa denedim, ileriye dönük açıklamalarda bir sorun oluştu

Benim versiyonum:

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

Benim versiyonum:

Harika! iyi örnek

Teşekkür ederim!

 
Alexey Navoykov :
MQL'nin hangi dilde göründüğü gerçekten önemli değil. Ana şey, teoride, aynı C ++ 'dan daha yüksek seviyeli olması ve üzerindeki kodun daha basit ve daha özlü olması gerektiğidir. Ama aslında tam tersi. MQL kodu çok daha hantal ve beceriksizdir. Koltuk değneklerinde yapılması gereken çok şey var.

Hayır, bu kısa bir anekdot)) Belki hayattaki uzmanlığınla ilgili bir hata yaptın, belki de bir aşçılık kolejine gitmeliydin?

 
Alexey Navoykov :
MQL'nin hangi dilde göründüğü gerçekten önemli değil. Ana şey, teoride, aynı C ++ 'dan daha yüksek seviyeli olması ve üzerindeki kodun daha basit ve daha özlü olması gerektiğidir. Ama aslında tam tersi. MQL kodu çok daha hantal ve beceriksizdir. Koltuk değneklerinde yapılması gereken çok şey var.

Buradaki asıl sorun, kendini taşımak ve hatta hiç taşımak değil, böyle bir fikre nasıl ulaşacağınızdır.

 

İşte kırılgan bir ruha sahip çocuklar tarafından STL çalışmasının sonuçları.

Ve MQL - yaratıcıları, başka hiç kimse gibi, bir programcının ve programlama görevlerinin gerçek sorunlarını mükemmel bir şekilde anladıklarını mükemmel bir şekilde gösterdi. Bunu anlamıyorsanız, belki de gerçekten bir aşçılık kolejini düşünmelisiniz?

MQL'deki ana sorun, ana ve tek sorun, stratejinin güvenilir bir şekilde yürütülmesini sağlayan algoritmayı düşünmektir. Bu kesinlikle bir dil sorunu değil. Hiçbir dil, hiçbir sözdizimi bunu tek başına sağlayamaz. Bu nedenle, sözdizimi düzeyindeki hacklemeniz, hala anaokulu düzeyinde olduğunuzun açık bir göstergesidir. Yani, bırakın sürdürülebilir algoritmalar geliştirme aşamasına yaklaşmayı, henüz temel kodlamayı öğrenmediniz. Ama bunun için bir gösterişiniz var ... el arabasıyla dolu bir araba.

 
Igor Makanu :

Harika! iyi örnek

Teşekkür ederim!

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

Yani doğru gibi görünüyor

 
Vladimir Simakov :

Yani doğru gibi görünüyor

Tamam, kaydedeceğim, çalışma prensibini test etmem gerekiyordu, belki de aradığım şey buydu - test cihazı ve durumunu kurtarabilen çalışan EA için bir kod, ancak test cihazında tam tersi , "ekstra hareketler" için kaynakları boşa harcamayın - böyle bir kalıbın parçası #ifdef -ami olabilir ;)

 

Tek model, elbette birinin ihtiyacı varsa:

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

Biradan iyi çekilmişe kadar bir şey)))

muhtemelen yaşlanıyorum