MQL5'te OOP hakkında sorular - sayfa 34

 
Koldun Zloy :

Sınıfları sebepsiz kullanıyorsanız, OOP değildir.

Ve evet, size tavsiyem, bu gadget'lara olan ihtiyacı anlayana kadar onları kullanmayın.

Böyle bir yaklaşımla anlayış asla gelmeyecektir.
 
Alexey Viktorov :
Böyle bir yaklaşımla anlayış asla gelmeyecektir.

Yanlış kullanılırsa anlayış gelebileceğini sanmıyorum.

 
Alexey Viktorov :

Igor, çarın Fedot'a okçuya verdiği görevi hatırlıyor musun?

Ve o iki iri adam cevap verdi.

Almanız gereken kuralları veya nihai sonucu bilmiyorsanız, bir şeyi nasıl yeniden üretmeyi deneyebilirsiniz ...

Pekala, böyle bir şey mümkün, işte haber zamanının ve haber miktarının farklı ülkeler için farklı olduğuna dair bir taklit:

 enum ENUM_COUNTRY {RU,EN,FR };
//+------------------------------------------------------------------+
interface INews
{   void PrintNews(); };
//+------------------------------------------------------------------+
class NewsRU: public INews
{
private :
   datetime           ru_01,ru_02,ru_03;
public :
                     NewsRU( datetime t1, datetime t2, datetime t3):ru_01(t1),ru_02(t2),ru_03(t3)   { Print ( __FUNCTION__ );}
   void               PrintNews()                                                                 { Print ( "News №1 in " ,ru_01); Print ( "News №2 in " ,ru_02); Print ( "News №3 in " ,ru_03); } };
//+------------------------------------------------------------------+
class NewsEN: public INews
{
private :
   datetime           en_01,en_02;
public :
                     NewsEN( datetime t1, datetime t2): en_01(t1),en_02(t2)                       { Print ( __FUNCTION__ );}
   void               PrintNews()                                                                { Print ( "News №1 in " ,en_01); Print ( "News №2 in " ,en_02);} };

//+------------------------------------------------------------------+
class NewsFake: public INews
{
public :
                     NewsFake() { Print ( __FUNCTION__ );}
   void               PrintNews() {} };
//+------------------------------------------------------------------+
class CCountryNews
{
private :
   INews             *arr[];
public :
                     CCountryNews(ENUM_COUNTRY &c[]);
                    ~CCountryNews()                                                            { for ( int i= 0 ; i< ArraySize (arr); i++) delete arr[i];             }
   void               PrinALLNews()                                                             { for ( int i= 0 ; i< ArraySize (arr); i++) arr[i].PrintNews();        }   };
//+------------------------------------------------------------------+
CCountryNews::CCountryNews(ENUM_COUNTRY &c[])
{   int sz = ArraySize (c);
   ArrayResize (arr,sz);
   for ( int i= 0 ; i<sz; i++)
   {   switch (c[i])
      {   case RU: arr[i] = new NewsRU(( datetime ) 111 , ( datetime ) 222 , ( datetime ) 333 );   break ;
         case EN: arr[i] = new NewsEN (( datetime ) 444 , ( datetime ) 555 );                   break ;
         default : arr[i] = new NewsFake();   
Print("Error, not this type ", EnumToString(c[i])); } } }
void OnStart ()
{  ENUM_COUNTRY arrinput[] = {RU,EN,FR };
   CCountryNews CountryNews(arrinput);
   CountryNews.PrinALLNews();
}
//+------------------------------------------------------------------+


ancak OOP'ye sarmanız gerekip gerekmediğini öğrenmek için kalır

;)

İşte her şeyin nasıl adlandırıldığının ve sonunda ne olduğunun kaydı:

2019.09.08 16:00:35.031 tst (EURUSD,H1) HaberlerRU::HaberlerRU

2019.09.08 16:00:35.032 tst (EURUSD,H1) HaberlerEN::HaberlerEN

2019.09.08 16:00:35.032 tst (EURUSD,H1) Sahte Haber::HaberSahte

2019.09.08 16:00:35.032 tst (EURUSD,H1) Hata, bu tür FR değil

2019.09.08 16:00:35.032 tst (EURUSD,H1) 1970.01.01'de 1. Haber 00:01:51

2019.09.08 16:00:35.032 tst (EURUSD,H1) 1970.01.01'de 2. Haber 00:03:42

2019.09.08 16:00:35.032 tst (EURUSD,H1) 1970.01.01'de 3. Haber 00:05:33

2019.09.08 16:00:35.032 tst (EURUSD,H1) Haber #1 1970.01.01 00:07:24

2019.09.08 16:00:35.032 tst (EURUSD,H1) Haber #2 1970.01.01 00:09:15

 
Koldun Zloy :

Yanlış kullanılırsa anlayış gelebileceğini sanmıyorum.

En azından "burada balık yok" anlayışı gelecek.)))
 
Alexey Viktorov :
En azından "burada balık yok" anlayışı gelecek.)))

Bunu bazı yerel karakterlerden defalarca duyduk.

Ve bu sadece yanlış anlamadan.

Ve balık var!

 
Igor Makanu :

Pekala, böyle bir şey mümkün, işte haber zamanının ve haber miktarının farklı ülkeler için farklı olduğuna dair bir taklit:


ancak OOP'ye sarmanız gerekip gerekmediğini öğrenmek için kalır

;)

İşte her şeyin nasıl adlandırıldığının ve sonunda ne olduğunun kaydı:

Igor yok. Buradaki yaklaşım bu değil.

 bool    CalendarValueHistory ( 
   MqlCalendarValue &  values[],               // массив для получения описаний значений  
   datetime            datetime_from,         // левая граница диапазона времени 
   datetime            datetime_to= 0            // правая граница диапазона времени 
   const string        country_code= NULL ,     // кодовое имя страны по ISO 3166-1 alpha-2 
   const string        currency= NULL            // кодовое наименование валюты страны   
   );

Vurgulanan çizgiler üç kullanım durumudur. Bu durumda, zaman aralığı değişir. Ardından değerler[] dizisi belirli bir şekilde işlenir. Olay kimliğine göre, bu olayın bir açıklamasını alırız. Önemi, zamanı ve diğer özellikleri.

 
Koldun Zloy :

Bunu bazı yerel karakterlerden defalarca duyduk.

Ve bu sadece yanlış anlamadan.

Ve balık var!

Bunun hakkında okudum. Balık var ama anlamadığın yerde yok. İşte bir mql5 projesi böyle olmalı ki burada bir balık olsun... En azından mql5'te OOP ihtiyacının görülebileceği bir proje görün.
 
Alexey Viktorov :
Bunun hakkında okudum. Balık var ama anlamadığın yerde yok. İşte bir mql5 projesi böyle olmalı ki burada bir balık olsun... En azından mql5'te OOP ihtiyacının görülebileceği bir proje görün.

Sadece OOP'ye gerek yok. Prensip olarak, her şey yapısal bir tarzda yapılabilir. Ancak kişisel olarak, ilk dürtüm, sayıları tehditkar bir şekilde artmaya başlayan küresel değişkenler kümeleri yerine yapıları kullanmaya karar verdiğimde başladı. Eh, zaten yapılardan sınıflara geçtim, çünkü bu yapıların verilerini işleyen bu işlevleri doğrudan onlara entegre etmek mantıklıydı, bu da sınıfların oluşturulmasına yol açtı. Bu bir zorunluluk meselesi değil, sadece verileri organize etmek ve bunlarla çalışmak meselesidir.

 
BlackTomcat :
Bir nesneyi oluşturulduktan ve işini yaptıktan hemen sonra "öldürmek" gerekli değildir.
MQL programı tamamlandıktan sonra OnDeinit işlevinde oluşturulan nesneleri "öldürebilirsiniz",
program çalışırken tüm nesneler hafızada tutulabilir ve erişilebilir.

Nesne amacına hizmet ettiyse, neden hafızada tutuyor?
Bellek sızıntısı olacak mı?

 
Alexey Viktorov :

Igor yok. Buradaki yaklaşım bu değil.

Vurgulanan çizgiler üç kullanım durumudur. Bu durumda, zaman aralığı değişir. Ardından değerler[] dizisi belirli bir şekilde işlenir. Olay kimliğine göre, bu olayın bir açıklamasını alırız. Önemi, zamanı ve diğer özellikleri.

yaklaşım önemli değildir.

OOP'yi anlamak istiyorsanız, o zaman benim görüşüm (zaten yazdım) uygundur, ancak OOP sadece bir paradigmadır, peki, birkaç OOP kavramını birleştiren bir yazma yolu - Wiki...


genel olarak, tam tersini deneyebilirsiniz: işte göreviniz, onu veri ve veri işleme yöntemlerine ayırmanız gerekiyor ...

1. Verileri nerede depolayacaksınız? - büyük olasılıkla yapı budur

2. Verileri nasıl işleyeceksiniz? - büyük olasılıkla bir dizi işlevdir

3. Verileri nasıl başlatacaksınız? - büyük olasılıkla bu bir dizi yapıdır ve bu diziyi sıfırlamak ve ardından onu verilerle doldurmak gerekecektir.

4. Daha önce yazılan kodun esnekliğini nasıl sağlayacaksınız - yeniden düzenleme?

Şimdi OOP kullanırsak:

1. sınıftaki alanlarda, bu alan bir yapı olabilir veya belki veri depolayacak ve devralacak bir temel sınıf yazacağım VEYA bu sınıf şimdi tartıştığımız sınıfta bir alan olacak

2.1. bu bir yöntemler kümesi olacak ve eğer bir temel sınıf yazarsam, belki o zaman temel sınıfta verilerle en basit eylemleri gerçekleştirecek yöntemler oluşturacağım ve eğer temel sınıftan miras alırsam bu yöntemler kullanılabilir olacak bu sınıfta - bu mirastır!

2.2. ve temel sınıftan miras aldıktan sonra sadece bir yöntemi değiştirmek istersem, temel sınıfta hiçbir şeyi yeniden yazmayacağım, buna gerek yok! - Temel sınıfta bire bir metot olarak çağrılacak ve kalıtım olacak bir metot (fonksiyon!) yazacağım!

3. bir kurucu olacak ve eğer bir kurucu yazmadıysam, örtük olarak çağrılacak, bu yüzden miras aldığım her sınıfın ve/veya alanlarımdaki sınıfın her zaman bir kurucuya sahip olacağını unutmam. , ve OOP bana bir kurucu yazmama, parametresiz bir kurucu yazma, parametreli bir düzine daha fazla kurucu yazma fırsatı veriyor

4. OOP kullanarak, önceden oluşturulmuş kod bölümlerini yeniden yazmak gereksizdir, devralabilirsiniz, yapabilirsiniz .... batırabilirsiniz, çoğu durumda derleyici programcıdan sonra temizleyecektir!


Phew, peki, bu benim oldukça amatörce OOP görüşüm, genel olarak, uygun ve her şeyin etkili bir şekilde çalışması için, OOP kullanırken ana iş programcı için değil, derleyici geliştiricileri içindir, bu yüzden alanlardan hangisi / yöntemler kullanılmaz, derlenmiş dosyaya dahil edilmez, burada programcı berbattır, peki, onu uyarın)))