MQL5におけるOOPに関する質問 - ページ 21

 
Alexey Navoykov:
純粋にテスト用のクラスなのか、本当に使うのか?
静的 変数は、私の記憶では、キャラクターが変わっても再初期化されません。
また、一般に、定数静止画を外部値で初期化することは、初期化時に必ずしも利用できるわけではありません。

第二に、私は自分自身のためにも、MT4の下でとにかく書いている - それはいくつかのシンボルのテスターで動作しません、私はMT4で便利なものを見れば、私はMT4Ordersを使ってMT5に切り替えます - 私はこのライブラリで問題なく私の "創作 "をチェックしました。

まず、ちゃんとしたOOPのアイデアを見たい。だから、何が出てくるかテストしているのですが、今のところかなり混乱しています...。時間があるので、自分で作った充電器です ))))


MQLでは、グローバルな可視性レベルでもすべてが常に利用可能で、ソースの人たちがそのままトップに行ってそのように書いているのを見ました。

#property strict
int    dig = _Digits;
double point = _Point;
double startbalance = AccountBalance();

そして、これらの誤った初期化は、ビルドからビルドへと何年も働き続けています。 一般に、開発者は人々を甘やかしています ))))




SZZY: ここでは一般的に、OOPを使うときはいつもそうですが、主なことは、問題を複雑な要素に正しく分割し、手元のすべてを継承しないことです。 私は、テキスト出力エラーをどこに「貼り付ける」のかわかりません。それは、あらゆるクラス、プログラムのあらゆる場所にあるべきです。

 
Igor Makanu:

ppの1月3日すべての解決可能な、しかし...OK、ここで静力学と助け、ヘルプがあるので、それがそうであるように、少なくとも彼の決定を正当化するために何か、今コードは次のとおりです。

Cdealのインスタンスを3つ作成し、ログを取得しました。

...

今のところ、すべて意図したとおりに動いています

また、この関数はクラスの外部で実装されているため、クラス内でフィールドの順序を制御することは困難です。 少なくとも、クラス内に「こういうフィールドは並べ替えてはいけない」という太字のコメントを書くべきでしょう)。でも、どうせなら最初のバリエーションが良かったですね。1行のコードを節約するためにセキュリティを犠牲にしてはいけません )
 
Alexey Navoykov:
しかし、いずれにしても、あなたのオリジナル版のほうがよかった。一行のコードを節約するために信頼性を犠牲にしてはいけない )

どれどれ- トピックの半分がバリエーションになってる ))))

が、うん、100%その通りだ!。

SZYです。

最もシンプルで確実な方法は、OnInit() で new を使ってクラスのインスタンスを作成し、ターミナルの環境変数をすべてすぐにコピーすることですが、これは最善の方法ではありません。この例でコンストラクタを起動したときにすぐに注文を開くつもりなら、このクラスのインスタンスはおそらく削除されて、再度作成されるかもしれません。一般に、この方法では解けません。


ZZZY: 多分、もう一日実験して、最終的には@Vladimir Simakov の 例を取るでしょう - そこではすべてが非常に明確です。

 
Igor Makanu:

フィールドを定数値で一度初期化する必要があるクラスをスケッチしてみたところ、意図したとおりに動作するようです。

私は2つのことが嫌いです。

1.初期化の順序が定義されていないため、SymbolInfoDouble(_Symbol,SYMBOL_VOLUME_STEP)を繰り返し呼び出す- VolumeSTEPが最初に初期化され、その後GetDigitsInVolumeStepが 呼ばれることが確実ではない、すなわち

2.静的メソッド static int GetDigitsInVolumeStep() 取り除きたい - youtubeで、純粋なOOPでは静的メソッドを使用すべきではないというビデオを見たので、今は風車と戦っています。

ビデオへのリンクは、基本的に同じものですhttps://youtu.be/lfdAwl3-X_chttps://youtu.be/zME4SOCHT0I


この2点をどのように書き直せばよいのでしょうか?

1.この関数を2回呼んでも何も問題はありません。

2.静的関数を使うことに反対している人たちが、微塵も反論しないことに戸惑いを感じないのでしょうか?

誰々のビデオを見るのではなく、本を読んだ方がいい。

 
Koldun Zloy:

2.静的関数の使用に反対している人たちが、微塵も反論しないことに戸惑いを感じないのでしょうか?

そして、あなたはビデオが実践から何も対応していないという私をサポートする最初の人です、私は別のスレッドでビデオについての私の意見を書いた - スピーカーは、学生の質問に答えることができませんでした。

 
Igor Makanu:

このビデオについて、私は別のスレッドで私の意見を書きました-レポーターは生徒の質問にさえ答えることができませんでした。

OOPは、ネットの口先だけの根拠のない定説に盲従して、自分の能力を削ることではなく、みんなが自分なりのやり方で掃除することだと思います。

 
Artyom Trishkin:

私は、OOPとは、インターネット上の一部の口先だけの根拠のない定説に盲従するために、自分の能力を低下させることではなく、誰もが自分なりのやり方で掃除することだと思います。

このビデオをご覧になった方は、ターゲットが・・・・・・と理解されるはずです。まあ、一般的には、あなたも何もわかっていないし、まだ十分に成熟していないのでしょう。

SZZ:後でちょっとインターフェースで実験してみます。"実体美 "が出てくるかもしれませんね )))。

 

彼の静力学のビデオを見たのは、すべてああいう書き方をするためだったんだ。

new Type0(new Type1(new Type2(...))); 

まあ、スタティックの上にラッパーを書くというのは問題ですよね。

class Stateless_with_state {
        Stateless q;
        Data d;
        call() {q::call(d);}
};

また、スルーテンプレートの方が明らかに効率的です。会場からの質問も良かったですねhttps://www.youtube.com/watch?v=75U9eefFYoU#t=33m25s

 
Igor Makanu:

ZS: あとでちょっとだけインターフェイスの実験をして、「実体美」が出てくるかもしれませんね )))

OOPパターン - Behavioural patterns - Strategy」が動作するか確認しました。

interface IStrategy
  {
   void Algorithm();
  };
//+------------------------------------------------------------------+
class Strategy_1 : public IStrategy
  {
public:
                     Strategy_1()   {Print(__FUNCTION__);}
   void              Algorithm()    {Print(__FUNCTION__);}
  };
//+------------------------------------------------------------------+
class Strategy_2 : public IStrategy
  {
public:
                     Strategy_2()   {Print(__FUNCTION__);}
   void              Algorithm()    {Print(__FUNCTION__);}
  };
//+------------------------------------------------------------------+
class Context
  {
private:
   IStrategy         *s;
public:
                     Context(IStrategy &_strategy) {Print(__FUNCTION__); s = GetPointer(_strategy); s.Algorithm();}
                    ~Context() {delete s;}
  };
//+------------------------------------------------------------------+
void OnStart()
  {
   Context c1(new Strategy_1);
   Context c2(new Strategy_2);
  }
//+------------------------------------------------------------------+

2019.08.31 21:04:40.441 tst (EURUSD,H1) Strategy_1::Strategy_1

2019.08.31 21:04:40.442 tst (EURUSD,H1) Context::Context

2019.08.31 21:04:40.442 tst (EURUSD,H1) Strategy_1::Algorithm

2019.08.31 21:04:40.442 tst (EURUSD,H1) Strategy_2::Strategy_2

2019.08.31 21:04:40.442 tst (EURUSD,H1) Context::Context

2019.08.31 21:04:40.442 tst (EURUSD,H1) Strategy_2::Algorithm


私見ですが、問題なく動作しています。

 
Igor Makanu:

OOPパターン - Behavioural Patterns - Strategy (戦略)」が動作するか確認しました。

2019.08.31 21:04:40.441 tst (EURUSD,H1) Strategy_1::Strategy_1

2019.08.31 21:04:40.442 tst (EURUSD,H1) Context::Context

2019.08.31 21:04:40.442 tst (EURUSD,H1) Strategy_1::Algorithm

2019.08.31 21:04:40.442 tst (EURUSD,H1) Strategy_2::Strategy_2

2019.08.31 21:04:40.442 tst (EURUSD,H1) Context::Context

2019.08.31 21:04:40.442 tst (EURUSD,H1) Strategy_2::Algorithm


は、私にとって何の問題もなく動作します。

Context(IStrategy* _strategy):s(_strategy){Print(__FUNCTION__); s.Algorithm();}

もちろん、開発者が暗黙のデリファレンスで失敗したために、このバージョンでは動作しているのですが、私は文書化されていないことにこだわるのはやめようと思っています。

2.確かにC++ではありませんが、非常に似ているので、初期化リスト(効率は分かりませんが)はコッソリあります。

理由: