Fragen zu OOP in MQL5 - Seite 90

 
Igor Makanu:

wenn in meinem Beispiel:

Kopieren Sie die asc- und bid-Werte in die onTick()-Methode und verwenden Sie _Ask, _Bid (virtueller Handel) in den übrigen Methoden

wie die Arbeit mit globalen Variablen sein?

ZS: als eine Option, kann ich natürlich durch Referenz &tick an alle Methoden übergeben, aber wieder Fragen, was effizienter ist

Falls dieses Thema noch relevant ist, möchte ich darauf hinweisen, dass die Option, die Felder beizubehalten, sowohl weniger effizient als auch konzeptionell weniger korrekt ist. Im Prinzip korrelieren die beiden Konzepte fast immer miteinander.
Sauberer Code (ohne Seiteneffekte) wird vom Compiler immer besser optimiert und ist leichter zu verstehen.
Wenn Ihr Objekt seinen Zustand unter dem Einfluss von Eingabedaten ändern soll, sollte es diese Eingabedaten nicht speichern (außer für Caching-Zwecke).
Sie müssen die Fliegen von den Koteletts trennen.

 

Ich habe einmal eine Frage zu zwei Möglichkeiten der Initialisierung von Variablen in einer Klasse gestellt. Diese hier:

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

Und das hier:

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

Ich fragte, was der Vorteil der zweiten Methode sei, und mir wurde gesagt, dass man damit statische Mitglieder initialisieren kann. Aber statische Mitglieder werden nicht auf diese Weise initialisiert.

Die Frage ist also dieselbe: Was ist der prinzipielle Unterschied und was ist der Vorteil des zweiten Weges?

 

Zitat

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

Ich habe einmal eine Frage zu zwei Möglichkeiten der Initialisierung von Variablen in einer Klasse gestellt. Hier ist eine solche:

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

Dmitry Fedoseev:

Ich fragte, was der Vorteil des zweiten Weges ist, und mir wurde gesagt, dass statische Mitglieder damit initialisiert werden können. Aber statische Mitglieder werden nicht auf diese Weise initialisiert.

Es handelt sich um konstante Felder, nicht um statische Felder.

class CA
{
protected:
   const int         val;
   static int        static_val;
public:
                     CA(): val(0) { }
};
static int CA::static_val = 12345;
Dmitry Fedoseev:

Die Frage ist also immer noch dieselbe: Worin besteht der prinzipielle Unterschied und was ist der Vorteil des zweiten Weges?

Wenn wir die Aussage "es gilt als unhöflich" verwerfen, dann sollten wir imho das verwenden, was am bequemsten ist.

 
Ja, das ist richtig, konstant, verwirrt)
 

Ich fange das Thema neu an, ich habe den vorherigen Beitrag gelöscht, ich dachte, ich hätte es selbst herausgefunden....


Hier ist der Code:

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;

Ich möchte 3 enums und 2 ints aus dem privaten Bereich von CSetting mit einem int füllen, in dem ich diese Daten bitweise speichern werde, skizzierte den Code:

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;

Theoretisch sollte es funktionieren, ich nehme die unteren 2 + 3 +3 Bits aus den Daten für enum und die restlichen 24 Bits aus dem int, um param1 und param2 zu füllen, wobei ich das 12te Bit als Zeichen der Zahl behalte


Wie kann ich überprüfen, ob ein Fehler vorliegt? )))

oder wäre dankbar, wenn jemand eine Idee hätte, wie man diese Daten in einer Datenbank speichern könnte.

 
Alternativ: t+d*10+v*100
 
Igor Makanu:

Wie überprüfen Sie, ob es Fehler gibt? )))

Das übliche Verfahren - einpacken, auspacken, prüfen, ob es identisch ist. vorzugsweise alle Grenzfälle prüfen.
 
Dmitry Fedoseev:
oder t+d*10+v*100

wird dies nicht funktionieren,

müssen Sie entweder Bit für Bit verschieben oder mit 2 multiplizieren/splitten, was einer Verschiebung gleichkommt

TheXpert:
gut, wie immer - einpacken, auspacken, Identität prüfen. am besten alle Grenzfälle prüfen.

Also, ja... logischerweise

aber ich hatte nicht vor, zu packen - ich reduziere die Anzahl der Eingabevariablen für den Optimierer und brauche viele GA-Durchläufe, damit GA nicht schnell konvergiert


Grenzfälle sind bereits geprüft worden, aber aus Erfahrung.... Käfer sind so schlau!!! )))

HH: Ich kann natürlich die Schleife von 0...MAX_UINT in eine Datei zurücksetzen und sie visuell betrachten, aber das ist nicht die beste Option, imho.

 
Igor Makanu:

wird es nicht funktionieren,

...

Warum sollte es nicht funktionieren? Drei Aufzählungen, keine davon mehr als 10. Zweite Klasse der Grundschulen Arithmetik.