Preguntas sobre POO en MQL5 - página 34

 
Koldun Zloy:

Si estás usando clases para algo que no entiendes, no es POO.

Y sí, te aconsejo que hasta que no entiendas la necesidad de estos trucos, no los uses.

Con este enfoque, la comprensión nunca llegará.
 
Alexey Viktorov:
Con este enfoque, la comprensión nunca llegará.

No creo que con un uso inadecuado pueda llegar la comprensión.

 
Alexey Viktorov:

Igor, ¿recuerdas la tarea que el zar le encomendó a Fedot el Streltsy?

¿Y cuál fue la respuesta de los dos jóvenes?

Cómo se puede intentar reproducir algo, si no se conocen las reglas, o el resultado final a obtener...

Bueno, eso es más o menos, aquí hay una imitación del hecho de que los tiempos de las noticias y la cantidad de noticias difieren de un país a otro:

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


pero está por ver si hay que envolverlo en una OLP.

;)

aquí hay un registro de cómo se llamó y con qué terminó:

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) Error, no este tipo FR

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

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

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

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

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

 
Koldun Zloy:

No creo que con un uso inadecuado pueda llegar la comprensión.

Por lo menos, se entenderá que "aquí no hay peces").
 
Alexey Viktorov:
Al menos se entenderá que "aquí no hay peces")).

Esto lo hemos escuchado muchas veces de algunos personajes locales.

Y eso es sólo por falta de comprensión.

¡Y hay peces!

 
Igor Makanu:

Bueno, eso es todo, aquí hay una simulación de que los tiempos de las noticias y el número de noticias son diferentes para los distintos países:


pero está por ver si es necesario envolverlo en un OOP.

;)

aquí hay un registro de cómo se llamó todo y lo que terminó:

No, Igor. Este no es un enfoque de este tipo.

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

Las cadenas resaltadas son tres casos de uso. Al mismo tiempo, el rango de tiempo cambia. A continuación, la matriz values[] se procesa de una manera determinada. El ID del evento se utiliza para obtener la descripción de este evento. Su importancia, tiempo y otros atributos.

 
Koldun Zloy:

Esto lo hemos escuchado muchas veces de algunos personajes locales.

Y eso es sólo por falta de comprensión.

¡Y hay peces!

He leído sobre ello. Hay peces, pero no donde no se entiende. ¿Qué tipo de proyecto debe haber en mql5 para que haya peces... Quiero ver al menos un proyecto en mql5, donde se vea la necesidad de la POO.
 
Alexey Viktorov:
He leído sobre ello. Hay peces, pero no donde no se entiende. ¿Qué tipo de proyecto debe haber en mql5 para que haya peces... Quiero ver al menos un proyecto en mql5, donde se vea la necesidad de la POO.

Probablemente, no hay necesidad de OOP. En principio, todo puede hacerse con un estilo estructurado. Pero personalmente, mi primer impulso comenzó cuando decidí utilizar estructuras en lugar de conjuntos de variables globales, que habían comenzado a crecer peligrosamente. Ya había pasado de las estructuras a las clases porque parecía lógico integrar las funciones que procesaban los datos de esas estructuras directamente en ellas, lo que llevó a la creación de las clases. No se trata de una cuestión de necesidad, sino simplemente de ordenar los datos y trabajar con ellos.

 
BlackTomcat:
No es necesario "matar" el objeto tan pronto como se crea y ha hecho su trabajo.
Los objetos creados pueden ser "matados" en la función OnDeinit después de que el programa MQL haya terminado,
Mientras se ejecuta el programa, todos los objetos pueden mantenerse en memoria y se puede acceder a ellos.

Si el objeto ha realizado su tarea, ¿por qué mantenerlo en memoria?
¿No se producirá una fuga de memoria?

 
Alexey Viktorov:

No, Igor. Ese no es el enfoque aquí.

Las líneas resaltadas son los tres casos de uso. En este caso el rango de tiempo cambia. A continuación, el array values[] se procesa de una manera determinada. El ID del evento se utiliza para obtener la descripción de este evento. Su importancia, tiempo y otros atributos.

el enfoque no es importante

Si quieres entender la POO, mi opinión ( ya he escrito) - es conveniente, pero la POO es sólo un paradigma, bueno, una forma de escribir, que combina varios conceptos de POO - Wiki...


Así que puedes intentar lo contrario: esta es tu tarea, tienes que descomponerla en datos y formas de procesar los datos...

1. ¿Dónde va a almacenar los datos? - probablemente una estructura

2. ¿Cómo va a procesar los datos? - Lo más probable es que sea un conjunto de funciones.

3. ¿Cómo va a inicializar los datos? - probablemente una matriz de estructuras, y tendrá que poner a cero esta matriz y luego llenarla con datos

4. ¿Cómo va a garantizar la flexibilidad del código previamente escrito - refactorización?

Ahora bien, si usas OOP:

1. en campos de una clase, aunque tal vez este campo será una estructura, o tal vez escribiré una clase base en absoluto que almacenará los datos y hará la herencia O esta clase será un campo en la clase que se discute ahora

2.1. Será un conjunto de métodos. Si escribo una clase base, probablemente crearé métodos en una clase base que harán el procesamiento básico de datos, y si heredo de una clase base, estos métodos estarán disponibles en la clase - ¡es la herencia!

2.2. Si quiero cambiar sólo un método después de heredar de la clase base, no reescribiré nada en la clase base, ¡no es necesario! - simplemente escribiré un método (¡una función!) con el mismo nombre que el método de la clase base, ¡y será herencia!

3. será un constructor, y si no escribo un constructor, será llamado implícitamente, así que tengo en cuenta que cada clase de la que herede y/o clase en mis campos siempre tendrá un constructor llamado; y la POO me da la posibilidad de no escribir un constructor, de escribir un constructor sin parámetros, de escribir una docena más de constructores con parámetros

4. con la POO no hay que reescribir fragmentos de código creados previamente, se puede heredar, se puede .... puede meter la pata, el compilador limpiará después del programador en la mayoría de los casos.


bueno, este es mi punto de vista bastante amateur sobre la POO, en general, es conveniente y con el fin de hacer que todo funcione de manera eficiente, el trabajo principal cuando se utiliza la POO, no el programador, pero los desarrolladores del compilador, para que los campos / métodos no se utilizan para no incluir en el archivo compilado, donde el programador cometió un error, bueno, para advertirle))

Razón de la queja: