从头开始自学MQL5语言 - 页 46

 
顺便说一句,我知道一个例子,它可以让我在自己的挑战中获得将牌。但我不会写它,原因很明显。
 
Vasiliy Sokolov:
顺便说一句,我知道一个例子,它可以让我在自己的挑战中获得将牌。但我不会写它,原因很明显。
在这里,我们去....))))
 
Реter Konow:
帆船....))))
不,我们还没有出海。这个例子是来自一个有面子的巴解组织。而我们在这里讨论的是它的一个子集。也就是说,这个例子表明,有些事情通常只有在OOP中才能解决。仅有功能是不够的。所以它本身并不矛盾,而是一个二星的问题。
但那是学校毕业生的水平,现在我们是一年级。
 

关于全局变量 的邪恶,同理,公共类的字段也是如此。

下面我们来看看。

  1. 有一个项目有几百个包含文件,总大小为20万行(实际上很小)。
  2. 我们有一个错误。
  3. 我们已经将其本地化。这是由全局变量中的无效数据引起的。
  4. 全局变量在150个包含文件中的600个地方被代码改变,在200个地方被以非微妙的方式改变--通过引用传递到一个函数。好吧,这就是那种炮制了这个的G......建筑师,以及一群写了这个的劣等生。
  5. 上述人群找了一个月的错误,没有找到,老板就失去了理智,把他们都开除了,并打电话给seniora。
  6. 他看着这一团乱麻,说。我的工资是25万,我的两个助手各7.5万,我们将在6个月内重写这些东西,否则就把它扔掉。

现在正确的解决方案是:改变一个全局变量,如果你不能摆脱拐杖)只能通过一个函数。

  1. 有一个项目有几百个文件,总大小为20万行(实际上很小)。
  2. 我们有一个错误。
  3. 我们已经将其本地化。这与全局变量中的无效数据有关。
  4. 为变量赋值的功能在150个include文件的600个地方被代码调用。好吧,那是煮出来的建筑师和写出来的那群下等人,因为无论如何都是D......R......O。
  5. June在该函数中插入了一个条件断点,并看到了在分配无效值时调用堆栈的状态(2分钟)。
  6. 然后俊哥对写这篇文章的蹩脚的人(很可能是他)说了一些不可告人的话,又花了半个小时到两个小时(取决于俊哥的印度教)来修复和调试它。


 
Vladimir Simakov:

关于全局变量 的邪恶,同理,公共类的字段也是如此。

下面我们来看看。

  1. 有一个项目有几百个包含文件,总大小为20万行(实际上很小)。
  2. 我们有一个错误。
  3. 我们已经将其本地化。这是由全局变量中的无效数据引起的。
  4. 全局变量在150个包含文件中的600个地方被代码改变,在200个地方被以非微妙的方式改变--通过引用传递到一个函数。好吧,这就是那种炮制了这个的G......建筑师,以及一群写了这个的劣等生。
  5. 前面提到的那群人找了一个月的错误,没有找到,老板就失去了理智,解雇了所有人,并打电话给seniora。
  6. 他看着这一团乱麻,说。我的工资是25万,我的两个助手各7.5万,我们将在6个月内重写这些东西,否则就把它扔掉。

现在正确的解决方案是:改变一个全局变量,如果你不能摆脱拐杖)只能通过一个函数。

  1. 有一个项目有几百个文件,总大小为20万行(实际上很小)。
  2. 我们有一个错误。
  3. 我们已经将其本地化。这与全局变量中的无效数据有关。
  4. 为变量赋值的功能在150个include文件的600个地方被代码调用。好吧,那是煮出来的建筑师和写出来的那群下等人,因为无论如何都是D......R......O。
  5. June在该函数中插入了一个条件断点,并看到了在分配无效值时调用堆栈的状态(2分钟)。
  6. 然后是俊哥对写这篇文章的那个蹩脚的人(很可能是他)的不可告人的言论,再过半个小时到两个小时,取决于俊哥的印度斯坦,来修复和调试它。


明白了。全局变量是邪恶的。俗话说..."什么对俄罗斯人有利......" ))))
 
Vasiliy Sokolov:
不,我们没有。这个例子是来自一个带着面纱的巴解组织。而我们在这里讨论的是它的一个子集。也就是说,这个例子表明,有些事情通常只有在OOP中才能解决。仅有功能是不够的。因此,它本身并不是一个矛盾,而是一个二星级的任务。
但这是离校生的水平,而现在我们还在一年级。
对。只要我们写的程序不超过~3000行,我们就可以安全地使用全局变量。然后,如果弗拉基米尔想换成OOP,他就会放弃它们)。对吗?
 
Реter Konow:
对。只要我们写的程序不超过~3000行,我们就可以安全地使用全局变量。然后,如果弗拉基米尔想换成OOP,他就会放弃它们)。对吗?

不,不是的。你必须从一开始就学会)全局变量 的每一个声明(不要与输入参数混淆,尽管它们也应该更小)都应该有明确的理由,并使用最不讨好的语句(如underjunct vulgaris b...)

 
Vladimir Simakov:

不,不是的。你必须马上学会)如果你说邪恶,就是邪恶)每一个全局变量的 声明(不要与输入参数混淆,虽然它们也应该更小)都应该有明确的理由,并使用最不光彩的语句(如underdog vulgaris b。)

我阅读了所有关于全局变量的信息,并理解了所有参与讨论的人想对我说的话。我将学习如何编写程序代码,同时尽量不使用全局变量。谢谢大家的建设性意见

问候,弗拉基米尔。

 
Реter Konow:
明白了。全局变量是邪恶的。俗话说..."什么对俄罗斯人有利......" ))))
这其实是不对的谚语。顺便说一下,在喝酒方面,他们并不比我们弱。这不是关于德国人,而是关于一般的盎格鲁-撒克逊人。我一直在附近,你知道。我永远不会忘记那些在土耳其讲德语的老人。他们从9:00喝到19:00,中午休息一下,然后只是泳池酒吧会关闭,他们继续去其他地方。总之,我看了看他们喝的剂量(Zadornov f...l.),意识到尽管我有学生背景,我知道如何做,但我不会在第二天以这种速度记住午餐)。
 

我继续学习MQL5编程语言。我再次粘贴了修改后的脚本代码,其中考虑到了本主题参与者的提示。我已经在所有模式下测试了该脚本。没有发现问题。首先,我应用了最小数量的输入参数。脚本代码是用英语写的,对代码的评论是用俄语写的,这样更容易消化。正如我之前所承诺的,我试图以一个编程学校的一级学生可以理解的方式来描述这个脚本。

我希望我完全按照这个主题的参与者告诉我的那样做,但我可能是错的。

问候,弗拉基米尔。

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