MQL5言語をゼロから独学で学ぶ - ページ 46

 
ところで、私は自分の挑戦にチェックメイトを与えるような例を知っています。でも、理由は明白なので、書きません。
 
Vasiliy Sokolov:
ところで、私は自分の挑戦にチェックメイトを与えるような例を知っています。でも、理由は明白なので、書きません。
さあ、始まるぞ......))))
 
Реter Konow:
出航しました......))))
いや、出航していないんです。その例は、ベールに包まれたPLOのものです。そして、ここで議論しているのは、そのサブセットなのです。つまり、この例は、OOPでなければ普通に解決できないことがあることを示しているのです。機能だけでは物足りないでしょう。だから、それ自体は矛盾ではなく、2つ星の問題なんです。
でも、それはスクールリーバーレベルで、今のところは小学1年生です。
 

グローバル 変数の悪について、そして同じ意味で、パブリッククラスのフィールドについて。

ここでは、その様子をご紹介します。

  1. 数百のインクルードファイルがあるプロジェクトがあり、合計サイズは20万行(実際には小さい)。
  2. バグが発生しました。
  3. ローカライズしました。グローバル変数のデータが無効であることが原因です。
  4. グローバル変数は、150のインクルードファイルの600の場所でコードによって変更され、200の場所では、関数への参照渡しという自明でない方法で変更されています。まあ、そういうg...アーキテクトが料理して、下っ端が書いたんだろうけど。
  5. 前述の群衆は1ヶ月間バグを探し、見つからず、ボスは全員をクビにし、シニアラを呼びました。
  6. この惨状を見て、彼は言った。私に25万ドル、二人の弟に7万5千ドル、半年で書き換えるか捨てるかだ。

今すぐ正しい解決策:グローバル変数を変更し、あなたが離れて松葉杖から得ることができない場合)唯一の関数を介して。

  1. 総サイズが200k行の数百のファイルを持つプロジェクトがあります(実際にはとても小さい)。
  2. バグが発生しました。
  3. ローカライズしました。グローバル変数のデータが無効であることに関連します。
  4. 変数の値を代入する機能は、150のインクルードファイルの600箇所でコードから呼び出されている。まあ、それは料理した建築家と、書いた下っ端が、どうせダ...ル...オなんだから。
  5. Juneは関数に条件付きブレークポイントを挿入し、無効な値を代入した時点のコールスタックの状態を見た(2分)。
  6. そして、それを書いた淳のヘタレ(最も可能性が高い)な発言、さらに淳のヒンシュクを買って30分~2時間、修正とデバッグにかかる。


 
Vladimir Simakov:

グローバル 変数の悪について、そして同じ意味で、パブリッククラスのフィールドについて。

ここでは、その様子をご紹介します。

  1. 数百のインクルードファイルがあるプロジェクトがあり、合計サイズは20万行(実際には小さい)。
  2. バグが発生しました。
  3. ローカライズしました。グローバル変数のデータが無効であることが原因です。
  4. グローバル変数は、150のインクルードファイルの600の場所でコードによって変更され、200の場所では、関数への参照渡しという自明でない方法で変更されています。まあ、そういうg...アーキテクトが料理して、下っ端が書いたんだろうけど。
  5. 前述の群衆は1ヶ月間バグを探し、見つからず、ボスは正気を失い、全員を解雇し、シニアラを呼びました。
  6. この惨状を目の当たりにして、彼は言った。私に25万ドル、二人の弟に7万5千ドル、半年で書き換えるか捨てるかだ。

今すぐ正しい解決策:グローバル変数を変更し、あなたが離れて松葉杖から得ることができない場合)唯一の関数を介して。

  1. 総サイズが200k行の数百のファイルを持つプロジェクトがあります(実際にはとても小さい)。
  2. バグが発生しました。
  3. ローカライズしました。グローバル変数のデータが無効であることに関連します。
  4. 変数の値を代入する機能は、150のインクルードファイルの600箇所でコードから呼び出されている。まあ、それは料理した建築家と、書いた下っ端が、どうせダ...ル...オなんだから。
  5. Juneは関数に条件付きブレークポイントを挿入し、無効な値を代入した時点のコールスタックの状態を見た(2分)。
  6. そして、それを書いたJunの言いようのない発言、Junのヒンドゥスター性にもよるが、さらに30分〜2時間、修正とデバッグにかかる。


了解です。グローバル変数は邪道諺にもあるように..."ロシア人のためになることを..." ))))
 
Vasiliy Sokolov:
いいえ、そうではありません。この例は、ベールに包まれたPLOのものです。そして、ここで議論しているのは、そのサブセットなのです。つまり、この例は、OOPでなければ普通に解決できないことがあることを示しているのです。機能だけでは物足りないでしょう。だから、それ自体は矛盾ではなく、二つ星の課題なのです。
でも、それは学校を卒業した人のレベルであって、今のところは中学1年生なんです。
そうですね。3000行程度までのプログラムであれば、安全にグローバル変数を使用することができます。そして、VladimirがOOPに切り替えたいと思えば、それらを放棄することになる)。そうだろ?
 
Реter Konow:
そうですね。3000行程度までのプログラムであれば、安全にグローバル変数を使用することができます。そして、VladimirがOOPに切り替えたいと思えば、それらを放棄することになる)。そうだろ?

いいえ、そんなことはありません。グローバル変数(入力パラメータと混同しないように、入力パラメータも小さくすべきですが)の宣言はすべて明確に正当化し、最も好ましくない文(underjunct vulgaris bのように...)を使用して行わなければなりません。)

 
Vladimir Simakov:

いいえ、そんなことはありません。すぐに学ばなければならない)悪と言えば悪だ)グローバル変数(入力パラメータと混同しないように、それらも小さくするべきだが)の宣言はすべて、明確に正当化し、最も不愉快な文(アンダードック下品bのように)を使って行わなければならない。

グローバル変数に関するすべてのメッセージを読み、この議論の参加者全員が私に言いたかったことを理解しました。グローバル変数を使わないようにしながら、プログラムコードの書き方を学んでいきます。皆さん、このような建設的なアドバイスをありがとうございました

ウラジミールさん、ありがとうございます。

 
Реter Konow:
了解です。グローバル変数は邪道諺にもあるように..."ロシア人のためになることを..." ))))
実は正しいことわざではないんです。ちなみに、お酒を飲むという点では、彼らは我々より弱くはありません。ドイツ人のことではなく、アングロサクソン全般のことです。私は、その辺にいるんですよ。トルコのドイツ語圏のおじいちゃんたちのことが忘れられない。9時から19時まで、昼食の休憩をはさんで、プールバーだけが閉まり、他の店に移っていくのだ。とにかく、彼らが飲んでいた用量(Zadornov f..l.)を見て、どうすればいいか知っている学生時代にもかかわらず、翌日その調子で昼食を覚えていなかっただろうと悟った)。
 

プログラミング言語「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);    //возвращаем значение "достаточно терпения" в функцию "имею терпение"
  }
//+------------------------------------------------------------------+