MQL5におけるOOPに関する質問 - ページ 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:
要は、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:

これが正しい方法だと思われます

OK、私はそれを保存します、私は仕事の原則をテストする必要がありました、多分これは私が探していたものです - テスターとその状態を保存することができる作業EA用の一つのコード、そして逆にテスターで「余分なジェスチャー」にリソースを無駄にしない - このパターンの一部は #ifdef -ami ;) によってカバーされることができます。

 

パターン・シングル、もちろん必要な人がいればですが。

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

ビール以来、美味しいものが食べたくなりました)))

年取ったかな))))