Perguntas sobre OOP em MQL5 - página 34

 
Koldun Zloy:

Se você está usando aulas para algo que não entende, não é OOP.

E sim, eu o aconselho, até que você entenda a necessidade desses artifícios, não os utilize.

Com tal abordagem, a compreensão nunca chegará.
 
Alexey Viktorov:
Com esta abordagem, a compreensão nunca chegará.

Não creio que, com o uso impróprio, a compreensão possa vir.

 
Alexey Viktorov:

Igor, você se lembra da tarefa que o Czar deu a Fedot, o Forte?

E qual foi a resposta dos dois jovens?

Como você pode tentar reproduzir algo, se você não conhece as regras, ou o resultado final a ser obtido...

Bem, é mais ou menos isso mesmo, aqui está uma imitação do fato de que os tempos das notícias e a quantidade de notícias diferem de país para país:

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


mas resta saber se você precisa embrulhá-lo em uma OLP.

;)

aqui está um registro de como foi chamado e com o que acabou:

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) Erro, não este tipo FR

2019.09.08 16:00:35.032 tst (EURUSD,H1) Notícias #1 em 1970.01.01.01 00:01:51

2019.09.08 16:00:35.032 tst (EURUSD,H1) Notícias #2 em 1970.01.01.01 00:03:42

2019.09.08 16:00:35.032 tst (EURUSD,H1) Notícias #3 em 1970.01.01.01 00:05:33

2019.09.08 16:00:35.032 tst (EURUSD,H1) Notícias #1 em 1970.01.01.01 00:07:24

2019.09.08 16:00:35.032 tst (EURUSD,H1) Notícias #2 em 1970.01.01.01 00:09:15

 
Koldun Zloy:

Não creio que, com o uso impróprio, a compreensão possa vir.

No mínimo, chegará um entendimento de que "não há peixe aqui")).
 
Alexey Viktorov:
Pelo menos haverá um entendimento de que "não há peixe aqui")).

Já ouvimos isso muitas vezes de alguns personagens locais.

E isso é apenas por falta de compreensão.

E há peixe!

 
Igor Makanu:

bem, aqui está uma simulação de que os horários e o número de notícias são diferentes para diferentes países:


mas resta saber se você precisa embrulhá-lo em um OOP.

;)

aqui está um registro de como tudo foi chamado e com o que acabou:

Não, Igor. Esta não é uma abordagem deste 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          // кодовое наименование валюты страны  
   );

As cordas destacadas são três casos de uso. Ao mesmo tempo, o intervalo de tempo muda. Em seguida, a matriz de valores[] é processada de uma certa forma. A identificação do evento é usada para obter a descrição deste evento. Sua importância, tempo e outros atributos.

 
Koldun Zloy:

Já ouvimos isso muitas vezes de alguns personagens locais.

E isso é apenas por falta de compreensão.

E há peixe!

Eu li sobre isso. Há peixe, mas não onde você não entende. Que tipo de projeto deve ser em mql5 para que haja peixe. Quero ver pelo menos um projeto em mql5, onde a necessidade de OOP seria vista.
 
Alexey Viktorov:
Eu li sobre isso. Há peixe, mas não onde você não entende. Que tipo de projeto deve ser em mql5 para que haja peixe. Quero ver pelo menos um projeto em mql5, onde a necessidade de OOP seria vista.

Provavelmente, não há necessidade de OOP. Em princípio, tudo pode ser feito em um estilo estruturado. Mas pessoalmente, meu primeiro impulso começou quando decidi usar estruturas em vez de conjuntos de variáveis globais, que tinham começado a crescer perigosamente. Eu já havia passado de estruturas para classes porque parecia lógico integrar funções que processavam dados dessas estruturas diretamente nelas, o que levou à criação de classes. Isto não é uma questão de necessidade, mas simplesmente organizar os dados e trabalhar com eles.

 
BlackTomcat:
Não é necessário "matar" o objeto assim que ele for criado e tiver feito seu trabalho.
Os objetos criados podem ser "mortos" na função OnDeinit após o término do programa MQL,
Enquanto o programa estiver em execução, todos os objetos podem ser guardados na memória e podem ser acessados.

Se o objeto cumpriu sua tarefa, por que guardá-lo na memória?
Não ocorrerá um vazamento de memória?

 
Alexey Viktorov:

Não, Igor. Essa não é a abordagem aqui.

As linhas destacadas são os três casos de uso. Neste caso, o intervalo de tempo muda. Então a matriz de valores[] é processada de uma certa maneira. A identificação do evento é usada para obter a descrição deste evento. Sua importância, tempo e outros atributos.

a abordagem não é importante

Se você quer entender OOP, minha opinião ( já escrevi ) - é conveniente, mas OOP é apenas um paradigma, bem, uma forma de escrever, que combina vários conceitos OOP - Wiki...


Então você pode tentar o oposto: aqui está sua tarefa, você precisa dividi-la em dados e formas de processar os dados...

1. Onde você vai armazenar os dados? - muito provavelmente uma estrutura

2. Como você irá processar os dados? - Muito provavelmente um conjunto de funções.

3. Como você vai rubricar os dados? - muito provavelmente um conjunto de estruturas, e você precisará zerar neste conjunto e depois preenchê-lo com dados

4. Como você vai garantir a flexibilidade do código previamente escrito - refactoring ?

Agora, se você usa OOP:

1. em campos de uma classe, embora talvez este campo seja uma estrutura, ou talvez eu escreva uma classe base que armazene os dados e faça herança OU esta classe será um campo na classe em discussão agora

Se eu escrever uma classe base, posso criar métodos em uma classe base para realizar uma simples manipulação de dados, e se eu herdar de uma classe base, estes métodos estarão disponíveis na classe também.

2.2 Se eu quiser mudar apenas um método depois de herdar da classe base, não vou reescrever nada na classe base, não é necessário! - eu vou apenas escrever um método (uma função!) com o mesmo nome do método da classe base, e ele será herança!

3. será um construtor, e se eu não escrever um construtor, ele será chamado implicitamente, então eu tenho em mente que cada classe da qual herdei e/ou classe em meus campos sempre terá um construtor chamado; e OOP me dá a habilidade de não escrever um construtor, escrever um construtor sem parâmetros, escrever mais uma dúzia de construtores com parâmetros

4. Usando o OOP você não precisa reescrever fragmentos de código criados anteriormente, você pode herdar, você pode .... você também pode cometer um erro, o compilador irá limpar depois do programador na maioria dos casos!


bem, esta é minha visão bastante amadora sobre OOP, em geral, é conveniente e para fazer tudo funcionar eficientemente, o trabalho principal quando se usa OOP, não o programador, mas os desenvolvedores do compilador, para que os campos / métodos não sejam usados para não incluir no arquivo compilado, onde o programador cometeu um erro, bem, para adverti-lo))))