mql5におけるOOP、テンプレート、マクロ、微妙な使い分け - ページ 5

 
pavlick_:

マルチパスについて-あわてて、MCLなら許されると甘く見ていた

つまり、ここには変数があるのです。そして、関数については、そう、マルチパス可能なので、すべて正しかったのです。 問題は、まさに関数の初期化の順序にあります。 つまり、C++では、変数、関数、型に関する厳格な順序がひとつあります。 そして、MQLでは、すべてが異なっているのです。
 
Alexey Navoykov:
Ну вот я с этого и начинал разговор тут. Планировал тоже заменять все статики на глобалы (хоть это и жесть конечно).  Но как показано выше, с шаблонами такое не прокатит.  С макросами тоже.  А я всё это широко применяю.  Поэтому и сделал свою реализацию.  Хотя она конечно не решает всех проблем.  Динамические массивы по-прежнему нельзя инициализировать, константные типы тоже.  Поэтому их однозначно придётся выносить на глобальный уровень

また、私はテンプレートやマクロを多用していますが、自由関数はあくまで補助的な(一般的には望ましくない)アーキテクチャの要素としてしか考えていません。すべての実装をオブジェクトの中に詰め込み、静的な宣言はクラスレベルでしか行わない場合、その正しい宣言の順序のロジックが理解できないことがあり、コンパイラが悪態をつかないようにする以外は、厄介なバグが発生します...

 
Alexey Navoykov:
つまり、ここには変数があるのです。そして、関数の場合は、そう、マルチパス可能なので、すべてが正しかったのです。 問題は、まさに関数の初期化の順序にあります。 つまり、C++では、変数、関数、型に適用される厳格な順序がひとつあります。 そしてMQLではすべてが異なっているのです。

再帰やデッドロックが発生する可能性があります。しかし、プラス面ではそれが可能なのです。したがって、賢明に、慎重に(つまり前方宣言)するのみであり、現在のマルチパスコンパイラのように、任意の関数に対して前方宣言がなされた場合、遅かれ早かれこの熊手はあなたの額にヒットします。

 
pavlick_:

マルチパスは、再帰やデッドロックなど、どのような場合でもよくありません。しかし、プラスアルファでフォワード宣言をすることは可能です。したがって、唯一の賢明な、慎重に、そしてmultipassコンパイラで今のようにしない - 任意の関数の前方宣言が行われているかのように、遅かれ早かれ、この熊手はあなたの額をヒットします。

私もそう思います。この話題は、先ほども少し触れました。関数の宣言の順番にこだわらないというのは、この言語の多くの人が好むところです。 もちろん、私自身も少し前までは喜んでいました)。 しかし、その面倒くささは、逆に私をイライラさせました。 しかし、経験を積めば理解できるようになるのです。

 
Ilya Malev:

また、私はテンプレートやマクロを多用していますが、自由関数はあくまで補助的な(一般的には望ましくない)アーキテクチャの要素としてしか考えていません。すべての実装をオブジェクトの中に詰め込み、静的な宣言はクラスレベルでしか行わない場合、その正しい宣言の順序のロジックが理解できないことがあり、コンパイラが悪態をつかないようにする以外は、厄介なバグが発生します...

しかし、C++とC#のハイブリッドが未発達なため、多くのことを松葉づえで実装しなければならないのです )
 
Alexey Navoykov:
そうですね、OOPですべてが明確に並んでいれば、フリー関数だけでなく、テンプレートメソッドも不要になりますね。

テンプレートメソッドは、OOPでも非ODOPでも、反復的なコードを大量に書きたくない場合に必要とされます。自由関数はまた別の問題で、これらは異なるプログラミングスタイルです。

 
Ilya Malev:

テンプレートメソッドは、OOPであろうと非ODOPであろうと、反復的なコードを大量に書きたくない場合に必要とされるものです

OOPでは、これを実現するためにインターフェイスが設計されています。
 
Alexey Navoykov:
OOPでは、この目的のためにインターフェイスが考案された。

インターフェイスはちょっと違いますね。もし私が、パラメータクラスによって異なる型を持つ同じコードを(追加のクラスを宣言することなく)行いたい場合、インターフェースは役に立ちません。

 
Ilya Malev:

インターフェイスは少し違います。もし私が、同じコードで、パラメータクラスによって異なる型を持つ同じ仕事をしたい場合(追加のクラスを宣言することなく)、インターフェースは役に立ちません。

もしパラメータが異なる型であれば、対応する型を持つオーバーロードされたメソッドを いくつか作るのが理にかなっています。 それでも、関数内で何らかの方法でそれらを分ける必要があります。 つまり、非人称型も取るような混乱を作るよりは、別々の関数に分ける方が良いのです。間違って何でも渡して、ライブラリ内でコンパイルエラーになるのは良くありません。 そして多分そうではないので、二重に悪いのです)。

つまり、本格的なOOPでは、テンプレート関数は(一部の例外を除いて)松葉づえなのです。

 
Alexey Navoykov:


つまり、テンプレート関数は、本格的なOOPでは松葉づえのような ものなのです。

それで、こうなりました。

トレーディング、自動売買システム、トレーディング戦略のテストに関するフォーラム

mql5言語の特徴、TipsとTricks

アレクセイ・ナヴォイコフ 2019.01.25 10:11

まあ、そんなこんなで、ここで 話を始めました。私もスタティックはすべてグローバルに置き換えるつもりでした(もちろん残酷なことですが)。 しかし、上記のように、テンプレートや マクロも使えません。 そして、私はそれらをすべて広く使って います。動的配列はまだ初期化できないし、定数型も初期化できない。 だから、グローバル化する必要があるんだ。
つまり、あなたのコードはすべて松葉杖で作られていることが判明したわけですね。個人的なことではないんです。