Auto-apprentissage du langage MQL5 à partir de zéro - page 46

 
D'ailleurs, je connais un exemple qui me permettrait de faire échec et mat dans mon propre défi. Mais je n'en parlerai pas, pour des raisons évidentes.
 
Vasiliy Sokolov:
D'ailleurs, je connais un exemple qui me permettrait de faire échec et mat dans mon propre défi. Mais je n'en parlerai pas, pour des raisons évidentes.
Nous y voilà....))))
 
Реter Konow:
Sailed....))))
Non, nous n'avons pas navigué. Cet exemple est celui d'un OLP voilé. Et ce dont nous discutons ici en est un sous-ensemble. C'est-à-dire que l'exemple montre qu'il y a des choses qui ne peuvent être résolues normalement qu'en POO. Les fonctions seules ne suffiront pas. Ce n'est donc pas une contradiction en soi, mais un problème à deux étoiles.
Mais c'est le niveau de la sortie de l'école, et pour l'instant nous sommes en première année.
 

Sur le mal des variables globales, et par là même, des champs publics de classe.

Voici un aperçu.

  1. Il y a un projet avec quelques centaines de fichiers include, d'une taille totale de 200k lignes (petite, en fait).
  2. Nous avons un bug.
  3. Nous l'avons localisé. Il est causé par des données invalides dans une variable globale.
  4. La variable globale est modifiée par le code à 600 endroits dans 150 fichiers d'inclusion, à 200 endroits elle est modifiée d'une manière non triviale - via le passage par référence dans une fonction. C'est le genre d'architecte qui a conçu ce projet, et un groupe d'outsiders qui l'a écrit.
  5. La foule susmentionnée a cherché un bug pendant un mois, ne l'a pas trouvé, et le patron les a tous licenciés et a appelé seniora.
  6. Il a jeté un coup d'oeil à ce désordre et a dit : 250k. de salaire pour moi et 75k chacun pour mes deux djuns, et on réécrira cette merde en six mois ou on la jettera.

Maintenant la bonne solution : changer une variable globale, si vous ne pouvez pas vous passer d'une béquille) uniquement par le biais d'une fonction.

  1. Il y a un projet avec quelques centaines de fichiers d'une taille totale de 200 000 lignes (si petit, en fait).
  2. Nous avons un bug.
  3. Nous l'avons localisé. Il est lié à des données invalides dans une variable globale.
  4. La fonction d'affectation de la valeur d'une variable est appelée par le code à 600 endroits dans 150 fichiers d'inclusion. Eh bien, c'est l'architecte d...r...ing qui l'a concocté, et un groupe d'outsiders qui l'a écrit, parce que c'est d...r...o de toute façon.
  5. June a inséré un point d'arrêt conditionnel dans la fonction et a vu l'état de la pile d'appel au moment de l'affectation des valeurs invalides (2 min.).
  6. Puis les remarques inimprimables de Jun à propos de l'abruti (le plus probable) qui l'a écrit, une autre demi-heure à 2 heures, selon l'hindouisme de Jun, pour le corriger et le déboguer.


 
Vladimir Simakov:

Sur le mal des variables globales, et par là même, des champs publics de classe.

Voici un aperçu.

  1. Il y a un projet avec quelques centaines de fichiers include, d'une taille totale de 200k lignes (petite, en fait).
  2. Nous avons un bug.
  3. Nous l'avons localisé. Il est causé par des données invalides dans une variable globale.
  4. La variable globale est modifiée par le code à 600 endroits dans 150 fichiers d'inclusion, à 200 endroits elle est modifiée d'une manière non triviale - via le passage par référence dans une fonction. C'est le genre d'architecte qui a conçu ce projet, et un groupe d'outsiders qui l'a écrit.
  5. La foule susmentionnée a cherché un bug pendant un mois, ne l'a pas trouvé, et le patron a perdu la tête, a viré tout le monde et a appelé seniora.
  6. Il a regardé ce désordre et a dit : 250k. de salaire pour moi et 75k chacun pour mes deux djuns, et on réécrira cette merde en six mois ou on la jettera.

Maintenant la bonne solution : changer une variable globale, si vous ne pouvez pas vous passer d'une béquille) uniquement par le biais d'une fonction.

  1. Il y a un projet avec quelques centaines de fichiers d'une taille totale de 200 000 lignes (si petit, en fait).
  2. Nous avons un bug.
  3. Nous l'avons localisé. Il est lié à des données invalides dans une variable globale.
  4. La fonction d'affectation de la valeur d'une variable est appelée par le code à 600 endroits dans 150 fichiers d'inclusion. Eh bien, c'est l'architecte d...r...ing qui l'a concocté, et un groupe d'outsiders qui l'a écrit, parce que c'est d...r...o de toute façon.
  5. June a inséré un point d'arrêt conditionnel dans la fonction et a vu l'état de la pile d'appel au moment de l'affectation des valeurs invalides (2 min.).
  6. Puis les remarques inimprimables de Jun à propos de l'abruti (le plus probable) qui l'a écrit, une autre demi-heure à 2 heures, selon l'hindustanité de Jun, pour le réparer et le déboguer.


Je l'ai. Les variables globales sont diaboliques. Comme le dit le proverbe... "Ce qui est bon pour le Russe..." ))))
 
Vasiliy Sokolov:
Non, nous ne le sommes pas. Cet exemple est celui d'un OLP voilé. Et ce dont nous discutons ici en est un sous-ensemble. C'est-à-dire que l'exemple montre qu'il y a des choses qui ne peuvent être résolues normalement qu'en POO. Les fonctions seules ne suffiront pas. Ce n'est donc pas une contradiction en soi, mais une tâche à deux étoiles.
Mais c'est le niveau d'une personne qui quitte l'école, et pour l'instant nous sommes en première année.
Bien. Tant que nous écrivons des programmes jusqu'à ~3000 lignes, nous pouvons utiliser les variables globales en toute sécurité. Ensuite, si Vladimir veut passer à la POO, il les abandonnera). N'est-ce pas ?
 
Реter Konow:
Bien. Tant que nous écrivons des programmes jusqu'à ~3000 lignes, nous pouvons utiliser les variables globales en toute sécurité. Ensuite, si Vladimir veut passer à la POO, il les abandonnera). N'est-ce pas ?

Non, ça ne l'est pas. Il faut apprendre dès le début) Chaque déclaration d'une variable globale (à ne pas confondre avec les paramètres d'entrée, bien qu'ils doivent être plus petits aussi) doit être clairement justifiée et faite en utilisant les formules les moins flatteuses (comme underjunct vulgaris b...)

 
Vladimir Simakov:

Non, ça ne l'est pas. Vous devez apprendre tout de suite) Si vous dites le mal, vous voulez dire le mal) Chaque déclaration d 'une variable globale (à ne pas confondre avec les paramètres d'entrée, bien qu'ils doivent être plus petits aussi) doit être clairement justifiée et faite en utilisant les déclarations les moins flatteuses (comme underdog vulgaris b...)

J'ai lu tous les messages sur les variables globales et j'ai compris ce que tous les participants à cette discussion voulaient me dire. Je vais apprendre à écrire le code d'un programme, tout en essayant de ne pas utiliser de variables globales. Merci à tous pour ces conseils constructifs !

Salutations, Vladimir.

 
Реter Konow:
Je l'ai. Les variables globales sont diaboliques. Comme le dit le proverbe... "Ce qui est bon pour le Russe..." ))))
En fait, ce n'est pas le bon proverbe. D'ailleurs, en termes de boisson, ils ne sont pas plus faibles que nous. Il ne s'agit pas des Allemands, mais des Anglo-Saxons en général. J'ai été dans le coin, tu sais. Je n'oublierai jamais ces vieux hommes parlant allemand en Turquie. Ils buvaient de 9h00 à 19h00 avec une pause pour le déjeuner, puis seul le bar de la piscine fermait et ils continuaient vers d'autres. Quoi qu'il en soit, j'ai regardé les doses qu'ils buvaient (Zadornov f...l.) et j'ai réalisé que malgré mon passé d'étudiant, que je sais faire, je n'aurais pas retenu un déjeuner à ce rythme le lendemain).
 

Je continue à étudier le langage de programmation MQL5. Je colle à nouveau le code révisé du script, en tenant compte des conseils des participants à ce fil de discussion. J'ai testé le script dans tous les modes. Aucun problème détecté. Pour commencer, j'ai appliqué le nombre minimal de paramètres d'entrée. Le code du script est écrit en anglais, les commentaires du code sont en russe, ce qui le rend plus facile à assimiler. Comme je l'ai promis plus tôt, j'ai essayé de décrire le script d'une manière compréhensible pour un étudiant de 1ère classe de l'école de programmation.

J'espère avoir fait exactement ce que m'ont dit les participants de ce fil, mais je peux me tromper.

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