Autoapprendimento del linguaggio MQL5 da zero - pagina 46

 
A proposito, conosco un esempio che mi darebbe scacco matto nella mia sfida. Ma non ne scriverò, per ovvi motivi.
 
Vasiliy Sokolov:
A proposito, conosco un esempio che mi darebbe scacco matto nella mia sfida. Ma non ne scriverò, per ovvi motivi.
Ecco qui....))))
 
Реter Konow:
Navigato....))))
No, non abbiamo navigato. Questo esempio viene da un velato OLP. E quello di cui stiamo discutendo qui è un sottoinsieme di esso. Cioè l'esempio mostra che ci sono alcune cose che normalmente possono essere risolte solo in OOP. Le funzioni da sole non saranno sufficienti. Quindi non è una contraddizione in sé, ma un problema a due stelle.
Ma questo è il livello della scuola, e per ora siamo in prima elementare.
 

Sul male delle variabili globali e, per lo stesso motivo, dei campi pubblici di classe.

Ecco uno sguardo.

  1. C'è un progetto con un paio di centinaia di file di inclusione, con una dimensione totale di 200k linee (piccola, in realtà).
  2. Abbiamo un bug.
  3. Lo abbiamo localizzato. È causato da dati non validi in una variabile globale.
  4. La variabile globale è cambiata dal codice in 600 posti in 150 file include, in 200 posti è cambiata in un modo non banale - attraverso il passaggio per riferimento in una funzione. Beh, questo è il tipo di g...architetto che ha cucinato questo, e un gruppo di sfavoriti che l'ha scritto.
  5. La suddetta folla ha cercato un bug per un mese, non l'ha trovato, e il capo li ha licenziati tutti e ha chiamato seniora.
  6. Ha guardato questo casino e ha detto: 250k. di stipendio a me e 75k ciascuno ai miei due djun, e riscriviamo questa merda in sei mesi o la buttiamo via.

Ora la soluzione giusta: cambiare una variabile globale, se non riesci a liberarti di una stampella) solo attraverso una funzione.

  1. C'è un progetto con un paio di centinaia di file con una dimensione totale di 200k linee (così piccolo, in realtà).
  2. Abbiamo un bug.
  3. Lo abbiamo localizzato. È legato a dati non validi in una variabile globale.
  4. La funzione di assegnazione del valore di una variabile è chiamata dal codice in 600 posti in 150 file include. Beh, questo è il d...r...o architetto che l'ha preparato, e un gruppo di sfigati che l'ha scritto, perché è comunque d...r...o.
  5. June ha inserito un breakpoint condizionale nella funzione e ha visto lo stato dello stack delle chiamate al momento dell'assegnazione dei valori non validi (2 min.).
  6. Poi i commenti impronunciabili di Jun sul lamer (molto probabilmente è lui) che l'ha scritto, un'altra mezz'ora o 2 ore, a seconda dell'induismo di Jun, per sistemarlo e debuggarlo.


 
Vladimir Simakov:

Sul male delle variabili globali e, per lo stesso motivo, dei campi pubblici di classe.

Ecco uno sguardo.

  1. C'è un progetto con un paio di centinaia di file di inclusione, con una dimensione totale di 200k linee (piccola, in realtà).
  2. Abbiamo un bug.
  3. Lo abbiamo localizzato. È causato da dati non validi in una variabile globale.
  4. La variabile globale è cambiata dal codice in 600 posti in 150 file include, in 200 posti è cambiata in un modo non banale - attraverso il passaggio per riferimento in una funzione. Beh, questo è il tipo di g...architetto che ha cucinato questo, e un gruppo di sfavoriti che l'ha scritto.
  5. La suddetta folla ha cercato un bug per un mese, non l'ha trovato, e il capo ha perso la testa, li ha licenziati tutti e ha chiamato seniora.
  6. Ha dato un'occhiata a questo casino e ha detto: 250k. di stipendio a me e 75k ciascuno ai miei due djun, e riscriviamo questa merda in sei mesi o la buttiamo via.

Ora la soluzione giusta: cambiare una variabile globale, se non riesci a liberarti di una stampella) solo attraverso una funzione.

  1. C'è un progetto con un paio di centinaia di file con una dimensione totale di 200k linee (piccolo, in realtà).
  2. Abbiamo un bug.
  3. Lo abbiamo localizzato. È legato a dati non validi in una variabile globale.
  4. La funzione di assegnazione del valore di una variabile è chiamata dal codice in 600 posti in 150 file include. Beh, questo è il d...r...o architetto che l'ha preparato, e il gruppo di sfigati che l'ha scritto, perché è comunque d...r...o.
  5. June ha inserito un breakpoint condizionale nella funzione e ha visto lo stato dello stack delle chiamate al momento dell'assegnazione dei valori non validi (2 min.).
  6. Poi i commenti impronunciabili di Jun sul lamer (molto probabilmente è lui) che l'ha scritto, un'altra mezz'ora o 2 ore, a seconda dell'induismo di Jun, per sistemarlo e debuggarlo.


Capito. Le variabili globali sono il male. Come dice il proverbio... "Ciò che è bene per il russo..." ))))
 
Vasiliy Sokolov:
No, non lo siamo. Questo esempio è di un OLP velato. E quello di cui stiamo discutendo qui è un sottoinsieme di esso. Cioè l'esempio mostra che ci sono alcune cose che normalmente possono essere risolte solo in OOP. Le funzioni da sole non saranno sufficienti. Quindi non è una contraddizione in sé, ma un compito a due stelle.
Ma questo è il livello di chi lascia la scuola, e per ora siamo al primo grado.
Giusto. Finché scriviamo programmi fino a ~3000 linee, possiamo tranquillamente usare le variabili globali. Poi, se Vladimir vuole passare a OOP, li abbandonerà). Giusto?
 
Реter Konow:
Giusto. Finché scriviamo programmi fino a ~3000 linee, possiamo tranquillamente usare le variabili globali. Poi, se Vladimir vuole passare a OOP, li abbandonerà). Giusto?

No, non lo è. Bisogna imparare fin dall'inizio) Ogni dichiarazione di una variabile globale (da non confondere con i parametri di input, anche se dovrebbero essere anch'essi più piccoli) dovrebbe essere chiaramente giustificata e fatta usando le dichiarazioni più poco lusinghiere (come underjunct vulgaris b...)

 
Vladimir Simakov:

No, non lo è. Bisogna imparare subito) Se si dice male, si intende male) Ogni dichiarazione di una variabile globale (da non confondere con i parametri di input, anche se dovrebbero essere anch'essi più piccoli) dovrebbe essere chiaramente giustificata e fatta usando le dichiarazioni più poco lusinghiere (tipo underdog vulgaris b...)

Ho letto tutti i messaggi sulle variabili globali e ho capito cosa volevano dirmi tutti i partecipanti a questa discussione. Imparerò a scrivere il codice del programma, cercando di non usare le variabili globali. Grazie a tutti per questi consigli costruttivi!

Saluti, Vladimir.

 
Реter Konow:
Capito. Le variabili globali sono il male. Come dice il proverbio... "Ciò che è bene per il russo..." ))))
In realtà non è il proverbio giusto. A proposito, per quanto riguarda il bere non sono più deboli di noi. Non si tratta di tedeschi, ma di anglosassoni in generale. Sono stato in giro, sai. Non dimenticherò mai quei vecchietti di lingua tedesca in Turchia. Bevevano dalle 9:00 alle 19:00 con una pausa per il pranzo, poi solo il bar della piscina chiudeva e continuavano verso altri. Comunque, ho guardato le dosi che stavano bevendo (Zadornov f...l.) e mi sono reso conto che nonostante la mia formazione di studente, che so fare, non avrei ricordato il pranzo a quel ritmo il giorno dopo).
 

Continuo a studiare il linguaggio di programmazione MQL5. Sto incollando di nuovo il codice rivisto dello script, tenendo conto dei consigli dei partecipanti a questo thread. Ho testato lo script in tutte le modalità. Nessun problema rilevato. Per cominciare ho applicato il numero minimo di parametri di input. Il codice dello script è scritto in inglese, i commenti al codice sono in russo, in modo che sia più facile da digerire. Come ho promesso prima, ho cercato di descrivere lo script in un modo comprensibile per uno studente di prima classe della scuola di programmazione.

Spero di aver fatto esattamente come mi è stato detto dai partecipanti a questo thread, ma potrei sbagliarmi.

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