Auto-aprendizagem da linguagem MQL5 a partir do zero - página 46

 
A propósito, conheço um exemplo que me daria um xeque-mate em meu próprio desafio. Mas eu não vou escrever sobre isso, por razões óbvias.
 
Vasiliy Sokolov:
A propósito, conheço um exemplo que me daria um xeque-mate em meu próprio desafio. Mas eu não vou escrever sobre isso, por razões óbvias.
Aqui vamos....))))
 
Реter Konow:
Sailed....))))
Não, nós não navegamos. Esse exemplo é de uma OLP velada. E o que estamos discutindo aqui é um subconjunto dele. Isto é, o exemplo mostra que existem algumas coisas que normalmente só podem ser resolvidas no OOP. As funções por si só não serão suficientes. Portanto, não é uma contradição em si, mas um problema de duas estrelas.
Mas isso é o nível de abandono escolar, e por enquanto estamos na primeira série.
 

Sobre o mal das variáveis globais e, da mesma forma, sobre os campos de classe pública.

Aqui está um olhar.

  1. Há um projeto com algumas centenas de arquivos incluídos, tamanho total de 200k linhas (pequenas, na verdade).
  2. Nós temos um bug.
  3. Nós o localizamos. É causado por dados inválidos em uma variável global.
  4. A variável global é alterada por código em 600 lugares em 150 incluem arquivos, em 200 lugares é alterada de forma não trivial - através da passagem por referência para uma função. Bem, esse é o tipo de arquiteto que cozinhou isso, e um grupo de desfavorecidos que o escreveu.
  5. A multidão acima mencionada procurou um bicho por um mês, não o encontrou, e o chefe os demitiu a todos e chamou de seniora.
  6. Ele deu uma olhada nesta confusão e disse: 250k. de salário para mim e 75k cada um para meus dois djuns, e nós reescreveremos esta merda em seis meses ou a jogaremos fora.

Agora a solução certa: mudar uma variável global, se você não conseguir fugir de uma muleta) apenas através de uma função.

  1. Há um projeto com algumas centenas de arquivos com um tamanho total de 200k linhas (tão pequenas, na verdade).
  2. Nós temos um bug.
  3. Nós o localizamos. Está relacionado a dados inválidos em uma variável global.
  4. A função de atribuir o valor de uma variável é chamada por código em 600 lugares em 150 arquivos incluídos. Bem, esse é o arquiteto d...r...ing que o cozinhou, e o grupo de desfavorecidos que o escreveu, porque é d...r...o de qualquer forma.
  5. Junho inseriu um ponto de parada condicional na função e viu o estado da pilha de chamadas no momento da atribuição de valores inválidos (2 min.).
  6. Depois, os comentários de Jun sobre o lamer (muito provavelmente ele é) que o escreveu, mais meia hora a 2 horas, dependendo do contratempo de Jun, para consertá-lo e depurpá-lo.


 
Vladimir Simakov:

Sobre o mal das variáveis globais e, da mesma forma, sobre os campos de classe pública.

Aqui está um olhar.

  1. Há um projeto com algumas centenas de arquivos incluídos, tamanho total de 200k linhas (pequenas, na verdade).
  2. Nós temos um bug.
  3. Nós o localizamos. É causado por dados inválidos em uma variável global.
  4. A variável global é alterada por código em 600 lugares em 150 incluem arquivos, em 200 lugares é alterada de forma não trivial - através da passagem por referência para uma função. Bem, esse é o tipo de arquiteto que cozinhou isso, e um grupo de desfavorecidos que o escreveu.
  5. A multidão acima mencionada procurou um bicho por um mês, não o encontrou, e o chefe perdeu a cabeça, despediu a todos e chamou a seniora.
  6. Ele deu uma olhada nesta confusão e disse: 250k. de salário para mim e 75k cada um para meus dois djuns, e nós reescreveremos esta merda em seis meses ou a jogaremos fora.

Agora a solução certa: mudar uma variável global, se você não conseguir fugir de uma muleta) apenas através de uma função.

  1. Há um projeto com algumas centenas de arquivos com um tamanho total de 200k linhas (tão pequenas, na verdade).
  2. Nós temos um bug.
  3. Nós o localizamos. Está relacionado a dados inválidos em uma variável global.
  4. A função de atribuir o valor de uma variável é chamada por código em 600 lugares em 150 arquivos incluídos. Bem, esse é o arquiteto d...r...ing que o cozinhou, e um grupo de desfavorecidos que o escreveu, porque é d...r...o de qualquer forma.
  5. Junho inseriu um ponto de parada condicional na função e viu o estado da pilha de chamadas no momento da atribuição de valores inválidos (2 min.).
  6. Depois, os comentários de Jun sobre o lamer (muito provavelmente é ele) que o escreveu, mais meia hora a 2 horas, dependendo da hindustanidade de Jun, para consertá-la e depurá-la.


Entendi. As variáveis globais são más. Como diz o ditado... "O que é bom para o russo..." ))))
 
Vasiliy Sokolov:
Não, não estamos. Este exemplo é de uma OLP velada. E o que estamos discutindo aqui é um subconjunto dele. Isto é, o exemplo mostra que existem algumas coisas que normalmente só podem ser resolvidas no OOP. As funções por si só não serão suficientes. Portanto, não é uma contradição em si mesma, mas uma tarefa de duas estrelas.
Mas esse é o nível de um aluno que deixa a escola, e por enquanto estamos na primeira série.
Certo. Desde que escrevamos programas de até ~3000 linhas, podemos utilizar com segurança variáveis globais. Então, se Vladimir quiser mudar para o OOP, ele os abandonará). Certo?
 
Реter Konow:
Certo. Desde que escrevamos programas de até ~3000 linhas, podemos utilizar com segurança variáveis globais. Então, se Vladimir quiser mudar para o OOP, ele os abandonará). Certo?

Não, não é. Cada declaração de uma variável global (não confundir com parâmetros de entrada, embora devam ser menores também) deve ser claramente justificada e feita usando as declarações mais pouco lisonjeiras (como underjunct vulgaris b...)

 
Vladimir Simakov:

Não, não é. Cada declaração de uma variável global (não confundir com parâmetros de entrada, embora eles também devam ser menores) deve ser claramente justificada e feita usando as declarações mais indelicadas (como underdog vulgaris b...)

Li todas as mensagens sobre variáveis globais e compreendi o que todos os participantes desta discussão queriam me dizer. Aprenderei a escrever o código do programa, enquanto tento não utilizar variáveis globais. Obrigado a todos vocês por este conselho construtivo!

Cumprimentos, Vladimir.

 
Реter Konow:
Entendi. As variáveis globais são más. Como diz o ditado... "O que é bom para o russo..." ))))
Na verdade, não é o provérbio certo. A propósito, em termos de bebida eles não são mais fracos do que nós. Não se trata de alemães, mas de anglo-saxões em geral. Eu já estive por aqui, sabe. Nunca esquecerei aqueles velhos de língua alemã na Turquia. Eles bebiam das 9:00 às 19:00 com um intervalo para o almoço, depois apenas o bar da piscina fechava e eles continuavam para os outros. De qualquer forma, eu olhei para as doses que eles estavam bebendo (Zadornov f...l.) e percebi que apesar da minha formação acadêmica, que eu sei como fazer, eu não teria me lembrado do almoço a esse ritmo no dia seguinte).
 

Eu continuo estudando a linguagem de programação MQL5. Estou colando novamente o código revisado do roteiro, levando em conta as dicas dos participantes deste tópico. Eu testei o roteiro em todos os modos. Nenhum problema detectado. Para começar, eu apliquei o número mínimo de parâmetros de entrada. O código do roteiro é escrito em inglês, os comentários ao código estão em russo, para que seja mais fácil de digerir. Como prometi anteriormente, tentei descrever o roteiro de uma forma compreensível para um aluno do 1º ano da escola de programação.

Espero ter feito exatamente o que me foi dito pelos participantes deste tópico, mas posso estar errado.

Cumprimentos, Vladimir.

//+------------------------------------------------------------------+
//|                                                Learning_MQL5.mq5 |
//|                        Copyright 2020, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright   "Copyright 2020, MetaQuotes Software Corp."
#property link        "https://www.mql5.com"
#property description "Скрипт подводит итог обучения языку программирования MQL5. В зависимости от"
#property description "входных параметров печатает во вкладке \"Эксперт\" торгового терминала два"
#property description "сообщения на русском языке: \"Я выучу язык MQL5!\" или \"Я не выучу язык MQL5!\""
#property description "Код скрипта написан на основе примера, приведенного Valeriy Yastremskiy на сайте"
#property description "MQL5, в теме \"Самообучение языку MQL5 с полного нуля\"."
#property description "======================================================"
#property description "Ссылка на пример https://www.mql5.com/ru/forum/352460/page30#comment_18646826"
//---
#property version     "1.00"              //версия скрипта 1.00
//---
#property script_show_inputs              //выводить окно со свойствами перед запуском скрипта 
//--- Зададим входные параметры скрипта:
input ushort Period_learning=500;         //Полный период обучения (в днях)
input ushort Days_passed=10;              //Сколько дней прошло с начала обучения (в днях)
input bool   Patience=true;               //Терпение (true - достаточно; false - не достаточно)
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()                        //старт работы скрипта
  {
   /* Зададим условие для работы скрипта. Если:
      1. значение функции "имею время" будет равно значению истина (true)
      2. и значение функции "имею терпение" будет равно значению истина (true)
   */
   if(have_time()==true && have_patience()==true)
     {
      Print("Я выучу язык MQL5!");    //выводим сообщение "Я выучу язык MQL5!"
     }
   else //в противном случае
     {
      Print("Я не выучу язык MQL5!"); //выводим сообщение "Я не выучу язык MQL5!"
     }
  }
//+------------------------------------------------------------------+
//| have_time function (функция "имею_время")                        |
//+------------------------------------------------------------------+
bool have_time()          //создаём функцию "имею_время" и присвоим тип данных bool
  {
   /* создаём переменную enough_time (достаточно времени), где bool - логическое значение:
      истина (true) или ложь (false) и предопределяем её значение равное false
   */
   bool enough_time=false;
   /* Если:
      1. значение входного параметра Period_learning больше нуля
      2. и значение входного параметра Days_passed больше или равно значения входного параметра Period_learning
   */
   if(Period_learning>0 && Days_passed>=Period_learning)
     {
      enough_time=true;   //то значение enough_time (достаточно времени) будет равно истине (true)
     }
   else                   //в противном случае
     {
      enough_time=false;  //значение enough_time (достаточно времени) будет равно ложь (false)
     }
   return(enough_time);   //возвращаем значение "достаточно времени" в функцию "имею время"
  }
//+------------------------------------------------------------------+
//| have_patience function (функция "имею_терпение")                 |
//+------------------------------------------------------------------+
bool have_patience()           //создаём функцию "имею_терпение" и присвоим тип данных bool
  {
   /* создаём переменную enough_patience (достаточно терпения), где bool - логическое значение:
      истина (true) или ложь (false) и предопределяем её значение равное false
   */
   bool enough_patience=false;
   enough_patience=Patience;   //задаём для переменной enough_patience (достаточно терпения) значение равное
                               //входному параметру "Терпение" (Patience): истина или ложь
   return(enough_patience);    //возвращаем значение "достаточно терпения" в функцию "имею терпение"
  }
//+------------------------------------------------------------------+