Questions sur la POO dans MQL5 - page 34

 
Koldun Zloy:

Si vous utilisez des classes pour quelque chose que vous ne comprenez pas, ce n'est pas de la POO.

Et oui, je vous le conseille, tant que vous ne comprenez pas la nécessité de ces gadgets, ne les utilisez pas.

Avec une telle approche, la compréhension ne viendra jamais.
 
Alexey Viktorov:
Avec cette approche, la compréhension ne viendra jamais.

Je ne pense pas qu'avec une mauvaise utilisation, la compréhension puisse venir.

 
Alexey Viktorov:

Igor, te souviens-tu de la tâche que le Tsar a confiée à Fedot le Streltsy ?

Et quelle a été la réponse des deux jeunes hommes ?

Comment pouvez-vous essayer de reproduire quelque chose, si vous ne connaissez pas les règles, ou le résultat final à obtenir...

Eh bien, c'est à peu près ça, voici une imitation du fait que les heures de diffusion des nouvelles et la quantité de nouvelles diffèrent d'un pays à l'autre :

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();
}
//+------------------------------------------------------------------+


mais il reste à voir si vous devez l'emballer dans un PLO.

;)

Voici un journal de la façon dont il a été appelé et ce qu'il a donné :

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

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

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

2019.09.08 16:00:35.032 tst (EURUSD,H1) Erreur, pas ce type FR

2019.09.08 16:00:35.032 tst (EURUSD,H1) News #1 dans 1970.01.01 00:01:51

2019.09.08 16:00:35.032 tst (EURUSD,H1) News #2 dans 1970.01.01 00:03:42

2019.09.08 16:00:35.032 tst (EURUSD,H1) News #3 en 1970.01.01 00:05:33

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

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

 
Koldun Zloy:

Je ne pense pas qu'avec une mauvaise utilisation, la compréhension puisse venir.

Au moins, on comprendra qu'"il n'y a pas de poisson ici".))
 
Alexey Viktorov:
Au moins, on comprendra qu'"il n'y a pas de poisson ici")).

Nous avons entendu cela à plusieurs reprises de la part de certains personnages locaux.

Et c'est juste par manque de compréhension.

Et il y a des poissons !

 
Igor Makanu:

Voilà, c'est à peu près tout, voici une simulation qui montre que les heures d'ouverture et le nombre de nouvelles sont différents selon les pays :


mais il reste à voir si vous avez besoin de l'emballer dans une OOP.

;)

Voici un compte-rendu de la façon dont tout a été appelé et de ce qui a été obtenu :

Non, Igor. Cette approche n'en est pas une.

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          // кодовое наименование валюты страны  
   );

Les chaînes de caractères mises en évidence correspondent à trois cas d'utilisation. Dans le même temps, l'intervalle de temps change. Ensuite, le tableau values[] est traité d'une certaine manière. L'identifiant de l'événement est utilisé pour obtenir la description de cet événement. Son importance, son temps et d'autres attributs.

 
Koldun Zloy:

Nous avons entendu cela à plusieurs reprises de la part de certains personnages locaux.

Et c'est juste par manque de compréhension.

Et il y a des poissons !

Je l'ai lu. Il y a des poissons, mais pas là où tu ne comprends pas. Quel genre de projet devrait être dans mql5 pour qu'il y ait du poisson... Je veux voir au moins un projet dans mql5, où le besoin de la POO serait vu.
 
Alexey Viktorov:
Je l'ai lu. Il y a des poissons, mais pas là où tu ne comprends pas. Quel genre de projet devrait être dans mql5 pour qu'il y ait du poisson... Je veux voir au moins un projet dans mql5, où le besoin de la POO serait vu.

Probablement, il n'y a pas besoin de POO. En principe, tout peut être fait dans un style structuré. Mais personnellement, ma première envie a commencé lorsque j'ai décidé d'utiliser des structures au lieu d'ensembles de variables globales, qui avaient commencé à s'étendre dangereusement. J'étais déjà passé des structures aux classes car il semblait logique d'y intégrer directement les fonctions qui traitaient les données de ces structures, ce qui a conduit à la création des classes. Il ne s'agit pas d'une nécessité, mais simplement d'organiser les données et de travailler avec elles.

 
BlackTomcat:
Il n'est pas nécessaire de "tuer" l'objet dès qu'il est créé et qu'il a fait son travail.
Les objets créés peuvent être "tués" dans la fonction OnDeinit une fois le programme MQL terminé,
Pendant que le programme est en cours d'exécution, tous les objets peuvent être gardés en mémoire et on peut y accéder.

Si l'objet a accompli sa tâche, pourquoi le garder en mémoire ?
Une fuite de mémoire ne va-t-elle pas se produire ?

 
Alexey Viktorov:

Non, Igor. Ce n'est pas l'approche adoptée ici.

Les lignes en surbrillance correspondent aux trois cas d'utilisation. Dans ce cas, l'intervalle de temps change. Ensuite, le tableau values[] est traité d'une certaine manière. L'identifiant de l'événement est utilisé pour obtenir la description de cet événement. Son importance, son temps et d'autres attributs.

l'approche n'est pas importante

Si vous voulez comprendre la POO, mon opinion ( j'ai déjà écrit ) - c'est pratique, mais la POO est juste un paradigme, enfin, une façon d'écrire, qui combine plusieurs concepts de la POO - Wiki...


Vous pouvez donc essayer le contraire : voici votre tâche, vous devez la décomposer en données et en moyens de traiter ces données...

1. Où stockerez-vous les données ? - très probablement une structure

2. Comment allez-vous traiter les données ? - Très probablement un ensemble de fonctions.

3. Comment allez-vous initialiser les données ? - très probablement un tableau de structures, et vous devrez mettre à zéro ce tableau, puis le remplir de données.

4. Comment allez-vous assurer la flexibilité du code écrit précédemment - refactoring ?

Maintenant, si vous utilisez la POO :

1. dans les champs d'une classe, bien que peut-être ce champ sera une structure, ou peut-être j'écrirai une classe de base du tout qui stockera les données et fera l'héritage OU cette classe sera un champ dans la classe en discussion maintenant

2.1. il s'agira d'un ensemble de méthodes. Si j'écris une classe de base, je créerai probablement des méthodes dans une classe de base qui feront un traitement de base des données, et si j'hérite d'une classe de base, ces méthodes seront disponibles dans la classe, c'est l'héritage !

2.2 Si je veux changer une seule méthode après avoir hérité de la classe de base, je ne réécrirai rien dans la classe de base, ce n'est pas nécessaire ! - je vais juste écrire une méthode ( une fonction !) avec le même nom que la méthode de la classe de base, et ce sera l'héritage !

3. ce sera un constructeur, et si je n'écris pas de constructeur, il sera appelé implicitement, donc je garde à l'esprit que chaque classe dont j'ai hérité et/ou chaque classe dans mes domaines aura toujours un constructeur appelé ; et la POO me donne la possibilité de ne pas écrire de constructeur, d'écrire un constructeur sans paramètres, d'écrire une douzaine d'autres constructeurs avec des paramètres

4. en utilisant la POO, vous ne devez pas réécrire des fragments de code créés précédemment, vous pouvez hériter, vous pouvez ..... vous pouvez vous tromper, le compilateur fera le ménage après le programmeur dans la plupart des cas !


bien, c'est mon point de vue plutôt amateur sur la POO, en général, il est pratique et afin de faire tout fonctionne efficacement, le travail principal lors de l'utilisation de la POO, pas le programmeur, mais les développeurs du compilateur, de sorte que les champs / méthodes ne sont pas utilisés de ne pas inclure dans le fichier compilé, où le programmeur a fait une erreur, bien, pour le prévenir)))

Raison: