記事"MQL5 でのアサーション"についてのディスカッション - ページ 2

 
Sergey Eremin:

TEST_TEXTを条件付きコンパイルで本当に簡単に削除できるようにするには、Printsをマクロの中に移動することを考えます。現在のバージョンでは、TEST_TEXTを削除するのは簡単ですが、Prints自体を削除するのは簡単ではないと思います。

セルゲイ、そのことは考えたよ。ただ、あまり考えていなくて、まだ「手をつけていない」だけかもしれません。

単純に、状況やcomment()によっては、例えばAlert( )Print()の 代わりにテスト情報出力のソースとして使うことができます(行を見る必要なしに何かについてのプロンプト通知を持つために、そして、とりわけ、それが迷惑でなく、そして/または、それが "part "しないことが分かっている場合)。

そういうわけで、当面は以下のようにしている:

  • もしコード中に#define cキーワードがある場合は、#defineをコメントアウトするか削除すればよい;
  • もし#define with keywordsがインクルード・ファイルに記述されている場合は、インクルード・ファイルに関する行をコメントアウトするか削除すればよい(私はインクルード・ファイルに関するオプションの方が好きかもしれない)、

そうすれば、コンパイラーは動作不能になった行についてすぐに教えてくれる。また、検索をかけたとしても、MetaEditorパネルのボタンを押せば、その時点で不要な行を完全にコメントアウトすることができる。

しかし、何か普遍的なバリアントがあったほうがいいということには同意する。

 
Dina Paches:
そうだね、セルゲイ。ただ、あまり考えていなくて、まだ「手をつけていない」だけかもしれません。

ただ、状況やcomment()によっては、例えばPrint()の 代わりにAlert( )を テスト情報の出力元として使うことも(とりわけ迷惑でなければ)可能だということです。

だから今のところは、そう仮定している:

  • もし#define cキーワードがコードに含まれていたら、#defineをコメントアウトするか削除すればよい;
  • もし#define with keywordsがインクルード・ファイルの中にある場合は、そのインクルード・ファイルの行をコメントアウトするか削除すればいい(インクルード・ファイルのオプションの方が好きかもしれない)、

そうすれば、コンパイラーはすぐに操作不能になった行について教えてくれる。

しかし、ある普遍的な変形を形成する方が良いのは同意する。

原則的には、このアプローチは、無関係なプリントからコードを完全にクリーンにするのに役立ちます。確かに、必要なさそうなPrintsが、数ヶ月後にまた必要になることはよくあることだ。)

しかし、そのような場合は、git/svnから必要なバージョンにロールバックすることができます(svnの特別なケースとして -MQL5 Storage)。

 
Sergey Eremin:

原理的には、そうだ。この方法は、無関係なプリントからコードを完全に一掃するのに役立つ。しかし、もう必要ないと思っていたのに、数ヶ月後にまた必要になることはよくあることです :)。

しかしそのような場合、git/svnから必要なバージョンにロールバックすることができます(svnの特殊なケースとして -MQL5 Storage)。

あなたの返信をまだ見ていなかったので、それを明確にするために私の投稿に追加しました。しかし、意味としては変わっておらず、あなたが言ったことと対立するものではありません。

はい...、その通りです。)そして、これらのラインはすでに作業バージョンで「クリーンアップ」されており、以前のものにロールバックすることは必ずしも合理的とは限らない。

 
Sergey Eremin:
しかし、原則的には、必要であれば、「テスト」チェックの数は、ゼロからコードを構築する場合よりも明らかに少なくすることができる。しかし、繰り返すが、これは自分でコードを書き、自分でそれを改良/修正する人の視点からの判断である。つまり、かなり視野が狭い。
 
Sergey Eremin:

追伸:「検索...」という意味ではなく、「指定された行に移動する」とか「ファイル内の関数をリストアップする」という意味であることを明確にしておきたいと思います。

P./S.:しかし、記事に戻ると、もう一度、あなたが記事で引用しているようなステートメントを適用する機能は非常に興味深かったです。ありがとう。

 
Dina Paches:

同時に、assert.mqh ファイルをダウンロードし、そこに1行追加した:

そして、コードではこうなっている:

  Print(TEST_TEXT,"a = ",a);

つまり、コードを構築するときに、「作業中」の情報の出力を、コードの作業が終わるまでに簡単に削除できることを期待して、その情報を適用するのである(多くの人が、おそらくコード構築の段階で情報の出力を行っていると思う)。

このマクロも役に立つかもしれない

#define  PRINT(x)  Print(#x,"=",x)
//+------------------------------------------------------------------+
//| スクリプト番組開始機能|
//+------------------------------------------------------------------+
void OnStart()
  {
//---
   PRINT(ORDER_TYPE_BUY_STOP_LIMIT);
   PRINT(ORDER_TYPE_SELL_STOP_LIMIT);
   PRINT(ORDER_POSITION_ID);
   PRINT(POSITION_TYPE_BUY);
   PRINT(POSITION_TYPE_SELL);
   
   PRINT(POSITION_TIME);
   PRINT(POSITION_TIME_MSC);
   PRINT(POSITION_TIME_UPDATE);
   PRINT(POSITION_TIME_UPDATE_MSC);
   PRINT(POSITION_TYPE);
   PRINT(POSITION_MAGIC);
   PRINT(POSITION_IDENTIFIER);
 
Rashid Umarov:

このマクロも役に立つかもしれない。

ところで、#と複数行マクロについてのドキュメントを追加するのがいいと思う。C言語を学んだことのない人は、記事やコメントのコードに少し戸惑うかもしれない :)
 
Rashid Umarov:

このマクロは役に立つかもしれない

ありえないけど、本当にこんなものが家庭には必要なのだ。ありがとう。

あなたは、"肉 "を構築するための良い基礎を与えてくれる。とりわけ、天才は単純であることを改めて確認した。

そして、セルゲイはおそらくこんなことを 言いたかったのだろう。

しかし、このような構築に関して、私はまだ多くのことを理解/熟知する必要がある。

とりわけ、印刷の前にデータ変換を適用する場合(印刷だけでなく、コメントやアラートでの印刷も考慮に入れる)。そして、例えばDoubleToStringやTimeToStringに対して変数名が視覚的に失われないようにすること。

つまり、例えば今はこう書いている:

#define  TEST_PRINT(x)   Print(__LINE__,", ",__FUNCTION__,", ",#x,"=",x)
#define  TEST_COMMENT(x) Comment(__LINE__,", ",__FUNCTION__,", ",#x,"=",x)
#define  TEST_ALERT(x)   Alert(__LINE__,", ",__FUNCTION__,", ",#x,"=",x)

エキスパート・タブでは、このように表示される:


そして、チャート上にも同じコメントが表示されます。

つまり、変数price_0は DoubleToStringに対して "失われる"。

しかし、このようなテスト文字列の#define出力を使ったコードでは、先にここであげたよりも すでに簡単です。まだベストな選択肢とは言えないが。


P./S.: 今思ったのですが、変換関数の適用も出力され、テストテキストではっきり見えるということは、逆に便利かもしれません。一般的には、変数名が失われるというほどではありません。ただ、以前は自分では想定していなかったし、情報を出力するときに目にとって普通ではなかったからだ。


Sergey Eremin:
ところで、#と複数行マクロに関するドキュメントを追加するのがいいと思います。C言語を学んだことのない人は、記事やコメントのコードに少し戸惑うかもしれません :)。
それは素晴らしいことだ。
 
P./S.:出力を見れば見るほど、そうだ、あるフォーマットから別のフォーマットにデータを変換 する出力や関数は、テスト記録では間違いなく便利なのだとわかってきた。ただ、これを可能な限り最適化することが問題なんだ。
 
Andrey Shpilev:

1.なぜマクロなのか?マクロは不便だし、すべての条件を入力できるわけではない。些細なプロシージャを実装する方が簡単だった。

マクロしか選択肢がない場合である。