Fragen zu OOP in MQL5 - Seite 34

 
Koldun Zloy:

Wenn Sie Klassen für etwas verwenden, das Sie nicht verstehen, ist das nicht OOP.

Und ja, ich rate Ihnen: Solange Sie nicht verstehen, warum diese Gimmicks notwendig sind, sollten Sie sie nicht verwenden.

Mit einem solchen Ansatz wird es nie zu einem Verständnis kommen.
 
Alexey Viktorov:
Mit diesem Ansatz wird es nie zu einem Verständnis kommen.

Ich glaube nicht, dass bei unsachgemäßem Gebrauch Verständnis aufkommen kann.

 
Alexey Viktorov:

Igor, erinnerst du dich an den Auftrag, den der Zar Fedot dem Streltsy erteilt hat?

Und was war die Antwort der beiden jungen Männer?

Wie kann man versuchen, etwas zu reproduzieren, wenn man die Regeln oder das zu erzielende Endergebnis nicht kennt...

Nun, das ist richtig, hier ist eine Nachahmung der Tatsache, dass die Nachrichtenzeiten und der Umfang der Nachrichten von Land zu Land unterschiedlich sind:

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


aber es bleibt abzuwarten, ob Sie es in eine PLO einpacken müssen.

;)

Hier ist ein Protokoll, wie es aufgerufen wurde und was es am Ende ergab:

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) Fehler, nicht dieser Typ FR

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

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

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

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

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

 
Koldun Zloy:

Ich glaube nicht, dass bei unsachgemäßem Gebrauch Verständnis aufkommen kann.

Zumindest wird ein Verständnis dafür entstehen, dass es "hier keine Fische gibt")))
 
Alexey Viktorov:
Zumindest wird man sich darauf verständigen, dass es "hier keine Fische gibt").

Das haben wir schon oft von einigen lokalen Persönlichkeiten gehört.

Und das nur, weil wir es nicht verstanden haben.

Und es gibt Fische!

 
Igor Makanu:

Nun, das war's. Hier ist eine Simulation, bei der die Nachrichtenzeiten und die Anzahl der Nachrichten für verschiedene Länder unterschiedlich sind:


aber es bleibt abzuwarten, ob Sie es in ein OOP verpacken müssen.

;)

Hier ist ein Protokoll darüber, wie alles aufgerufen wurde und was am Ende dabei herauskam:

Nein, Igor. Dies ist kein solcher Ansatz.

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

Die hervorgehobenen Zeichenfolgen sind drei Anwendungsfälle. Gleichzeitig ändert sich auch der Zeitbereich. Dann wird das Array values[] auf eine bestimmte Weise verarbeitet. Die Ereignis-ID wird verwendet, um die Beschreibung dieses Ereignisses zu erhalten. Seine Bedeutung, Zeit und andere Eigenschaften.

 
Koldun Zloy:

Das haben wir schon oft von einigen lokalen Persönlichkeiten gehört.

Und das nur, weil wir es nicht verstanden haben.

Und es gibt Fische!

Ich habe darüber gelesen. Es gibt Fische, aber nicht dort, wo man sie nicht versteht. Welche Art von Projekt sollte in mql5 sein, damit es Fische gibt... Ich möchte mindestens ein Projekt in mql5 sehen, in dem die Notwendigkeit von OOP gesehen wird.
 
Alexey Viktorov:
Ich habe darüber gelesen. Es gibt Fische, aber nicht dort, wo man sie nicht versteht. Welche Art von Projekt sollte in mql5 sein, damit es Fische gibt... Ich möchte mindestens ein Projekt in mql5 sehen, in dem die Notwendigkeit von OOP gesehen wird.

Wahrscheinlich besteht keine Notwendigkeit für OOP. Im Prinzip kann alles in einem strukturierten Stil gemacht werden. Aber für mich persönlich begann der erste Drang, als ich beschloss, Strukturen anstelle von Gruppen globaler Variablen zu verwenden, die gefährlich groß geworden waren. Ich war bereits von Strukturen zu Klassen übergegangen, weil es logisch erschien, Funktionen, die Daten aus diesen Strukturen verarbeiteten, direkt in diese zu integrieren, was zur Erstellung von Klassen führte. Dabei geht es nicht um die Notwendigkeit, sondern einfach darum, die Daten zu ordnen und mit ihnen zu arbeiten.

 
BlackTomcat:
Es ist nicht notwendig, das Objekt zu "töten", sobald es erstellt wurde und seine Aufgabe erfüllt hat.
Die erstellten Objekte können nach Beendigung des MQL-Programms mit der Funktion OnDeinit "getötet" werden,
Während das Programm läuft, können alle Objekte im Speicher gehalten werden und es kann darauf zugegriffen werden.

Wenn das Objekt seine Aufgabe erfüllt hat, warum sollte es dann im Speicher bleiben?
Wird es nicht zu einem Speicherleck kommen?

 
Alexey Viktorov:

Nein, Igor. Das ist hier nicht der Ansatz.

Die hervorgehobenen Zeilen sind die drei Anwendungsfälle. In diesem Fall ändert sich der Zeitbereich. Dann wird das Array values[] auf eine bestimmte Weise verarbeitet. Die Ereignis-ID wird verwendet, um die Beschreibung dieses Ereignisses zu erhalten. Seine Bedeutung, Zeit und andere Eigenschaften.

der Ansatz ist nicht wichtig

Wenn Sie OOP verstehen wollen, meine Meinung (ich habe bereits geschrieben) - es ist bequem, aber OOP ist nur ein Paradigma, gut, eine Art des Schreibens, die mehrere OOP-Konzepte kombiniert - Wiki...


Sie können also das Gegenteil versuchen: Hier ist Ihre Aufgabe, Sie müssen sie in Daten und Möglichkeiten der Datenverarbeitung aufteilen...

1. Wo werden Sie die Daten speichern? - höchstwahrscheinlich eine Struktur

2. Wie werden Sie die Daten verarbeiten? - Höchstwahrscheinlich eine Reihe von Funktionen.

3. Wie werden Sie die Daten initialisieren? - höchstwahrscheinlich ein Array von Strukturen, und Sie müssen dieses Array auf Null setzen und dann mit Daten füllen

4. Wie gewährleisten Sie die Flexibilität von bereits geschriebenem Code - Refactoring?

Wenn Sie nun OOP verwenden:

1. in Feldern in einer Klasse, obwohl dieses Feld vielleicht eine Struktur sein wird, oder vielleicht werde ich überhaupt eine Basisklasse schreiben, die die Daten speichert und die Vererbung durchführt ODER diese Klasse wird ein Feld in der Klasse sein, die jetzt diskutiert wird

Wenn ich eine Basisklasse schreibe, kann ich Methoden in einer Basisklasse erstellen, um einfache Datenmanipulationen durchzuführen, und wenn ich von einer Basisklasse erbe, werden diese Methoden auch in der Klasse verfügbar sein.

2.2 Wenn ich nur eine Methode ändern möchte, nachdem ich von der Basisklasse geerbt habe, werde ich nichts in der Basisklasse neu schreiben, das ist nicht notwendig! - Ich schreibe einfach eine Methode (eine Funktion!) mit demselben Namen wie die Methode der Basisklasse, und schon ist es Vererbung!

3. es wird ein Konstruktor sein, und wenn ich keinen Konstruktor schreibe, wird er implizit aufgerufen, so dass ich im Hinterkopf behalte, dass jede Klasse, von der ich geerbt habe, und/oder jede Klasse in meinen Feldern immer einen Konstruktor haben wird; und OOP gibt mir die Möglichkeit, keinen Konstruktor zu schreiben, einen Konstruktor ohne Parameter zu schreiben, ein Dutzend weiterer Konstruktoren mit Parametern zu schreiben

4. Bei der Verwendung von OOP müssen Sie zuvor erstellte Codefragmente nicht neu schreiben, Sie können erben, Sie können .... Sie können Fehler machen, der Compiler räumt in den meisten Fällen hinter dem Programmierer auf!


Nun, das ist meine eher laienhaften Blick auf OOP, im Allgemeinen ist es bequem und um alles effizient arbeiten, die Hauptarbeit bei der Verwendung von OOP, nicht der Programmierer, sondern der Compiler-Entwickler, so dass die Felder / Methoden nicht verwendet werden, nicht in der kompilierten Datei enthalten, wo der Programmierer einen Fehler gemacht, gut, ihn zu warnen)))

Grund der Beschwerde: