Autoaprendizaje del lenguaje MQL5 desde cero - página 46

 
Por cierto, conozco un ejemplo que me daría jaque mate en mi propio desafío. Pero no voy a escribir sobre ello, por razones obvias.
 
Vasiliy Sokolov:
Por cierto, conozco un ejemplo que me daría jaque mate en mi propio desafío. Pero no voy a escribir sobre ello, por razones obvias.
Aquí vamos....))))
 
Реter Konow:
Navegado....))))
No, no hemos navegado. Ese ejemplo es de una OLP velada. Y lo que estamos discutiendo aquí es un subconjunto de ella. Es decir, el ejemplo muestra que hay cosas que normalmente sólo se pueden resolver en POO. Las funciones por sí solas no serán suficientes. Así que no es una contradicción en sí misma, sino un problema de dos estrellas.
Pero ese es el nivel de los que terminan la escuela, y por ahora estamos en el primer grado.
 

Sobre el mal de las variables globales, y por la misma razón, los campos de la clase pública.

Aquí tienes un vistazo.

  1. Hay un proyecto con un par de cientos de archivos de inclusión, el tamaño total de 200k líneas (pequeño, en realidad).
  2. Tenemos un error.
  3. Lo hemos localizado. Está causado por datos no válidos en una variable global.
  4. La variable global es modificada por el código en 600 lugares en 150 archivos de inclusión, en 200 lugares es modificada de una manera no trivial - a través del paso por referencia a una función. Pues bien, ese es el tipo de g... arquitecto que lo ha cocinado, y un grupo de infradotados que lo han escrito.
  5. Los mencionados buscaron un bicho durante un mes, no lo encontraron, y el jefe los despidió a todos y llamó a seniora.
  6. Miró este desorden y dijo: 250k. de salario para mí y 75k cada uno para mis dos djuns, y reescribiremos esta mierda en seis meses o la tiraremos.

Ahora la solución correcta: cambiar una variable global, si no se puede salir de una muleta) sólo a través de una función.

  1. Hay un proyecto con un par de cientos de archivos con un tamaño total de 200k líneas (tan pequeño, en realidad).
  2. Tenemos un error.
  3. Lo hemos localizado. Está relacionado con datos no válidos en una variable global.
  4. La función de asignar el valor de una variable es llamada por el código en 600 lugares en 150 archivos de inclusión. Bueno, eso es el d...r...ing arquitecto que lo cocinó, y un grupo de infradotados que lo escribieron, porque de todos modos es d...r...o.
  5. June insertó un punto de interrupción condicional en la función y vio el estado de la pila de llamadas en el momento de asignar valores no válidos (2 min.).
  6. Luego los comentarios impresentables de Jun sobre el cojo (lo más probable es que lo sea) que lo ha escrito, otra media hora o 2 horas, dependiendo de la hinduidad de Jun, para arreglarlo y depurarlo.


 
Vladimir Simakov:

Sobre el mal de las variables globales, y por la misma razón, los campos de la clase pública.

Aquí tienes un vistazo.

  1. Hay un proyecto con un par de cientos de archivos de inclusión, el tamaño total de 200k líneas (pequeño, en realidad).
  2. Tenemos un error.
  3. Lo hemos localizado. Está causado por datos no válidos en una variable global.
  4. La variable global es modificada por el código en 600 lugares en 150 archivos de inclusión, en 200 lugares es modificada de una manera no trivial - a través del paso por referencia a una función. Pues bien, ese es el tipo de g... arquitecto que lo ha cocinado, y un grupo de infradotados que lo han escrito.
  5. Los mencionados buscaron un bicho durante un mes, no lo encontraron, y el jefe los despidió a todos y llamó a seniora.
  6. Echó un vistazo a este lío y dijo: 250k. de salario para mí y 75k cada uno para mis dos djuns, y reescribiremos esta mierda en seis meses o la tiraremos.

Ahora la solución correcta: cambiar una variable global, si no se puede salir de una muleta) sólo a través de una función.

  1. Hay un proyecto con un par de cientos de archivos con un tamaño total de 200k líneas (tan pequeño, en realidad).
  2. Tenemos un error.
  3. Lo hemos localizado. Está relacionado con datos no válidos en una variable global.
  4. La función de asignar el valor de una variable es llamada por el código en 600 lugares en 150 archivos de inclusión. Bueno, eso es el d...r...ing arquitecto que lo cocinó, y un grupo de infradotados que lo escribieron, porque de todos modos es d...r...o.
  5. June insertó un punto de interrupción condicional en la función y vio el estado de la pila de llamadas en el momento de asignar valores no válidos (2 min.).
  6. Luego los comentarios impresentables de Jun sobre el cojo (lo más probable es que lo sea) que lo ha escrito, otra media hora a 2 horas, dependiendo de la industancialidad de Jun, para arreglarlo y depurarlo.


Lo tengo. Las variables globales son malas. Como dice el refrán... "Lo que es bueno para el ruso..." ))))
 
Vasiliy Sokolov:
No, no lo hacemos. Este ejemplo es de una OLP velada. Y lo que estamos discutiendo aquí es un subconjunto de ella. Es decir, el ejemplo muestra que hay cosas que normalmente sólo se pueden resolver en POO. Las funciones por sí solas no serán suficientes. Así que no es una contradicción en sí misma, sino una tarea de dos estrellas.
Pero ese es el nivel de un alumno de la escuela, y por ahora estamos en el primer grado.
Sí. Mientras escribamos programas de hasta ~3000 líneas, podemos utilizar con seguridad las variables globales. Luego, si Vladimir quiere pasar a la OOP, los abandonará). ¿Verdad?
 
Реter Konow:
Sí. Mientras escribamos programas de hasta ~3000 líneas, podemos utilizar con seguridad las variables globales. Luego, si Vladimir quiere pasar a la OOP, los abandonará). ¿Verdad?

No, no lo es. Hay que aprender desde el principio) Toda declaración de una variable global (no confundir con los parámetros de entrada, aunque también deben ser más pequeños) debe estar claramente justificada y hacerse con las afirmaciones menos favorecedoras (como underjunct vulgaris b...)

 
Vladimir Simakov:

No, no lo es. Hay que aprender de inmediato) Si se dice mal, se dice mal) Toda declaración de una variable global (no confundir con los parámetros de entrada, aunque también deben ser más pequeños) debe estar claramente justificada y hacerse con los enunciados menos favorecedores (como underdog vulgaris b...)

Leí todos los mensajes sobre las variables globales y entendí lo que todos los participantes de esta discusión querían decirme. Aprenderé a escribir el código del programa, tratando de no utilizar variables globales. Gracias a todos por estos consejos constructivos.

Saludos, Vladimir.

 
Реter Konow:
Lo tengo. Las variables globales son malas. Como dice el refrán... "Lo que es bueno para el ruso..." ))))
En realidad no es el proverbio correcto. Por cierto, en cuanto a la bebida no son más débiles que nosotros. No se trata de los alemanes, sino de los anglosajones en general. He estado por ahí, ya sabes. Nunca olvidaré a esos ancianos de habla alemana en Turquía. Bebían desde las 9:00 hasta las 19:00 con una pausa para comer, luego sólo cerraban el bar de la piscina y seguían con otros. De todos modos, miré las dosis que tomaban (Zadornov f...l.) y me di cuenta de que a pesar de mi formación de estudiante, que sé hacer, no me habría acordado de comer a ese ritmo al día siguiente).
 

Sigo estudiando el lenguaje de programación MQL5. Vuelvo a pegar el código revisado del script, teniendo en cuenta los consejos de los participantes de este hilo. He probado el script en todos los modos. No se ha detectado ningún problema. Para empezar, he aplicado el número mínimo de parámetros de entrada. El código del script está escrito en inglés, los comentarios al código están en ruso, para que sea más fácil de digerir. Como prometí antes, he intentado describir el script de forma comprensible para un estudiante de 1º de la escuela de programación.

Espero haber hecho exactamente lo que me dijeron los participantes de este hilo, pero puedo estar equivocado.

Saludos, 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);    //возвращаем значение "достаточно терпения" в функцию "имею терпение"
  }
//+------------------------------------------------------------------+
Razón de la queja: