Fragen zu OOP in MQL5 - Seite 40

 
Dmitry Fedoseev:

const - wenn es notwendig ist, die Zuweisung von Variablen zu verbieten (außer einmal während der Initialisierung). Wenn eine Variable als conts deklariert ist, muss bei der Übergabe an eine Funktion per Referenz auch das Funktionsargument const sein, aber der Compiler erzwingt dies, Sie müssen nicht darüber nachdenken. Wenn eine Variable nicht zugewiesen wird, kann sie auch als const markiert werden - das geht dann schneller, das gilt auch für Funktionsargumente. Es kann jedoch jederzeit vorkommen, dass Sie sie ändern müssen...

statisch - wenn es sich um eine Variable in einer Klasse handelt, ist das ein seltener Fall, sogar der seltenste. Wenn es sich um eine Klassenmethode handelt und die Methode nur Argumente dieser Methode und statische Variablen der Klasse behandelt, ist dies ebenfalls ein seltener Fall (allerdings nicht so selten, wenn man Funktionen nur der Einfachheit halber in einer Klasse sammelt).

Ich bin noch nicht dazu gekommen, die C# DLL für MQL5 auszuprobieren. Ich habe früher C++-Wrapper verwendet und eine Klasseninstanz in C# erstellt. Ich habe den Verdacht, dass diese DLL nun eine statische Klasse verwenden wird, was die Möglichkeiten stark einschränkt. Weiß jemand, ob jetzt eine statische oder eine dynamische Klasse erstellt wird?

 
Alexey Volchanskiy:

Ich bin noch nicht dazu gekommen, die C# DLL für MQL5 auszuprobieren. Früher habe ich das mit C++-Wrappern gemacht, aber dafür wurde eine Instanz der Klasse in C# erstellt. Ich habe den Verdacht, dass die DLL jetzt eine statische Klasse verwenden wird, was ihre Möglichkeiten stark einschränkt. Weiß jemand, ob es jetzt eine statische oder dynamische Klasse erstellt?

Ich habe nur statische für MQL5 verwendet - wenn Sie den statischen Modifikator haben, wird die Signatur direkt von MU aus sichtbar sein, sehr praktisch

über die Einschränkung, könnten Sie die Aufgabe in einen separaten Thread werfen und ihn dann beenden.

oder Schreibaufrufe innerhalb der DLL

es ist kein Problem


UPD:

Ich bin mir nicht sicher, ob ich meine jüngsten Untersuchungen über die Gründe für die Verwendung von OOP in MQL-Aufgaben erklären kann, aber ich werde Ihnen sagen, was ich sehe

Wenn wir im Allgemeinen den OOP-Stil verwenden, die Zugriffskontrolle vollständig respektieren und sicherstellen, dass alle privaten/geschützten/öffentlichen Modifikatoren und die obligatorische Verwendung von const für jede Methodendefinition und -signatur (kann später entfernt werden, wenn sie zum Ändern von Daten verwendet wird) festgelegt werden und alle Zugriffe auf geschützte Daten mit get / set geschrieben werden, ist das Ergebnis der korrekten Verwendung von OOP die Entdeckung großer Fehler bei unbeabsichtigterDatenänderung während der Entwicklung.

Ich schrieb eine Klasse auf diese Weise von Grund auf neu - sofort Compiler gefunden Inkompatibilität mit meinem Problem, bekam in Basisklasse von Nachkomme bei der Überprüfung (Testen) die Idee, und wie üblich wurde abgelenkt und vergessen zu entfernen - nicht die Tatsache, dass ich diesen Fehler in der Prüfung gefunden hätte, könnte ich gedacht haben, dass es beabsichtigt war)) .

Ein weiterer bemerkenswerter Vorteil für mich ist das Fehlen aller global beschriebenen Variablen - ich versuche, sie nicht zu verwenden, sie werden hier überhaupt nicht verwendet (na ja, mit Ausnahme des globalen Optimierungsflags - für meine Bedürfnisse und das Flag für kritische Fehler beim Handel)

Eine interessante Beobachtung ist, dass beim Umschreiben aller Aufrufe über get / set, die Quelle Klasse zunächst in der Größe erhöht und dann begann deutlich schrumpfen, wenn ich begann, in den Aufrufen von get / set zu ersetzen - ich sage nicht, dass es stark bläht den Code in der Größe, aber wieder - dies wird die Kontrolle über die Datenintegrität!


SZY: Nun, wenn Sie im Herzen ein Perfektionist sind und glauben, dass ein zusätzlicher Aufruf über get / set ein zusätzlicher Takt auf der CPU ist, dann, wenn die Aufgabe zu 100 % erledigt ist, ist es nicht schwer, die Aufrufe zu jedem get / set über die Suche in der Quelle zu zählen und eine alte Regel anzuwenden - wenn Sie einen Abschnitt des Codes mehr als einmal aufrufen, dann müssen Sie diesen Abschnitt des Codes als eine Unterroutine machen.... niemand verbietet, das Gegenteil zu tun ---> nur ein Aufruf von get / set zu assign / read field.... aber das ist sozusagen "schmutzige Tricks" mit fragwürdigem Nutzen

 
Igor Makanu:

Ich habe nur statische für MQL5 verwendet - wenn Sie statische Modifikatoren haben, wird die Signatur direkt von MU aus sichtbar sein, sehr praktisch

über die Einschränkung, könnten Sie die Aufgabe in einen separaten Thread verschieben und ihn dann beenden.

oder Schreibaufrufe innerhalb der DLL

Ich denke nicht, dass das ein Problem ist.

Ich meine nicht statische Mitglieder für Sharp, ich meine dies

public static class ClassName {}

Man kann eine statische Klasseninstanz nicht mit new erzeugen und mit delete zerstören, sie hat keine Konstruktoren und Destruktoren, alle Mitglieder und Methoden sind statisch. Jedenfalls ist es lange her, dass ich dort gearbeitet habe, aber ich weiß noch, wie unbequem es war, wie ein Prokrustesbett.

Sie werden in der Regel als Container für Bibliotheksfunktionen, z. B. mathematische Funktionen, verwendet.

 
Alexey Volchanskiy:

Ich meinte nicht die statischen Mitglieder für Sharp, sondern diese

Ich denke, es ist eine Klasse, die MQL ohne den statischen Modifikator nicht sehen wird, aber es wird, wenn die Methoden innerhalb der Klasse einen statischen Modifikator haben.

Sie können alle Klassen innerhalb der DLL lokal verwenden, ich habe WinForm in einer DLL-Klasse ohne statische. alles funktioniert gut, aber ich rufe Funktionen mit statischen deklariert, und wo diese Funktionen innerhalb der Klasse deklariert sind - es spielt keine Rolle für DLL-Aufruf von MQL, auch wenn die gesamte Klasse statisch ist oder nicht.

ich kann es noch nicht überprüfen, ich habe das Studio noch nicht auf meinem Laptop installiert, nachdem ich ihn durch eine SSD ersetzt habe, ich brauche es noch nicht

 
Alexey Volchanskiy:

Ich bin noch nicht dazu gekommen, die C# DLL für MQL5 auszuprobieren. Früher habe ich das mit C++-Wrappern gemacht, aber dafür wurde eine Instanz der Klasse in C# erstellt. Ich habe den Verdacht, dass die DLL jetzt eine statische Klasse verwenden wird, was ihre Möglichkeiten stark einschränkt. Weiß jemand, ob jetzt eine statische oder eine dynamische Klasse erstellt wird?

Die Klasse ist regulär, die Methoden sind statisch. Ich habe keine anderen Optionen ausprobiert.

 
Igor, Dmitry, kurz gesagt, ihr müsst es selbst ausprobieren. So wie ich es verstehe, ist es in jedem Fall notwendig, sich auf den Klassennamen zu beziehen, nicht auf den Namen des Klassenobjekts. Ich werde es versuchen, danke.
 
Hallo, wenn ich eine Frage zu Signalen habe, wohin soll ich schreiben? Ich würde gerne wissen, ob es sinnvoll ist, Signale zu abonnieren, wenn die Kaution = 312 $ ist? Und wie kann ich die Abhängigkeit vom Broker vermeiden und effektiv arbeiten, wenn ich vor eineinhalb Monaten mit dem Handel begonnen habe? Ich habe vor eineinhalb Monaten mit dem Handel begonnen. Danke.
 
Alexey Volchanskiy:
Igor, Dmitry, kurz gesagt, ihr müsst es selbst ausprobieren. Soweit ich verstanden habe, ist es in jedem Fall notwendig, sich auf den Klassennamen und nicht auf den Namen des Klassenobjekts zu beziehen. Ich werde es versuchen, danke.

Anrede mit dem Namen der Klasse.

 
Alexey Volchanskiy: Igor, Dmitry, kurz gesagt, ihr müsst es selbst ausprobieren. Ich verstehe, dass in jedem Fall der Klassenname und nicht der Name des Klassenobjekts angegeben werden sollte. Ich werde es ausprobieren, danke.

Ich kann nicht behaupten, dass dies die einzige Möglichkeit ist, C# von MQL5 aus aufzurufen, ich habe ein Beispiel vonhttps://www.mql5.com/ru/forum/285631 developers verwendet

#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++;
   }
}

Ich habe das Entwicklerbeispiel verwendet, um den Einstiegspunkt in C# zu erhalten, ich habe keine anderen Möglichkeiten verwendet, mit einigen Basteleien kann der gleiche .dll-Code für MT4 kompiliert werden

Artikel und meine Nachforschungen, warum der Code aus dem Artikel nicht wie vorgesehen funktioniert https://www.mql5.com/ru/forum/3153/page4#comment_10366498 - bisher funktioniert alles

 

Ich habe mir die Ergebnisse meines Kampfes mit OOP-artigem Code angesehen - hmmm... ausgezeichnet! ))))


Ich habe eine Frage, aber in meinem Code, na ja, genau drei Mal, verwende ich eine Konstruktion wie:

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

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

//или так

if(CheckPointer(m_order)==POINTER_INVALID)

ruft alle in privaten Methoden, aber gibt es eine "Jedi-Methode?", um im Quellcode vonCheckPointer(m_order)==POINTER_INVALID wegzukommen

Ich frage nach einigen get / set

keine besonderen Probleme, sondern sozusagen eine Laune, oder wenn der Wissensdurst über OOP-Methoden in C++ noch nicht gestillt ist