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

 
Dmitry Fedoseev:

const - 変数の代入を禁止する必要がある場合(初期化時に一度だけ例外あり)。変数がconstと宣言されている場合、それを関数に参照渡しするとき、関数の引数もconstでなければなりませんが、コンパイラが強制的にそうしてくれるので、考える必要はないでしょう。変数が代入されない場合、constとしてマークすることもできます - より速く動作します、これは関数の引数にも適用されます。しかし、いつ何時、修正が必要になるかもしれない...。

static - クラスの変数であれば、さらにレアケースです。クラスメソッドであれば、このメソッドの引数とクラスの静的変数の みを扱うのであれば、それもレアケースです(ただし、便宜上、関数をクラスに集めているだけなら、そう珍しいことではありません)。

MQL5用のC# DLLはまだ試せていません。以前はC++のラッパーを使い、C#でクラスインスタンスを作っていました。このDLLはこれからスタティッククラスを使うので、選択肢が著しく制限されるのではないかという疑念があります。今、スタティッククラスが作られているのか、ダイナミッククラスが作られているのか、ご存知の方はいらっしゃいますか?

 
Alexey Volchanskiy:

MQL5用のC# DLLはまだ試していません。以前はC++のラッパーでやっていましたが、プラス面ではC#でクラスのインスタンスが作成されました。今、DLLは静的なクラスを使うので、その可能性を著しく制限しているのではないかという疑念があります。今、スタティッククラスを作成しているのか、ダイナミッククラスを作成しているのか、ご存知の方はいらっしゃいますか?

MQL5ではstaticしか使ったことがないのですが、staticモディファイアを 使うと、MUから直接署名が見えるようになり、非常に便利です。

制約については、タスクを別スレッドに投げてから釘を打てば、C#では非常に高速に実行できます。

またはDLL内のコールを書き込む

なんてことない


UPDです。

MQLタスクにOOPを使用する根拠について、最近の私の研究を説明することはできませんが、私が見たものをお伝えします。

一般に、OOPスタイルでアクセス制御を徹底し、 private/protected/publicの修飾子をすべて設定 し、すべてのメソッド定義とシグネチャにconstの使用を義務付け(データの改変に使用した場合は後で削除可能)、保護対象のデータへのアクセスをget / setで記述すると、正しくOOPを使った結果、意図しないデータ改変に関する 大きなバグが開発中に 検出されることになります。

私はあるクラスをゼロからそのように書き直しました - すぐにコンパイラは私の問題との非互換性を見つけ、アイデアをチェック(テスト)するときに子孫からベースクラスに入って、いつものように気を取られて、削除するのを忘れてしまいました - 私はテストでこのバグを見つけただろうという事実ではなく、私はそれがそのように意図されていたと思うかもしれません)) 。

もう一つの顕著な利点は、グローバルに記述された変数がすべてないことです。私はそれらを使用しないようにしていますが、ここではまったく使用されていません(まあ、グローバル最適化フラグを除いて - 私のニーズに合わせて、取引時の重大なエラーのフラグです)。

興味深いのは、get/setによる呼び出しをすべて書き換えると、まずソースクラスのサイズが大きくなり、その後、get/setの呼び出しに置き換え始めると、大幅に縮小し始めたことです - 私はそれがコードのサイズを大きく膨らませると言いませんが、再び - これはデータの整合性に対するコントロールを提供します!


SZY: もしあなたが完璧主義者で、get / setによる余分な呼び出しはCPUの余分なクロックだと信じているなら、タスクが100%完了したとき、ソースを検索して各get / setの呼び出しを数え、古いルールを適用することは難しくありません - もしコードのセクションを複数回呼ぶなら、コードのセクションはサブルーチンとして作らなければなりません...。その逆をやることは誰も禁止していない ---> フィールドを割り当てたり読んだりするために get/set を1回呼び出すだけ......しかし、これはいわば「汚い手」であり、利点が疑わしい。

 
Igor Makanu:

MQL5ではstaticしか使ってませんでした。static modifierが あれば、MUから直接署名が見えるので、非常に便利です。

の制限についてですが、タスクを別スレッドに投げてからkillすることも可能です。

またはDLL内のコールを書き込む

それは問題ないと思います。

シャープの静止画メンバーじゃなくて、この

public static class ClassName {}

静的クラスのインスタンスをnewで生成してdeleteで破棄することはできません。コンストラクタとデストラクタを持たず、すべてのメンバとメソッドは静的です。とにかく、働いてからずいぶん経ちますが、プロクラステスのベッドのような居心地の悪さを覚えています。

通常、数学関数などのライブラリ関数のコンテナとして使用されます。

 
Alexey Volchanskiy:

シャープの静的メンバーというわけではなく、この

static修飾子がないとMQLが見えないクラスだと思うのですが、static修飾 子があるクラス内のメソッドは見えるようになります

しかし、staticで宣言された関数を呼び出すと、その関数がクラス内のどこで宣言されているかは、クラス全体がstaticであろうとなかろうと、MQLからのDLL呼び出しには関係ありません。

ノートPCをSSDに換装した後、まだスタジオをインストールしていないので、まだ確認することができません。

 
Alexey Volchanskiy:

MQL5用のC# DLLはまだ試していません。以前はC++のラッパーでやっていましたが、プラス面ではC#でクラスのインスタンスが作成されました。今、DLLは静的なクラスを使うので、その可能性を著しく制限しているのではないかという疑念があります。今、スタティッククラスが作られているのか、ダイナミッククラスが作られているのか、ご存知の方はいらっしゃいますか?

クラスは通常、メソッドは静的です。他のオプションは試していない。

 
イゴール、ドミトリー、要するに、自分でやってみないとわからないということです。私の理解では、いずれにせよ、クラスオブジェクトの 名前ではなく、クラス名を参照する必要があります。試してみます、ありがとうございました。
 
こんにちは、信号について質問がある場合、どこに書けばいいのでしょうか?シグナルを購読するのが妥当かどうか知りたいのですが、保証金=312ドルなら? また、1ヶ月半前に取引を開始した場合、ブローカーへの依存を避け、効率的に仕事をするにはどうしたらよいでしょうか?1ヶ月半前に取引を開始しました。 ありがとうございます。
 
Alexey Volchanskiy:
イゴール、ドミトリー、要するに、自分でやってみないとわからないということです。私の理解では、いずれにせよ、クラスオブジェクトの 名前ではなく、クラス名で参照する必要があります。試してみます、ありがとうございました。

クラス名でアドレスを指定する。

 
Alexey Volchanskiy: イゴール、ドミトリー、要するに自分でやってみないとわからないということです。いずれにしても、クラスオブジェクトの 名前ではなく、クラス名を参照する必要があることは理解しました。試してみます、ありがとうございました。

MQL5からC#を呼び出す方法はこれだけとは言い切れません。https://www.mql5.com/ru/forum/285631 の開発者の例を参考にしました。

#import "TestLib.dll"

//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
   int x=41;
   TestClass::Inc(x);
   Print(x);
  }

public class TestClass
{
   public static void Inc(ref int x)
   {
    x++;
   }
}

私は、C#でエントリーポイントを取得するために開発者の例を使用しました。他の方法は使用していません。

の記事と、記事のコードが意図したとおりに動かない理由についての私の研究https://www.mql5.com/ru/forum/3153/page4#comment_10366498 - 今のところすべて動作しています。

 

は、OOPスタイルのコードとの戦いの結果を見て、うーん...と思いました。善哉善哉))))


質問があるのですが、私のコードでは、まあ正確には3回ですが、こんな構文を使っています。

private:
   COrder            *m_order;
.......

// использую так
return(CheckPointer(m_order)==POINTER_INVALID ? true : m_order.Orderclose());

//или так

if(CheckPointer(m_order)==POINTER_INVALID)

はすべてprivatメソッドで呼び出しますが、CheckPointer(m_order)==POINTER_INVALIDからソースコード上で逃れるための「Jediメソッド?

いくつかのget/setについて質問しています。

特別な問題はなく、いわば気まぐれで、C++のOOPメソッドの知識への渇望がまだ衰えていないうちは