Domande su OOP in MQL5 - pagina 34

 
Koldun Zloy:

Se stai usando classi per qualcosa che non capisci, non è OOP.

E sì, vi consiglio, finché non capite la necessità di questi espedienti, non usateli.

Con un tale approccio, la comprensione non arriverà mai.
 
Alexey Viktorov:
Con questo approccio, la comprensione non arriverà mai.

Non credo che con un uso improprio possa arrivare la comprensione.

 
Alexey Viktorov:

Igor, ti ricordi il compito che lo zar diede a Fedot lo Streltsy?

E quale fu la risposta dei due giovani?

Come si può cercare di riprodurre qualcosa, se non si conoscono le regole, o il risultato finale da ottenere...

Beh, è più o meno così, ecco un'imitazione del fatto che i tempi delle notizie e la quantità di notizie differiscono da paese a paese:

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


ma resta da vedere se è necessario avvolgerlo in un OLP.

;)

Ecco un registro di come è stato chiamato e cosa ha ottenuto:

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) Errore, non questo tipo FR

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

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

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

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

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

 
Koldun Zloy:

Non credo che con un uso improprio possa arrivare la comprensione.

Come minimo, si capirà che "qui non ci sono pesci").
 
Alexey Viktorov:
Almeno si capirà che "qui non ci sono pesci")).

Lo abbiamo sentito molte volte da alcuni personaggi locali.

E questo solo per mancanza di comprensione.

E ci sono i pesci!

 
Igor Makanu:

Beh, questo è tutto, ecco una simulazione che i tempi delle notizie e il numero di notizie sono diversi per i diversi paesi:


ma resta da vedere se è necessario avvolgerlo in un OOP.

;)

Ecco un registro di come tutto è stato chiamato e di cosa si è concluso:

No, Igor. Questo non è un approccio del genere.

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

Le stringhe evidenziate sono tre casi d'uso. Allo stesso tempo, l'intervallo di tempo cambia. Poi l'array values[] viene elaborato in un certo modo. L'id dell'evento è usato per ottenere la descrizione di questo evento. La sua importanza, il tempo e altri attributi.

 
Koldun Zloy:

Lo abbiamo sentito molte volte da alcuni personaggi locali.

E questo solo per mancanza di comprensione.

E ci sono i pesci!

L'ho letto. Ci sono dei pesci, ma non dove non si capisce. Che tipo di progetto dovrebbe essere in mql5 perché ci sia pesce... Voglio vedere almeno un progetto in mql5, dove si veda la necessità di OOP.
 
Alexey Viktorov:
L'ho letto. Ci sono dei pesci, ma non dove non si capisce. Che tipo di progetto dovrebbe essere in mql5 perché ci sia pesce... Voglio vedere almeno un progetto in mql5, dove si vedrebbe la necessità di OOP.

Probabilmente, non c'è bisogno di OOP. In linea di principio, tutto può essere fatto in uno stile strutturato. Ma personalmente, il mio primo impulso è iniziato quando ho deciso di usare strutture invece di insiemi di variabili globali, che avevano cominciato a crescere pericolosamente. Ero già passato dalle strutture alle classi perché sembrava logico integrare le funzioni che elaborano i dati di quelle strutture direttamente in esse, il che ha portato alla creazione delle classi. Non è una questione di necessità, ma semplicemente di organizzare i dati e lavorare con essi.

 
BlackTomcat:
Non è necessario "uccidere" l'oggetto non appena è stato creato e ha fatto il suo lavoro.
Gli oggetti creati possono essere "uccisi" nella funzione OnDeinit dopo che il programma MQL è finito,
Mentre il programma è in esecuzione, tutti gli oggetti possono essere tenuti in memoria e vi si può accedere.

Se l'oggetto ha svolto il suo compito, perché tenerlo in memoria?
Non si verificherà una perdita di memoria?

 
Alexey Viktorov:

No, Igor. Non è questo l'approccio qui.

Le linee evidenziate sono i tre casi d'uso. In questo caso l'intervallo di tempo cambia. Poi l'array values[] viene elaborato in un certo modo. L'id dell'evento è usato per ottenere la descrizione di questo evento. La sua importanza, il tempo e altri attributi.

l'approccio non è importante

Se vuoi capire OOP, la mia opinione (ho già scritto) - è conveniente, ma OOP è solo un paradigma, beh, un modo di scrivere, che combina diversi concetti OOP - Wiki...


Quindi puoi provare il contrario: ecco il tuo compito, devi scomporlo in dati e modi di trattare i dati...

1. Dove memorizzerete i dati? - molto probabilmente una struttura

2. Come elaborerete i dati? - Molto probabilmente un insieme di funzioni.

3. Come inizializzerete i dati? - molto probabilmente un array di strutture, e avrete bisogno di azzerare questo array e poi riempirlo di dati

4. Come garantirete la flessibilità del codice scritto in precedenza - refactoring?

Ora se si usa OOP:

1. in campi in una classe, anche se forse questo campo sarà una struttura, o forse scriverò una classe base a tutti che memorizzerà i dati e farà l'ereditarietà O questa classe sarà un campo nella classe in discussione ora

2.1. sarà un insieme di metodi. Se scrivo una classe base, probabilmente creerò metodi in una classe base che faranno l'elaborazione dei dati di base, e se eredito da una classe base, questi metodi saranno disponibili nella classe, è l'ereditarietà!

2.2. Se voglio cambiare solo un metodo dopo aver ereditato dalla classe base, non riscriverò nulla nella classe base, non è necessario! - Scriverò semplicemente un metodo (una funzione!) con lo stesso nome del metodo della classe base, e sarà eredità!

3. sarà un costruttore, e se non scrivo un costruttore, sarà chiamato implicitamente, quindi tengo presente che ogni classe da cui ho ereditato e/o classe nei miei campi avrà sempre un costruttore chiamato; e l'OOP mi dà la possibilità di non scrivere un costruttore, di scrivere un costruttore senza parametri, di scrivere una dozzina di altri costruttori con parametri

4. usando OOP non dovete riscrivere frammenti di codice creati in precedenza, potete ereditare, potete .... si può sbagliare, il compilatore pulirà dopo il programmatore nella maggior parte dei casi!


bene, questo è il mio punto di vista piuttosto amatoriale su OOP, in generale, è conveniente e al fine di rendere tutto funziona in modo efficiente, il lavoro principale quando si utilizza OOP, non il programmatore, ma gli sviluppatori del compilatore, in modo che i campi / metodi non vengono utilizzati per non includere nel file compilato, dove il programmatore ha fatto un errore, beh, per avvisarlo)))

Motivazione: