Самообучение языку MQL5 с полного нуля - страница 46

 
Кстати, я знаю пример, который поставит мне шах и мат в моём же челендже. Но писать о нем по понятным причинам не буду.
 
Vasiliy Sokolov:
Кстати, я знаю пример, который поставит мне шах и мат в моём же челендже. Но писать о нем по понятным причинам не буду.
Приплыли....))))
 
Реter Konow:
Приплыли....))))
Нет, не преплыли. Этот пример из завуалированного ООП. А то, что мы здесь обсуждаем, это его подмножество. Т.е. пример показывает, что есть штуки которые нормально можно решить уже только в ООП. Одних функций будет недостаточно. Так что это не противоречие самому себе, а задача с двумя звёздочками.
Но это уровень выпускника школы, а пока мы в первом классе.
 

По поводу зла глобальных переменных, а заодно и публичных полей класса.

Вот смотри.

  1. Есть проект из пары сотен включаемых файлов, суммарным размером в 200k строк (маленький такой, на самом деле)
  2. Имеем баг.
  3. Локализовали следствие. Связано с тем, что в глобальной переменной оказались невалидные данные.
  4. Глобальную переменную меняют по коду в 600-х местах в 150-ти включаемых файлах, в 200-т местах меняют нетривиально, путем передачи по ссылке в функцию. Ну вот такой г...архитектор это ваял, а группа недоджунов писала.
  5. Вышеперечисленная толпа искала баг месяц, не нашла, начальник психонул и всех уволил и позвал кореша seniora.
  6. Посмотрел кореш на это непотребство и молвил: 250 тыр. зарплата мне и по 75 тыр. двум моим джунам, а мы эту хрень за полгода перепишем или выкидывай нахрен.

А теперь правильное решение: глобальную переменную, если уж от костыля никак не уйти) менять только через функцию.

  1. Есть проект из пары сотен включаемых файлов, суммарным размером в 200k строк (маленький такой, на самом деле)
  2. Имеем баг.
  3. Локализовали следствие. Связано с тем, что в глобальной переменной оказались невалидные данные.
  4. Функцию присвоения значения переменной вызывают по коду в 600-х местах в 150-ти включаемых файлах. Ну вот такой г...архитектор это ваял, а группа недоджунов писала, потому, что это все равно г...о.
  5. Джун вставил в функцию условную точку останова и увидел состояние стека вызовов в момент присвоения невалидных значений (2 мин.).
  6. Далее непечатные высказывания джуна о ламере (скорее всего это он и есть), который это писал, еще от получаса до 2-х часов, в зависимости от индусостисти джуна, на устранение и отладку.


 
Vladimir Simakov:

По поводу зла глобальных переменных, а заодно и публичных полей класса.

Вот смотри.

  1. Есть проект из пары сотен включаемых файлов, суммарным размером в 200k строк (маленький такой, на самом деле)
  2. Имеем баг.
  3. Локализовали следствие. Связано с тем, что в глобальной переменной оказались невалидные данные.
  4. Глобальную переменную меняют по коду в 600-х местах в 150-ти включаемых файлах, в 200-т местах меняют нетривиально, путем передачи по ссылке в функцию. Ну вот такой г...архитектор это ваял, а группа недоджунов писала.
  5. Вышеперечисленная толпа искала баг месяц, не нашла, начальник психонул и всех уволил и позвал кореша seniora.
  6. Посмотрел кореш на это непотребство и молвил: 250 тыр. зарплата мне и по 75 тыр. двум моим джунам, а мы эту хрень за полгода перепишем или выкидывай нахрен.

А теперь правильное решение: глобальную переменную, если уж от костыля никак не уйти) менять только через функцию.

  1. Есть проект из пары сотен включаемых файлов, суммарным размером в 200k строк (маленький такой, на самом деле)
  2. Имеем баг.
  3. Локализовали следствие. Связано с тем, что в глобальной переменной оказались невалидные данные.
  4. Функцию присвоения значения переменной вызывают по коду в 600-х местах в 150-ти включаемых файлах. Ну вот такой г...архитектор это ваял, а группа недоджунов писала, потому, что это все равно г...о.
  5. Джун вставил в функцию условную точку останова и увидел состояние стека вызовов в момент присвоения невалидных значений (2 мин.).
  6. Далее непечатные высказывания джуна о ламере (скорее всего это он и есть), который это писал, еще от получаса до 2-х часов, в зависимости от индусостисти джуна, на устранение и отладку.


Понял. Глоб.переменные зло. Как там в пословице... "Что русскому хорошо...".))))
 
Vasiliy Sokolov:
Нет, не преплыли. Этот пример из завуалированного ООП. А то, что мы здесь обсуждаем, это его подмножество. Т.е. пример показывает, что есть штуки которые нормально можно решить уже только в ООП. Одних функций будет недостаточно. Так что это не противоречие самому себе, а задача с двумя звёздочками.
Но это уровень выпускника школы, а пока мы в первом классе.
Верно. Пока пишем программы до ~3000 строк, можем спокойно использовать глоб.переменные. Потом, если Владимир захочет переходить на ООП, откажется от них.) Так?
 
Реter Konow:
Верно. Пока пишем программы до ~3000 строк, можем спокойно использовать глоб.переменные. Потом, если Владимир захочет переходить на ООП, откажется от них.) Так?

Нет, не так. Сразу правильно учиться надо) Сказали зло, значит зло) Каждое объявление глобальной переменной (не путаем со входными параметрами, хотя их тоже поменьше надо) должно быть четко обосновано и сделано и использованием в свой адрес самых нелицеприятных высказываний (типа недоджун vulgaris б..)

 
Vladimir Simakov:

Нет, не так. Сразу правильно учиться надо) Сказали зло, значит зло) Каждое объявление глобальной переменной (не путаем со входными параметрами, хотя их тоже поменьше надо) должно быть четко обосновано и сделано и использованием в свой адрес самых нелицеприятных высказываний (типа недоджун vulgaris б..)

Прочитал все сообщения про глобальные переменные и понял, что именно хотели донести до меня все участники этой дискуссии. Буду учиться писать программный код, стараясь при этом не использовать глобальные переменные. За конструктивные советы всем спасибо!

С уважением, Владимир.

 
Реter Konow:
Понял. Глоб.переменные зло. Как там в пословице... "Что русскому хорошо...".))))
Это, на самом деле, не правильная пословица. Кстати, в плане бухнуть, ну ни разу они не слабее нас. Это я не про немцев, а вообще про англо-саксов. Поездил, знаешь ли, посмотрел. Никогда тех старичков немецкоязычных в Турции не забуду. Они пили с 9:00 до 19:00 с перерывом на обед, потом просто бар у бассейна закрывался и они продолжали в других. Так вот, я посмотрел на то, какими дозами они закидывают (Задорнов пиз...л) и понял, что не смотря на мою студенческую закалку, а я знаю в этом толк, хрен бы я обед такими темпами вспомнил на следующий день)
 

Продолжаю изучение языка программирования MQL5. Снова выкладываю доработанный код скрипта с учетом подсказок от участников данной темы. Произведена проверка работы скрипта на всех режимах. Проблемы не выявлены. Для начала применил минимальное количество входных параметров. Код скрипта написан на английском языке, а комментарии к коду на русском языке, чтобы облегчить усвоение материала. В данном скрипте постарался всё расписать, как ранее и обещал, в изложении доступном для ученика 1-го класса школы программирования.

Надеюсь, что теперь сделал именно так, как мне объяснили участники данной темы, но могу и ошибаться.

С уважением, Владимир.

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