Fragen zu OOP (Objektorientierte Programmierung) - Seite 11

 

Ich würde gerne die Meinung erfahrener Programmierer zu einigen der Feinheiten hören. Nehmen Sie Deklarationen von Variablen in Klassen. Ich habe zum Beispiel Variablen in Klassen, die innerhalb verschiedener Methoden einer bestimmten Klasse deklariert werden. Sie werden in jeder Methode am häufigsten angegeben. Lohnt es sich, dies zu tun, oder ist es besser, sie einmal im privaten Bereich zu deklarieren und sie dann zu verwenden?

Ich denke, es wäre logischer, Zählervariablen zu verwenden, wenn sie in Schleifen verwendet werden, richtig? Schließlich wird der Zähler im Moment der Berechnung explizit auf einen Wert gesetzt, zum Beispiel, wenn wir eine Schleife verwenden:

for (i = OrdersTotal() - 1; i >= 0; i--)
{

}

Es wäre nicht sinnvoll, in jeder Methode eine Variable i zu deklarieren, da dies wahrscheinlich eine unnötige Verschwendung von Speicherplatz auf Speicherzellen darstellt. Im Allgemeinen bin ich an solchen Dingen interessiert.

Dies betrifft nicht nur Schleifen, sondern auch andere Optionen. Es gibt genug verschiedene Variablen, die mehr als einmal deklariert werden müssen, die aber die gleiche Rolle spielen... Das Einzige, was ich mir vorstellen kann, ist, dass einige von ihnen auf Null gesetzt werden müssen, damit sie keinen "Müll" aus früheren Operationen enthalten. Ist es sinnvoll, dies zu tun, oder ist es einfacher, eine solche Variable neu zu deklarieren... Im Allgemeinen würde ich gerne von Fachleuten darüber hören.

 
hoz:

Ich würde gerne die Meinung erfahrener Programmierer zu einigen der Feinheiten hören. Nehmen Sie Deklarationen von Variablen in Klassen. Ich habe zum Beispiel Variablen in Klassen, die innerhalb verschiedener Methoden einer bestimmten Klasse deklariert werden. Sie werden in jeder Methode am häufigsten angegeben. Lohnt es sich, dies zu tun, oder ist es besser, sie einmal im privaten Bereich zu deklarieren und sie dann zu verwenden?

Ich denke, es wäre logischer, Zählervariablen zu verwenden, wenn sie in Schleifen verwendet werden, richtig? Schließlich wird der Zähler im Moment der Berechnung explizit auf einen Wert gesetzt, zum Beispiel, wenn wir eine Schleife verwenden:

Es wäre nicht sinnvoll, in jeder Methode eine Variable i zu deklarieren, da dies wahrscheinlich eine unnötige Verschwendung von Speicherplatz auf Speicherzellen darstellt. Im Allgemeinen bin ich an solchen Dingen interessiert.

Dies betrifft nicht nur Schleifen, sondern auch andere Optionen. Es gibt genug verschiedene Variablen, die mehr als einmal deklariert werden müssen, die aber die gleiche Rolle spielen... Das Einzige, was ich mir vorstellen kann, ist, dass einige von ihnen auf Null gesetzt werden müssen, damit sie keinen "Müll" aus früheren Operationen enthalten. Ist es sinnvoll, dies zu tun, oder ist es einfacher, eine solche Variable neu zu deklarieren... Im Allgemeinen würde ich gerne von Fachleuten darüber hören.

Ob Sie dies tun sollten, hängt vom Zweck der Erstellung der Variablen ab. Wenn eine Entität durch eine Klasse gekapselt ist, z. B. eine Bestellung, dann benötigen wir Variablen, die in der Klasse definiert sind, um ihre Eigenschaften auszudrücken, z. B. ein Ticket für die Bestellung. Diese Variablen werden von allen Methoden dieser Klasse für dasselbe Objekt in dieser Klasse gemeinsam genutzt.

Wenn eine Variable erstellt wird, um eine Schleife innerhalb einer Methode bereitzustellen, sollte sie innerhalb der Methode als automatisch definiert werden (d. h. ohne Verwendung des Schlüsselworts static). In diesem Fall gibt es keine Probleme, selbst wenn eine Methode eine andere Methode innerhalb ihrer eigenen Schleife aufruft, die ebenfalls eine Schleife hat, und die Variable mit demselben Namen verwendet wird. Wenn Sie eine in einer Klasse deklarierte Variable verwenden, wird die Variable in der Schleife der zweiten Methode überschrieben.

Bei automatischen Variablen wird der Speicher automatisch zugewiesen, wenn die Funktion eingegeben wird, und automatisch gelöscht, wenn sie verlassen wird, mit minimalem Overhead. Wenn die Funktionen einfach sind, kann der Compiler außerdem Code erzeugen, der keinen automatischen Speicher zuweist und freigibt.

Das Speichern von Speicherzellen dieser Art war vor einiger Zeit noch sinnvoll, hat aber vor etwa 20 Jahren endgültig seinen Sinn verloren...

 

Es gibt eine Klasse. Es hat so eine einfache Methode, alles ungebrandet, weil ich nach dem Fehler gesucht habe:

// 1.5 Определяем минимальную разрядность лота. ===========================================================================================
int BaseInfo::LotPrecision()
{
   static int li_LotPrecision = 0;     // устанавливаем минимальную разрядность лота в ноль
   Print ("LotPrecision()_Before: li_LotPrecision = ", li_LotPrecision);
   Print ("LotPrecision()_BeforeCircle: SLots.gd_LotStep = ", SLots.gd_LotStep);
   while (SLots.gd_LotStep < 1)
   {
      Print ("LotPrecision(): SLots.gd_LotStep < 1");
      SLots.gd_LotStep *= 10;
      Print ("SLots.gd_LotStep *= 10");
      Print ("LotPrecision(): SLots.gd_LotStep = ", SLots.gd_LotStep);
      li_LotPrecision++;
      Print ("LotPrecision(): li_LotPrecision = ", li_LotPrecision);
   }
   Print ("LotPrecision(): LOTPRES = ", li_LotPrecision);
   return (li_LotPrecision);
}

Die Variableli_LotPrecision war früher ohne statischen Modifikator, dann sah ich, dass sie ihren Wert nicht verlieren sollte und änderte sie. Es wurde festgestellt, dass die Variableli_LotPrecision ihren Wert nicht beibehält, obwohl ich den Modifikator hinzugefügt habe.

Ich drucke es in OnInite():

void OnTick()
{
   int Lot = CBase.LotPrecision();
   Print ("Lot = ", Lot);
}

Im Protokoll:

17:26:03 2014.07.22 14:10  RSI EURUSD,M5: SLots.gd_LotStep = MarketInfo (_Symbol, MODE_LOTSTEP); = 0.01
17:26:03 2014.07.22 14:10  RSI EURUSD,M5: LotPrecision()_Before: li_LotPrecision = 0
17:26:03 2014.07.22 14:10  RSI EURUSD,M5: LotPrecision()_BeforeCircle: SLots.gd_LotStep = 0.01
17:26:03 2014.07.22 14:10  RSI EURUSD,M5: LotPrecision(): SLots.gd_LotStep < 1
17:26:03 2014.07.22 14:10  RSI EURUSD,M5: SLots.gd_LotStep *= 10
17:26:03 2014.07.22 14:10  RSI EURUSD,M5: LotPrecision(): SLots.gd_LotStep = 0.1
17:26:03 2014.07.22 14:10  RSI EURUSD,M5: LotPrecision(): li_LotPrecision = 1
17:26:03 2014.07.22 14:10  RSI EURUSD,M5: LotPrecision(): SLots.gd_LotStep < 1
17:26:03 2014.07.22 14:10  RSI EURUSD,M5: SLots.gd_LotStep *= 10
17:26:03 2014.07.22 14:10  RSI EURUSD,M5: LotPrecision(): SLots.gd_LotStep = 1.0
17:26:03 2014.07.22 14:10  RSI EURUSD,M5: LotPrecision(): li_LotPrecision = 2
17:26:03 2014.07.22 14:10  RSI EURUSD,M5: LotPrecision(): LOTPRES = 2
17:26:03 2014.07.22 14:10  RSI EURUSD,M5: LotPrecision()_Before: li_LotPrecision = 0
17:26:03 2014.07.22 14:10  RSI EURUSD,M5: LotPrecision()_BeforeCircle: SLots.gd_LotStep = 1.0
17:26:03 2014.07.22 14:10  RSI EURUSD,M5: LotPrecision(): LOTPRES = 0
17:26:03 2014.07.22 14:10  RSI EURUSD,M5: Lot = 0
17:26:03 2014.07.22 14:10  RSI EURUSD,M5: LotPrecision()_Before: li_LotPrecision = 0
17:26:03 2014.07.22 14:10  RSI EURUSD,M5: LotPrecision()_BeforeCircle: SLots.gd_LotStep = 1.0
17:26:03 2014.07.22 14:10  RSI EURUSD,M5: LotPrecision(): LOTPRES = 0
17:26:03 2014.07.22 14:10  RSI EURUSD,M5: Lot = 0
17:26:03 2014.07.22 14:10  RSI EURUSD,M5: LotPrecision()_Before: li_LotPrecision = 0
17:26:03 2014.07.22 14:10  RSI EURUSD,M5: LotPrecision()_BeforeCircle: SLots.gd_LotStep = 1.0

Dies zeigt deutlich, dass nach dem Beenden der Funktion LotPrecision() der Wert der Variablenli_LotPrecision verloren geht. Wie kann man sie konstant halten?

Ich habe versucht, dieseli_LotPrecision-Variable dem Abschnitt private class hinzuzufügen, um sie später einem statischen Modifikator zuzuweisen, aber der Compiler besteht darauf, dass dies unmöglich ist.

unresolved static variable 'BaseInfo::li_LotPrecision'  BaseInfo.mqh    60      10

Eshat keinen Sinn, die Variable aus der Klasse zu werfen, da sie nirgendwo anders benötigt wird.

Was ist zu tun?