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

 
Igor Makanu:

私の例で言えば

onTick() メソッドで asc と bid の値をコピーし、残りのメソッドで _Ask, _Bid (仮想取引) を使用します。

グローバル変数を扱うような感じになるのでしょうか?

ZS: オプションとして、もちろんすべてのメソッドに&tickを参照で渡すこともできますが、より効率的な方法は何なのか、もう一度質問します。

もしこの話題がまだ続くのであれば、フィールドを残すという選択肢は、効率も悪く、概念的にも正しくないということを指摘したい。 原則的に、この2つの概念はほとんど相関があるのだ。
クリーンなコード(副作用のないコード)は、常にコンパイラによって最適化され、理解しやすくなります。
オブジェクトが入力データの影響を受けてその状態を変化させることを意図している場合、その入力データを保存すべきではありません(キャッシュの目的は除く)。
フライとカツを切り離さなければならない。

 

あるとき、クラス内の変数を初期化する 2つの方法について質問されました。これですね。

class CA{
   protected:
      int val;
   public:
      CA(){
         val=0;
      }      
};

そして、この1枚。

class CA{
   protected:
      int val;
   public:
      CA():val(0){
      }      
};

2番目の方法の利点は何かと尋ねると、「これでstaticメンバを初期化できる」と言われました。しかし、静的メンバはそのように初期化されません。

では、原理的に何が違うのか、2番目の方法の利点は何なのか、という疑問は同じです。

 

引用

Хочется закончить свою песнь важными словами. Любые описанные механизмы, принципы и паттерны, как и ООП в целом не стоит применять там, где это бессмысленно или может навредить. Это ведет к появлению статей со странными заголовками типа «Наследование — причина преждевременного старения» или «Синглтон может приводить к онкологическим заболеваниям».
 
Dmitry Fedoseev:

あるとき、クラス内の変数を初期化する 2つの方法について質問されました。こんなのもありますよ。

https://www.mql5.com/ru/forum/85652/page45#comment_15975127

ドミトリー・フェドセーエフ

2番目の方法の利点は何かと尋ねると、静的メンバを初期化できることだと言われました。しかし、静的メンバはそのように初期化されません。

それらは静的な ものではなく、一定の フィールドである。

class CA
{
protected:
   const int         val;
   static int        static_val;
public:
                     CA(): val(0) { }
};
static int CA::static_val = 12345;
ドミトリー・フェドセーエフ

では、原理的に何が違うのか、2番目の方法の利点は何なのか、という疑問は変わりません。

形が悪いとされて いる」という言葉を捨てれば、便利なものは何でもそれを使うことになる、イミフです。

 
はい、その通りです、一定、混乱)
 

もう一度トピックを立てます、前の投稿は削除しました、自分で解ったつもりで...。


以下はそのコードです。

class CSetting  
{
public:
   enum T            {T1, T2, T3, T4, T5, T6, T7, T8};
   enum D            {D1, D2, D3, D4, D5, D6, D7, D8};
   enum V            {V1, V2, V3, v4};
private:
   int               param1, param2;
   T                 t;
   D                 d;
   V                 v;
public:
                     CSetting(const int in_param1,const int in_param2,const T in_t,const D in_d,const V in_v);
  };
//+------------------------------------------------------------------+
CSetting::CSetting(const int in_param1,const int in_param2,const T in_t,const D in_d,const V in_v)
   : param1(in_param1),
     param2(in_param2),
     t(in_t),
     d(in_d),
     v(in_v)
  {}

//--- input parameters
input int              Input_p1 = 1;   // p1 = -1000 ... +1000
input int              Input_p2 = 2;   // p2 = -1000 ... +1000
input CSetting::T      Input_T = CSetting::T::T1;
input CSetting::D      Input_D = CSetting::D::D1;
input CSetting::V      Input_V = CSetting::V::V1;

CSettingのprivatセクションから3つのenumと2つのintを1つのintで埋めて、その中に少しずつデータを格納したいので、コードをスケッチしてみました。

class CSetting
  {
public:
   enum T            {T1, T2, T3, T4, T5, T6, T7, T8};
   enum D            {D1, D2, D3, D4, D5, D6, D7, D8};
   enum V            {V1, V2, V3, v4};
private:
   int               param1, param2;
   T                 t;
   D                 d;
   V                 v;
public:
                     CSetting(const uint data);
  };
//+------------------------------------------------------------------+
CSetting::CSetting(const uint data)
{
   v = (V)(data & 0x3);
   d = (D)((data >> 2) & 0x7);
   t = (T)((data >> 5) & 0x7);
   uint tmp = ((data >> 8) & 0xFFF);
   param2 = (tmp & 0x800) == 0x800 ? -(int)(tmp & 0x7FF) : (int)(tmp & 0x7FF);
   tmp = data >> 20;
   param1 = (tmp & 0x800) == 0x800 ? -(int)(tmp & 0x7FF) : (int)(tmp & 0x7FF);
}
//+------------------------------------------------------------------+
//--- input parameters
input int DATA         = 0xFFFFFFFF;

理論的には,enum のデータから下位 2 + 3 + 3 ビットを取り出し,残りの 24 ビットを int で param1 と param2 を埋め,12 ビットを数値の文字として保持すれば,うまくいくはずです.


エラーが発生しているかどうかを確認するにはどうすればよいですか?)))

または、このデータをint型に保存する方法について、他の方のアイデアを お聞かせいただければ幸いです。

 
代替:t+d*10+v*100
 
Igor Makanu:

エラーの有無はどのように確認するのですか?)))

梱包し、開梱し、同一であるかどうかを確認するのが通常の方法です。
 
Dmitry Fedoseev:
またはt+d*10+v*100

は機能しません。

ビットずつシフトするか、2倍/2倍してシフトする必要がありますが、これはシフトと同等です。

TheXpert:
さて、いつものように、梱包し、開封し、身元を確認する。できれば、すべてのボーダーラインのケースを確認する。

だから、そう...元来

オプティマイザーの入力変数の数を減らし、その上で多くのGAパスを必要とするため、GAがすぐに収束しないのです。


バウンダリーケースは既に確認済みですが、経験から...。虫って器用なんですね!!!)))

HH:もちろん、0...MAX_UINTのループをファイルにリセットして視覚的に見ることはできますが、最良の選択肢とは言えませんね、イマイチ。

 
Igor Makanu:

は動作しません。

...

なぜ、うまくいかないのでしょうか?3つの列挙、いずれも10以上ではない 小学校2年生の算数。