Die Sprache MQL5 von Grund auf selbst erlernen - Seite 46

 
Übrigens kenne ich ein Beispiel, das mich in meiner eigenen Herausforderung schachmatt setzen würde. Aber ich werde nicht darüber schreiben, aus offensichtlichen Gründen.
 
Vasiliy Sokolov:
Übrigens kenne ich ein Beispiel, das mich in meiner eigenen Herausforderung schachmatt setzen würde. Aber ich werde nicht darüber schreiben, aus offensichtlichen Gründen.
Hier geht's....))))
 
Реter Konow:
Gesegelt....))))
Nein, wir sind nicht gesegelt. Dieses Beispiel stammt von einer verschleierten PLO. Und das, was wir hier diskutieren, ist eine Teilmenge davon. D.h. das Beispiel zeigt, dass es einige Dinge gibt, die normalerweise nur in OOP gelöst werden können. Die Funktionen allein werden nicht ausreichen. Es handelt sich also nicht um einen Widerspruch an sich, sondern um ein Zwei-Sterne-Problem.
Aber das ist das Niveau eines Schulabgängers, und im Moment sind wir in der ersten Klasse.
 

Über das Übel der globalen Variablen und damit auch der öffentlichen Klassenfelder.

Hier ist ein Blick darauf.

  1. Es gibt ein Projekt mit ein paar hundert Include-Dateien, Gesamtgröße 200k Zeilen (klein, eigentlich).
  2. Wir haben einen Fehler.
  3. Wir haben es lokalisiert. Die Ursache sind ungültige Daten in einer globalen Variable.
  4. Die globale Variable wird durch Code an 600 Stellen in 150 Include-Dateien geändert, an 200 Stellen wird sie auf nicht triviale Weise geändert - durch Übergabe per Referenz in eine Funktion. Nun, das ist die Art von G...architekt, der dies ausgeheckt hat, und eine Gruppe von Außenseitern, die es geschrieben hat.
  5. Die oben erwähnte Gruppe suchte einen Monat lang nach einem Fehler, fand ihn nicht, woraufhin der Chef sie alle entließ und Seniora anrief.
  6. Er schaute sich dieses Durcheinander an und sagte: 250k. Gehalt für mich und je 75k. für meine beiden DJs, und wir schreiben den Scheiß in sechs Monaten neu oder werfen ihn weg.

Jetzt die richtige Lösung: Ändern Sie eine globale Variable, wenn Sie nicht von einer Krücke wegkommen können) nur durch eine Funktion.

  1. Es gibt ein Projekt mit ein paar hundert Dateien mit einer Gesamtgröße von 200k Zeilen (so klein, eigentlich).
  2. Wir haben einen Fehler.
  3. Wir haben es lokalisiert. Dies hängt mit ungültigen Daten in einer globalen Variablen zusammen.
  4. Die Funktion der Zuweisung eines Variablenwerts wird vom Code an 600 Stellen in 150 Include-Dateien aufgerufen. Nun, das ist der d...r...ing Architekt, der es ausgeheckt hat, und eine Gruppe von Underdogs, die es geschrieben hat, weil es sowieso d...r...o ist.
  5. June fügte einen bedingten Haltepunkt in die Funktion ein und sah den Zustand des Aufrufstapels zum Zeitpunkt der Zuweisung ungültiger Werte (2 Min.).
  6. Dann Juns undruckbare Bemerkungen über den Lahmarsch (wahrscheinlich ist er es), der es geschrieben hat, eine weitere halbe bis zwei Stunden, je nach Juns Hindusein, zur Fehlersuche und -beseitigung.


 
Vladimir Simakov:

Über das Übel der globalen Variablen und damit auch der öffentlichen Klassenfelder.

Hier ist ein Blick darauf.

  1. Es gibt ein Projekt mit ein paar hundert Include-Dateien, Gesamtgröße 200k Zeilen (klein, eigentlich).
  2. Wir haben einen Fehler.
  3. Wir haben es lokalisiert. Die Ursache sind ungültige Daten in einer globalen Variable.
  4. Die globale Variable wird durch Code an 600 Stellen in 150 Include-Dateien geändert, an 200 Stellen wird sie auf nicht triviale Weise geändert - durch Übergabe per Referenz in eine Funktion. Nun, das ist die Art von G...architekt, der dies ausgeheckt hat, und eine Gruppe von Außenseitern, die es geschrieben hat.
  5. Die oben erwähnte Gruppe suchte einen Monat lang nach einem Fehler, fand ihn nicht, woraufhin der Chef den Verstand verlor, sie alle feuerte und Seniora anrief.
  6. Er schaute sich das Durcheinander an und sagte: 250k. Gehalt für mich und je 75k. für meine beiden DJs, und wir schreiben den Scheiß in sechs Monaten neu oder werfen ihn weg.

Jetzt die richtige Lösung: Ändern Sie eine globale Variable, wenn Sie nicht von einer Krücke wegkommen können) nur durch eine Funktion.

  1. Es gibt ein Projekt mit ein paar hundert Dateien mit einer Gesamtgröße von 200k Zeilen (eigentlich klein).
  2. Wir haben einen Fehler.
  3. Wir haben es lokalisiert. Dies hängt mit ungültigen Daten in einer globalen Variablen zusammen.
  4. Die Funktion der Zuweisung eines Variablenwerts wird von Code an 600 Stellen in 150 Include-Dateien aufgerufen. Nun, das ist der d...r...ing Architekt, der es ausgeheckt hat, und eine Gruppe von Underdogs, die es geschrieben hat, weil es sowieso d...r...o ist.
  5. June fügte einen bedingten Haltepunkt in die Funktion ein und sah den Zustand des Aufrufstapels zum Zeitpunkt der Zuweisung ungültiger Werte (2 Min.).
  6. Dann Juns undruckbare Bemerkungen über den Lahmarsch (wahrscheinlich ist er es), der es geschrieben hat, eine weitere halbe Stunde bis 2 Stunden, je nach Juns Hindustanität, um es zu reparieren und zu debuggen.


Ich hab's. Globale Variablen sind böse. Wie man so schön sagt... "Was gut für den Russen ist..." ))))
 
Vasiliy Sokolov:
Nein, das tun wir nicht. Dieses Beispiel stammt von einer verschleierten PLO. Und das, was wir hier diskutieren, ist eine Teilmenge davon. D.h. das Beispiel zeigt, dass es einige Dinge gibt, die normalerweise nur in OOP gelöst werden können. Die Funktionen allein werden nicht ausreichen. Es handelt sich also nicht um einen Widerspruch an sich, sondern um eine Zwei-Sterne-Aufgabe.
Aber das ist das Niveau eines Schulabgängers, und im Moment sind wir in der ersten Klasse.
Richtig. Solange wir Programme mit bis zu ~3000 Zeilen schreiben, können wir sicher globale Variablen verwenden. Wenn Vladimir dann auf OOP umsteigen will, wird er sie aufgeben). Oder?
 
Реter Konow:
Richtig. Solange wir Programme mit bis zu ~3000 Zeilen schreiben, können wir sicher globale Variablen verwenden. Wenn Vladimir dann auf OOP umsteigen will, wird er sie aufgeben). Oder?

Nein, das ist es nicht. Jede Deklaration einer globalen Variable (nicht zu verwechseln mit den Eingabeparametern, obwohl auch diese kleiner sein sollten) sollte klar begründet werden und mit den unschmeichelhaftesten Ausdrücken erfolgen (wie underjunct vulgaris b...)

 
Vladimir Simakov:

Nein, das ist es nicht. Jede Deklaration einer globalen Variable (nicht zu verwechseln mit Eingabeparametern, obwohl auch diese kleiner sein sollten) sollte klar begründet werden und mit den unschmeichelhaftesten Aussagen (wie Underdog vulgaris b...) erfolgen.)

Ich habe alle Nachrichten über globale Variablen gelesen und verstanden, was alle Teilnehmer dieser Diskussion mir sagen wollten. Ich werde lernen, wie man Programmcode schreibt und dabei versuchen, keine globalen Variablen zu verwenden. Ich danke Ihnen allen für diese konstruktiven Ratschläge!

Mit freundlichen Grüßen, Vladimir.

 
Реter Konow:
Ich hab's. Globale Variablen sind böse. Wie man so schön sagt... "Was gut für den Russen ist..." ))))
Es ist eigentlich nicht das richtige Sprichwort. Übrigens sind sie, was den Alkoholkonsum angeht, nicht schwächer als wir. Es geht nicht um die Deutschen, sondern um die Angelsachsen im Allgemeinen. Ich bin herumgekommen, wissen Sie. Ich werde diese deutschsprachigen alten Männer in der Türkei nie vergessen. Sie tranken von 9:00 bis 19:00 Uhr mit einer Mittagspause, dann schloss nur die Poolbar und sie gingen weiter zu anderen. Jedenfalls sah ich mir die Dosen an, die sie tranken (Zadornov f...l.), und mir wurde klar, dass ich mich trotz meines studentischen Hintergrunds, mit dem ich mich auskenne, am nächsten Tag nicht mehr an das Mittagessen in dieser Menge erinnert hätte.)
 

Ich lerne weiter die Programmiersprache MQL5. Ich füge den überarbeiteten Code des Skripts noch einmal ein und berücksichtige dabei die Tipps der Teilnehmer dieses Threads. Ich habe das Skript in allen Modi getestet. Keine Probleme festgestellt. Zunächst habe ich die minimale Anzahl von Eingabeparametern verwendet. Der Skriptcode ist auf Englisch geschrieben, die Kommentare zum Code sind auf Russisch, damit er leichter zu verstehen ist. Wie ich vorhin versprochen habe, habe ich versucht, das Skript so zu beschreiben, dass es für einen Schüler der 1. Klasse der Programmierschule verständlich ist.

Ich hoffe, ich habe genau das getan, was mir von den Teilnehmern dieses Threads gesagt wurde, aber ich könnte mich irren.

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