OOP vs. prozedurale Programmierung - Seite 6

 
Dmitry Fedoseev:

Und wie wollen Sie das Nachziehen an verschiedene Parameter anpassen?

Probieren wir es mit einer konkreten Aufgabe. Wenn Sie eine haben, geben Sie sie bitte an.
 
Реter Konow:
Vorzugsweise sollten sie zu einer bestimmten Aufgabe führen. Eine solche Beschreibung ist nicht sehr klar. In meiner Praxis ändert sich der Algorithmus nicht durch die Änderung externer Parameter. Sie wird im Voraus für beliebige Werte dieser Parameter universal gemacht. Daher ist es nicht ganz klar, was Sie meinen. Beschreiben Sie es anhand eines konkreten Beispiels.
class Ордер
{
  public: int SELL;

  Ордер(void) // Конструктор имеет то же имя, что и класс. Выполняется при инициализации переменной класса
  {
    SELL=0;
    int k=OrdersHistoryTotal()-1;
    for(; k>=0; k--)
    {
      if(!OrderSelect(k, SELECT_BY_POS, MODE_HISTORY)) continue;
      if(OrderType()==OP_SELL)SELL++;
    }
  }
}x;

void OnStart()
{
  Alert(x.SELL);
}

Dank der OOP ist das Hauptprogramm sehr kurz und übersichtlich. Dies ist nur das erste Beispiel, das mir einfällt. Wenn Sie die Anzahl der Aufträge häufig berechnen müssen, liegen die Vorteile auf der Hand. Beim ersten Mal ist es schwer zu verstehen. Aber auch Funktionen, selbst mit Parametern, waren früher eine Schwierigkeit

 
Реter Konow:
Versuchen wir es mit einer bestimmten Aufgabe. Falls ja, geben Sie dies bitte an.

Spezifische Aufgabe. Der Kunde hat einen Expert Advisor für zwei MAs bestellt, der alle in der Codebasis verfügbaren Trailing-Varianten enthalten würde, aber im Tester nicht verlangsamt wird.

Der EA sollte auch die Aussicht haben, in Zukunft (zu geringen Kosten) mit neuen Schleppvarianten aktualisiert zu werden.

 
STARIJ:

Dank OOP ist das Hauptprogramm sehr kurz und übersichtlich. Dies ist nur das erste Beispiel, das mir einfällt. Wenn die Anzahl der Aufträge häufig berechnet werden muss, liegen die Vorteile auf der Hand. Beim ersten Mal ist es schwer zu verstehen. Aber auch Funktionen, sogar mit Parametern, waren früher eine Schwierigkeit

Ich verstehe nicht, warum nicht eine Funktion "int Number_orders()" erstellt wird, die immer die obige Schleife durchläuft und den Zählerwert "SELL" zurückgibt?

Zum Beispiel:

 int Количество_ордеров()
  {
    SELL=0;
    int k=OrdersHistoryTotal()-1;
    for(; k>=0; k--)
    {
      if(!OrderSelect(k, SELECT_BY_POS, MODE_HISTORY)) continue;
      if(OrderType()==OP_SELL)SELL++;
    }
   return(SELL);
  }


Warum brauchen wir hier eine Klasse?

 
Dmitry Fedoseev:

So müssen beispielsweise 100 Trailing-Stop-Varianten in einen Expert Advisor gepackt werden. Wenn man prozedural programmiert, entsteht ein Chaos wie dieses:

100 identische Codefragmente. Wenn das Programm läuft, enthält es in der Regel nur einen Trailing-Stop, die restlichen 99 Ifs verbrauchen nur Ressourcen.

Nun zur OOP-Variante. Während der Initialisierung des Expert Advisors skalieren wir das Array mit Zeigern entsprechend der Anzahl der nachlaufenden Balken und erstellen nur Objekte für die aktivierten nachlaufenden Balken. Daher wird der folgende Code immer funktionieren:

Wenn ein nachlaufender Balken aktiviert ist, dann ist cnt=1, d.h. es gibt nichts Unnötiges.

Erstellen Sie ein Array mit Funktionsnamen, wählen Sie den Namen aus dem Index und greifen Sie zu.


OOP hat damit nichts zu tun. Dies ist eine Sprachbeschränkung, die sie mit OOP zu lösen versuchen

 

Ich habe es nicht ausprobiert, aber man kann zum Beispiel keine untypische Sprache ohne OOP entwickeln.

 
Реter Konow:

Ich verstehe nicht, warum nicht eine Funktion "int Number_orders()" erstellt wird, die immer die obige Schleife durchführt und den Zählerwert "SELL" zurückgibt?

Nachdem ich die Klasse abgeschlossen habe, bekomme ich x.SELL x.BUY x.ALL und alles andere, was ich brauche. Und es wird sehr einfach sein, sie anzusprechen. OOP-Klassen - der Einfachheit halber
 
Dmitry Fedoseev:

Spezifische Aufgabe. Der Kunde hat einen Expert Advisor für zwei MAs bestellt, der alle in der Codebasis verfügbaren Trailing-Varianten enthalten würde, aber im Tester nicht verlangsamt wird.

Und mit der Aussicht, dass in Zukunft weitere Varianten hinzugefügt werden (nicht teuer).

Verstehe, das ist ein unbestreitbares Argument zugunsten von OOP. Dummheit des Kunden und Zeitmangel, um dagegen anzukämpfen, und mangelnde Bereitschaft, den Algorithmus eines anderen zu verbessern). Ja, Sie brauchen in diesem Fall OOP. Ich stimme zu).
 
STARIJ:
Wenn ich die Klasse verfeinere, erhalte ich x.SELL x.BUY x.ALL und was sonst noch benötigt wird. Und es wird sehr einfach sein, sie anzusprechen. OOP-Klassen - der Einfachheit halber
Durch eine Feinabstimmung der Funktion können Sie alle diese Variablen in einem Array erhalten, das Sie an diese Funktion übergeben. Dann verwenden Sie es wie vorgesehen...
 
СанСаныч Фоменко:

Erstellen Sie ein Array mit Funktionsnamen, wählen Sie einen Namen aus dem Index und rufen Sie ihn auf.


Das hat nichts mit OOP zu tun. Dies ist eine sprachliche Einschränkung, die sie mit Hilfe von OOP zu lösen versuchen.

Es gibt keinen Funktionsaufruf mit dem als String definierten Namen. Und in den Sprachen, in denen es so etwas gibt, geschieht das über einen Hash einer Tabelle, das heißt, es ist ein schrecklicher Nachteil.

Ein normaler Weg, dieses Problem zu lösen, wäre die Verwendung von Zeigern auf Funktionen (darüber habe ich hier geschrieben). Aber warum nur Zeiger verwenden, es gibt einen bequemeren Weg - OOP, der es nicht nur erlaubt, die Vorteile von Funktionszeigern zu nutzen, sondern auch Daten und Code bequem zu strukturieren.