MQL5'te OOP hakkında sorular - sayfa 21

 
Alexey Navoykov :
Bu sadece bir test dersi mi yoksa gerçekten kullanacak mısınız?
İkincisi ise, o zaman yapmamalısınız. Statik değişkenler , hatırladığım kadarıyla karakter değişikliğinde yeniden başlatılmıyor.
Ve genel olarak, sabit statiği bazı harici değerlerle başlatmak iyi bir fikir değildir; bu, başlatma sırasında mevcut olacakları gerçeği değildir.

ikincisi , hala MT4 altında kendim için bile yazıyorum - test cihazında birkaç sembol üzerinde çalışmıyor, MT4'te yararlı bir şey görürsem MT4Orders'ın yardımıyla MT5'e geçeceğim - "yaratıcılığım" kontrol edildi bu kütüphane ile sorunsuz

ilk olarak, doğru OOP fikrini görmek istiyorum - bu yüzden ne olduğunu görmek için test ediyorum, her şey güzel hemoroid iken .... bir bakalım, zamanım var, bu yüzden yapmaya karar verdim kendim için egzersizler))))


Ana kodun başlangıcından önce başlatmanın en iyi yolu olmadığını biliyorum, daha doğrusu daha önce öyle düşündüm, ama kaç tanesini kontrol etmedim, kaç tane yeni yapı olduğunu, - her şey MQL'de bile her zaman mevcuttur küresel görünürlük düzeyinde, kaynakları gördüm, insanlar kodun en başında buhar banyosu yapmıyor ve şöyle yazıyor:

 #property strict
int     dig = _Digits ;
double point = _Point ;
double startbalance = AccountBalance();

ve bu tür yanlış başlatmalar, yapıdan yapıya uzun yıllar boyunca çalışır, genel olarak geliştiriciler en çok şımarttı - çoğu insan))))




Not: burada, genel olarak, OOP kullanırken her zaman olduğu gibi, ana görev, onu oluşturan öğelerine doğru bir şekilde bölmek ve eldeki her şeyden miras almamaktır, şimdi metin hatası çıktısını nereye "koyacağımı" bilmiyorum - bu her yerde, herhangi bir sınıfta ve programın herhangi bir yerinde gereklidir, büyük olasılıkla @Vladimir Simakov kodunu yukarıda gösterdiği gibi bir temel sınıf oluşturmanız gerekecektir.

 
Igor Makanu :

pp 1-3 her şey çözüldü, AMA .. Tamam, statik konusunda yardımcı oldular, bu yüzden bir sertifika olduğu için, en azından kararınızı haklı çıkarabileceğiniz bir şeyle, şimdi kod şöyle:

günlükte alınan 3 Cdeal örneği oluşturuldu:

...

şimdiye kadar her şey amaçlandığı gibi çalışıyor!

Çalışsa bile, bunu yapmak güvenli değil. Fonksiyonun uygulanması sınıfın dışına taşındığından, sınıf içindeki alanların sırasını kontrol etmek zorlaşır. O zaman en azından sınıfta şu ve bu alanların değiştirilemeyeceğine dair cesur bir yorum yazmak gerekiyor) Ama yine de orijinal versiyonunuz daha iyiydi. Bir kod satırını kurtarmak uğruna güvenilirliği feda etmeyin)
 
Alexey Navoykov :
Ama orijinal versiyonun daha iyiydi. Bir kod satırını kurtarmak uğruna güvenilirliği feda etmeyin)

hangisi? - işte seçeneklerimde konunun zemini)))

ve evet kesinlikle haklısın!

not:

en basit durumda ve aynı zamanda en güvenilir olanıdır - OnInit()'te new aracılığıyla sınıfın bir örneğini oluşturduk - ve terminalin tüm ortam değişkenlerini hemen kopyaladık, ancak bu en iyi seçenek değil - bu örnekte ben yapıcıyı başlatırken hemen bir sipariş açmayı planlayın, o zaman sınıfın bu örneğinin silinmesi mümkündür, daha sonra muhtemelen yeniden oluşturulacaktır - burada zaten tekrarlanan çağrılar nedeniyle verimsizliğe dönüşüyor - yeniden yüklemeye başlıyorum terminal ortamı, yine bellek tüketiyor .... genel olarak, bu bu şekilde çözülemez


ZYZY: belki başka bir gün deneyeceğim ve sonunda @Vladimir Simakov örneğini temel alacağım - orada her şey çok açık

 
Igor Makanu :

burada alanları bir kez sabit değerlerle başlatması gereken sınıfımı çizdim, her şey amaçlandığı gibi çalışıyor gibi görünüyor:

2 şeyi sevmiyorum:

1. SymbolInfoDouble(_Symbol,SYMBOL_VOLUME_STEP) çağrısını tekrarlıyorum - çünkü başlatma sırası belirtilmemiş, yani. önce VolumeSTEP'in başlatılacağı gerçeği değil, ancak o zaman GetDigitsInVolumeStep() çağrılacak

2. Statik int GetDigitsInVolumeStep() yöntemini kullanmaktan kurtulmak istiyorum - YouTube'da statik yöntemleri saf OOP'de kullanmanın iyi olmadığı yeterince video gördüm, bu yüzden yel değirmenleriyle savaşıyorum

videoya bağlantılar, temelde aynıdır https://youtu.be/lfdAwl3-X_c ve https://youtu.be/zME4SOCHT0I


Sevmediğim bu 2 noktayı farklı nasıl yeniden yazardım?

1. Bu işlevin çift çağrılmasında yanlış bir şey yoktur.

2. Statik fonksiyonların kullanımına karşı olanların en ufak bir argüman vermemeleri sizi rahatsız etmiyor mu?

Sadece kimseden video izlememek, kitap okumak daha iyidir.

 
Koldun Zloy :

2. Statik fonksiyonların kullanımına karşı olanların en ufak bir argüman vermemeleri sizi rahatsız etmiyor mu?

ve videonun uygulamadan hiçbir şeye karşılık gelmemesi beni destekleyen ilk kişisin, video hakkındaki fikrimi başka bir konuda yazdım - konuşmacı öğrencilerin sorularını bile cevaplayamadı

 
Igor Makanu :

ve videonun uygulamadan hiçbir şeye karşılık gelmemesi beni destekleyen ilk kişisin, video hakkındaki fikrimi başka bir konuda yazdım - konuşmacı öğrencilerin sorularını bile cevaplayamadı

OOP'nin, herkesin kendi yolunda süpürdüğü bazı İnternet habercilerinin mantıksız varsayımlarını körü körüne takip etmek uğruna kendi yeteneklerinin kısıtlanması olduğunu düşünmüyorum.

 
Artyom Trishkin :

OOP'nin, herkesin kendi yolunda süpürdüğü bazı İnternet habercilerinin mantıksız varsayımlarını körü körüne takip etmek uğruna kendi yeteneklerinin kısıtlanması olduğunu düşünmüyorum.

videoyu izlediyseniz, amacın .... olduğunu anlamalısınız.

Not: biraz sonra arayüzlerle biraz deneyeceğim, belki biraz "güzellik özü" ortaya çıkacaktır))))

 

Statik hakkındaki videosuna baktım, hepsi şöyle yazmak için:

 new Type0( new Type1( new Type2(...))); 

Peki, statik üzerine bir sarmalayıcı yazmak bir sorun mu?

 class Stateless_with_state {
        Stateless q;
        Data d;
        call() {q::call(d);}
};

Ve şablonlar aracılığıyla açıkça daha verimlidir. İzleyicilerden gelen soruyu beğendim https://www.youtube.com/watch?v=75U9eefFYoU#t=33m25s

 
Igor Makanu :

Not: biraz sonra arayüzlerle biraz deneyeceğim, belki biraz "güzellik özü" ortaya çıkacaktır))))

"OOP Pattern - Behavior Patterns -Strategy"nin çalışıp çalışmayacağını kontrol etti

 interface IStrategy
  {
   void Algorithm();
  };
//+------------------------------------------------------------------+
class Strategy_1 : public IStrategy
  {
public :
                     Strategy_1()   { Print ( __FUNCTION__ );}
   void               Algorithm()    { Print ( __FUNCTION__ );}
  };
//+------------------------------------------------------------------+
class Strategy_2 : public IStrategy
  {
public :
                     Strategy_2()   { Print ( __FUNCTION__ );}
   void               Algorithm()    { Print ( __FUNCTION__ );}
  };
//+------------------------------------------------------------------+
class Context
  {
private :
   IStrategy         *s;
public :
                     Context(IStrategy &_strategy) { Print ( __FUNCTION__ ); s = GetPointer (_strategy); s.Algorithm();}
                    ~Context() { delete s;}
  };
//+------------------------------------------------------------------+
void OnStart ()
  {
   Context c1( new Strategy_1);
   Context c2( new Strategy_2);
  }
//+------------------------------------------------------------------+

2019.08.31 21:04:40.441 tst (EURUSD,H1) Strateji_1::Strateji_1

2019.08.31 21:04:40.442 tst (EURUSD,H1) Bağlam::Bağlam

2019.08.31 21:04:40.442 tst (EURUSD,H1) Strateji_1::Algoritma

2019.08.31 21:04:40.442 tst (EURUSD,H1) strateji_2::strateji_2

2019.08.31 21:04:40.442 tst (EURUSD,H1) Bağlam::Bağlam

2019.08.31 21:04:40.442 tst (EURUSD,H1) Strateji_2::Algoritma


bende sorunsuz çalışıyor

 
Igor Makanu :

"OOP Pattern - Behavior Patterns -Strategy"nin çalışıp çalışmayacağını kontrol etti

2019.08.31 21:04:40.441 tst (EURUSD,H1) Strateji_1::Strateji_1

2019.08.31 21:04:40.442 tst (EURUSD,H1) Bağlam::Bağlam

2019.08.31 21:04:40.442 tst (EURUSD,H1) Strateji_1::Algoritma

2019.08.31 21:04:40.442 tst (EURUSD,H1) strateji_2::strateji_2

2019.08.31 21:04:40.442 tst (EURUSD,H1) Bağlam::Bağlam

2019.08.31 21:04:40.442 tst (EURUSD,H1) Strateji_2::Algoritma


bende sorunsuz çalışıyor

Context(IStrategy* _strategy):s(_strategy){ Print ( __FUNCTION__ ); s.Algorithm();}

1. Yeni operatör bir işaretçi döndürür, elbette geliştiriciler örtük referans kaldırma ile kararlarını verdiler, bu nedenle sürümünüz çalışır, ancak belgelenmemiş şeylere karışmamak daha iyidir.

2. Tabii ki, elimizde C++ yok, ancak çok benzer, bu nedenle başlatma listeleri (verimliliği bilmiyorum) koşer.