Fragen zu OOP in MQL5 - Seite 21

 
Alexey Navoykov:
Handelt es sich um einen reinen Testkurs oder werden Sie ihn wirklich nutzen?
Statische Variablen werden nicht neu initialisiert, wenn sich ein Zeichen ändert, soweit ich mich erinnere.
Und im Allgemeinen ist es keine gute Idee, konstante statische Werte mit externen Werten zu initialisieren, die zum Zeitpunkt der Initialisierung nicht unbedingt verfügbar sind.

Diezweite, ich schreibe sowieso unter MT4, auch für mich selbst - es funktioniert nicht in den Tester für ein paar Symbole, wenn ich etwas Nützliches in MT4 sehen, werde ich auf MT5 mit MT4Orders wechseln - ich habe meine "kreative Arbeit" ohne Probleme mit dieser Bibliothek überprüft

zuerst möchte ich die Idee eines richtigen OOP sehen - deshalb teste ich es, um zu sehen, was dabei herauskommt, bisher läuft es ziemlich chaotisch.... Wir werden sehen, ich habe Zeit. Hier ist das Ladegerät, das ich mir selbst gebaut habe ))))


Ich weiß, es ist nicht der beste Weg, um vor dem Start des Hauptcodes zu initialisieren, oder eher ich verwendet, um so zu denken, aber ich habe es nie überprüft, egal wie viele neue Builds ich hatte - in MQL ist alles immer verfügbar, auch auf globaler Sichtbarkeit Ebene, ich sah die Quellen Leute gehen direkt an die Spitze und schreiben es so:

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

und diese ungültigen Initialisierungen funktionieren seit Jahren von Build zu Build. Also haben die Entwickler die Leute bis auf die Knochen verwöhnt ))))




SZZY: hier im Allgemeinen, wie immer bei der Verwendung von OOP - die Hauptsache ist, das Problem richtig in komplexe Elemente zu unterteilen und nicht von allem zu erben. Ich weiß nicht, wo die Textausgabe von Fehlern "setzen" - es muss überall, in jeder Klasse und an jeder Stelle des Programms, höchstwahrscheinlich müssen Sie eine Basisklasse erstellen, wie@Vladimir Simakov oben seinen Code zeigte

 
Igor Makanu:

pp 1-3 alles lösbar, ABER... OK, hier mit der Statik geholfen, lassen Sie es so sein, weil es eine Hilfe ist, zumindest etwas, um seine Entscheidung zu rechtfertigen, jetzt der Code ist die folgende:

3 Instanzen von Cdeal erstellt, in das Protokoll aufgenommen:

...

Bis jetzt funktioniert alles wie vorgesehen!

Selbst wenn es funktioniert, ist es nicht zuverlässig. Da die Funktion außerhalb der Klasse implementiert wird, ist es schwierig, die Reihenfolge der Felder in der Klasse selbst zu kontrollieren. Sie sollten zumindest einen fettgedruckten Kommentar in die Klasse schreiben, der besagt, dass diese und jene Felder nicht umgeordnet werden dürfen). Aber Ihre erste Variante war trotzdem besser. Sie sollten die Sicherheit nicht opfern, um eine Zeile Code zu sparen.)
 
Alexey Navoykov:
Aber trotzdem war Ihre ursprüngliche Version besser. Opfern Sie nicht die Zuverlässigkeit, um eine Zeile Code zu sparen)

Welche? - Ich habe das halbe Thema in meinen Variationen ))))

aber ja, du hast hundertprozentig recht!

SZY:

der einfachste und zuverlässigste Weg - erstellen Sie eine Instanz der Klasse über neue in OnInit() - und kopieren Sie alle Terminal-Umgebungsvariablen sofort, aber es ist nicht der beste Weg - wenn ich plane, einen Auftrag sofort beim Start des Konstruktors in diesem Beispiel zu öffnen, dann wird diese Instanz der Klasse wahrscheinlich gelöscht und dann möglicherweise neu erstellt - dies bringt bereits einige Probleme wegen der wiederholten Aufrufe - ich fange an, das Terminal erneut zu laden, wieder verschwenden Speicher.... im Allgemeinen ist es auf diese Weise nicht lösbar


ZZZY: vielleicht einen weiteren Tag mit Experimenten, und schließlich nehmen Sie@Vladimir Simakov Beispiel - alles ist sehr klar dort

 
Igor Makanu:

Ich habe meine Klasse skizziert, die Felder einmal mit konstanten Werten initialisieren soll, und es scheint wie vorgesehen zu funktionieren:

Ich mag 2 Dinge nicht:

1. ich wiederhole den Aufruf von SymbolInfoDouble(_Symbol,SYMBOL_VOLUME_STEP) - weil die Reihenfolge der Initialisierung nicht festgelegt ist, d.h. es ist nicht sicher, dass VolumeSTEP zuerst initialisiert wird und erst dann GetDigitsInVolumeStep() aufgerufen wird

2. ich möchte die statische Methode static int GetDigitsInVolumeStep() loswerden - ich habe ein Video auf youtube gesehen, in dem gesagt wird, dass man in reinem OOP keine statischen Methoden verwenden sollte, und jetzt kämpfe ich gegen Windmühlen

der Link zum Video, es ist im Wesentlichen das gleichehttps://youtu.be/lfdAwl3-X_c undhttps://youtu.be/zME4SOCHT0I


Wie kann ich diese 2 Punkte, die mir nicht gefallen, umformulieren?

1. Es ist nicht schlimm, diese Funktion zweimal aufzurufen.

2. verwirrt es Sie nicht, dass diejenigen, die gegen die Verwendung statischer Funktionen sind, nicht das geringste Argument anführen?

Schauen Sie sich lieber nicht irgendwelche Videos an, sondern lesen Sie Bücher.

 
Koldun Zloy:

2. Sind Sie nicht verwirrt, dass diejenigen, die gegen die Verwendung statischer Funktionen sind, nicht das geringste Argument anführen?

Und Sie sind der erste, der mich darin unterstützt, dass das Video nichts mit der Praxis zu tun hat, ich habe in einem anderen Thread meine Meinung über das Video geschrieben - der Sprecher konnte nicht einmal die Fragen der Schüler beantworten

 
Igor Makanu:

und du bist der erste, der mir bestätigt, dass das Video nichts mit der Praxis zu tun hat. Ich habe in einem anderen Thread meine Meinung über das Video geschrieben - der Reporter konnte nicht einmal die Fragen der Schüler beantworten

Ich glaube nicht, dass es bei OOP darum geht, die eigenen Fähigkeiten einzuschränken, um blindlings den unbegründeten Postulaten einiger Internet-Mundstücke zu folgen, wo jeder auf seine Weise fegt.

 
Artyom Trishkin:

Ich glaube nicht, dass OOP die Reduzierung der eigenen Fähigkeiten bedeutet, um blindlings den unbegründeten Postulaten einiger Internet-Mundstücke zu folgen, wo jeder auf seine Weise fegt.

Wenn Sie das Video gesehen haben, sollten Sie verstehen, dass das Ziel .... ist. Nun, im Allgemeinen verstehst du auch nichts und bist noch nicht reif genug - so hat es mir zumindest A100 erklärt

SZZ: Ich werde später noch ein wenig mit den Schnittstellen experimentieren, vielleicht erscheint dann eine "Entity-Schönheit" ))))

 

Ich habe mir sein Video über Statik angesehen, nur um so zu schreiben:

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

Nun, einen Wrapper über eine Statik zu schreiben ist ein Problem, nicht wahr?

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

Und durch Vorlagen ist die Effizienz deutlich höher. Die Frage aus dem Publikum hat mir gefallen https://www.youtube.com/watch?v=75U9eefFYoU#t=33m25s

 
Igor Makanu:

ZS: Ich werde später noch ein wenig mit den Schnittstellen experimentieren, vielleicht erscheint dann eine "Entity-Schönheit" ))))

Geprüft, ob "OOP-Muster - Verhaltensmuster - Strategie" funktionieren wird

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) Strategie_1::Strategie_1

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

2019.08.31 21:04:40.442 tst (EURUSD,H1) Strategie_1::Algorithmus

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

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

2019.08.31 21:04:40.442 tst (EURUSD,H1) Strategie_2::Algorithmus


Funktioniert meiner Meinung nach ohne Probleme

 
Igor Makanu:

geprüft, ob das "OOP-Pattern - Behavioural Patterns - Strategy (Strategie)" funktionieren wird

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

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

2019.08.31 21:04:40.442 tst (EURUSD,H1) Strategie_1::Algorithmus

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

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

2019.08.31 21:04:40.442 tst (EURUSD,H1) Strategie_2::Algorithmus


funktioniert bei mir ohne Probleme

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

Der new-Operator gibt einen Zeiger zurück. Natürlich haben die Entwickler bei der impliziten Dereferenzierung Mist gebaut und deshalb funktioniert Ihre Version, aber ich möchte mich nicht an undokumentierten Dingen aufhängen.

2. Es ist sicherlich nicht C++, aber es ist sehr ähnlich, so dass Initialisierungslisten (ich weiß nicht, ob sie effizient sind) koscher sind.

Grund der Beschwerde: