Eine Frage an die OOP-Experten. - Seite 6

 
Реter Konow:

Der Code ist nicht portabel - das ist seine Besonderheit. Sie ist nicht für den Transport gedacht. Sie hat einen anderen Zweck. Nun, der globale Geltungsbereich von Variablen ist ein leistungsfähiges Instrument zur Implementierung komplexer Mechanismen. Man muss nur wissen, wie man es benutzt. Wenn man mir von versteckten Fehlern und Bugs erzählt, bin ich verwirrt. Ich hatte noch nie Fehler im Zusammenhang mit der Sichtbarkeit globaler Variablen. Mit einem Wort, überhaupt nicht.

Das Problem mit globalen Variablen besteht darin, dass es bei einem großen Projekt, bei dem Änderungen am Zustand dieser Variablen aus vielen Codeabschnitten stammen, recht zeitaufwändig ist, nach Fehlern zu suchen.

Beispiel. Ein Fehler wird gefunden, weil der Wert einer globalen Variable eindeutig nicht dem entspricht, was er sein sollte. Das Projekt umfasst ein paar Dutzend Dateien und 100500 Codezeilen. Keiner weiß mehr, wie viele Codefragmente diese Variable verändert. Das Ergebnis ist ein Glas Kaffee und ein tiefer Schlaf, während der Kopf in der Tastatur steckt.

Und jetzt das Gleiche, aber OOP. Wir haben den Code korrekt geschrieben und alle Felder sind privat. Dementsprechend wird sie direkt nur in Klassenmethoden geändert und von außen nur durch die Methode Set. Dementsprechend setzen wir Haltepunkte an der Set-Methode und wie viele Methoden es in der Klasse gibt, wo das Feld geändert wird, und wir können leicht verfolgen, wo Änderungen vorgenommen werden und wo sie falsch geändert wurden.

 
Реter Konow:

Ich hatte noch nie Fehler im Zusammenhang mit der Sichtbarkeit globaler Variablen. Ganz und gar nicht.

Ich weiß nicht einmal, wie ich Sie von dem Offensichtlichen überzeugen soll, aber das sollte ich wahrscheinlich auch nicht, denn ich werde ja nicht dafür bezahlt, oder?

Wenn Sie Lob wollen, bitte sehr:

Peter! Gut gemacht!

))))

 
Vladimir Simakov:

Das Problem mit globalen Variablen besteht darin, dass es bei einem großen Projekt, bei dem Änderungen am Zustand dieser Variablen aus vielen Codeabschnitten stammen, recht zeitaufwändig ist, nach Fehlern zu suchen.

Beispiel. Ein Fehler wird gefunden, weil der Wert einer globalen Variable eindeutig nicht dem entspricht, was er sein sollte. Das Projekt umfasst ein paar Dutzend Dateien und 100500 Codezeilen. Niemand weiß mehr, wie viele Codefragmente diese Variable ändert. Das Ergebnis ist ein Glas Kaffee und ein tiefer Schlaf, während der Kopf in der Tastatur steckt.

Und jetzt haben wir das Gleiche, aber es ist OOP. Wir haben den Code korrekt geschrieben und alle Felder sind privat. Dementsprechend wird sie nur in Klassenmethoden direkt geändert, von außen aber nur durch die Set-Methode. Dementsprechend setzen wir Haltepunkte an der Set-Methode und an der Anzahl der Methoden in der Klasse, an denen das Feld geändert wird, und können so leicht nachvollziehen, wo Änderungen vorgenommen werden und wo sie falsch geändert wurden.

Aus der Praxis. Ich habe mehr als 100 verbundene Dateien in meinem Projekt. Einige von ihnen haben mehr als 2000 Codezeilen. Globale Variablen werden überall verwendet. Ich hatte nie irgendwelche Fehler im Zusammenhang mit ihrer Globalität. Vielleicht habe ich mich nur angepasst?)) Vielleicht gibt es keine Bugs, weil alle Variablen auf Russisch sind und alle Namen sinnvoll sind. Kein sdf oder iukj. Daher habe ich keine Fehler mit ihnen verbunden. Im Allgemeinen werden globale Variablen für globale Ereignisflags verwendet, z.B. für das Öffnen eines Fensters, das Anklicken von Maustasten, das Erweitern einer alten Liste, usw.. Auch für den Fokus. Mit anderen Worten, die Maus fährt durch die GUI, und die Nummern aller Objekte und Elemente und ihre Eigenschaften werden in globale Variablen geschrieben, und die erforderlichen Blöcke werden von OnChartEvent aufgerufen, die sofort mit den Objekten und Elementen im Fokus arbeiten. Das ist sehr praktisch.
 
Igor Makanu:

Ich weiß nicht einmal, wie ich Sie von dem Offensichtlichen überzeugen soll, aber das sollte ich wahrscheinlich auch nicht, denn ich werde ja nicht dafür bezahlt, oder?

Wenn Sie Lob wollen, dann bitte sehr:

Peter! Gut gemacht!

))))

Ich erreiche nichts. Nun, vielleicht verstehen, dass man nicht nur mit OOP coole Projekte schreiben kann. Und es ist nicht nur die Beherrschung von OOP, die ein Zeichen für einen Entwickler ist. Ich bestreite nicht, dass man viele Aufgaben mit OOP lösen kann. Aber es gibt auch andere Ansätze.
 
Ich danke Ihnen allen für die Teilnahme an der Diskussion. Ich werde versuchen, in OOP einzusteigen, um die Möglichkeiten der beiden Ansätze wirklich zu vergleichen. Ich interessiere mich für die Hierarchie, die OOP bieten kann, und wenn ihr Nutzen nicht unter der Syntax begraben wird, werde ich sie definitiv übernehmen.
 
Реter Konow:
Nun, vielleicht das Verständnis dafür, dass man nicht nur mit OOP coole Projekte schreiben kann. Und nicht nur die Beherrschung von OOP ist ein Zeichen für einen Entwickler. Ich bestreite nicht, dass man viele Aufgaben mit OOP lösen kann. Aber es gibt auch andere Ansätze.

es geht nicht um OOP, sondern um die Prinzipien des Codeschreibens selbst. Dies ist das zweite Mal, dass ich darüber spreche, und@Vladimir Simakov hat oben ein Beispiel geschrieben

Wenn Sie die Sichtbarkeit globaler Variablen verwenden wollen - kein Problem, niemand verbietet es, Sie können es tun - aber leise, während niemand zuschaut! )))

aber als ein ständig benutzter Stil, Programme zu schreiben, ist es böse, und je mehr Code, desto mehr von diesem Bösen - so haben Sie erklärt?)

SZY: ein weiterer Testschuss - schauen Sie sich die MQL-Hilfe an, sehen Sie, dass alle Funktionen als separate, völlig unabhängige Einheiten erstellt werden? - die Parameter übergeben = das Ergebnis erhalten! Glauben Sie, dass die Metakvot-Programmierer wieder alles falsch machen? Wir sollten einige freie Schreibweisen für Funktionen verwenden - hier im globalen Bereich, und hier wird der Benutzer die Funktion aufrufen und das Ergebnis erhalten! )))) - der prozedurale Stil (bei dem jedes Unterprogramm ein vollständiger logischer Block ist) ist der richtige Code, schreiben Sie die Codes richtig! nicht der richtige ... na ja, das kommt von alleine, "wenn man es schnell braucht" ;)

 
Реter Konow:
Aus der Praxis. Ich habe mehr als 100 verbundene Dateien in meinem Projekt. Einige von ihnen haben mehr als 2000 Codezeilen. Globale Variablen werden überall verwendet. Ich hatte nie irgendwelche Fehler im Zusammenhang mit ihrer Globalität. Vielleicht habe ich mich einfach daran gewöhnt?))

Sie haben einfach ein sehr gutes Gedächtnis. Nicht jeder hat dieses Glück. Ich kann mich schon schwach daran erinnern, welche Variablen ich heute eingegeben habe. Ich weiß nicht mehr, welche von vor einer Woche. Aber das ist kein Problem, sie sind alle lokal und der Zugriff auf die Felder eines Objekts erfolgt nur über entsprechende Funktionen. OOP erlaubt es mir, mich an viele Dinge nicht zu erinnern, ich habe das schon mehr als einmal gesagt - idealerweise sollte man an jeder Stelle des Codes nur Zugriff auf das haben, was man braucht, und keine weiteren Variablen - also selbst wenn man will, kann man nicht ändern, was man nicht soll. Und wenn Sie es wirklich brauchen, müssen Sie herausfinden, warum Sie nicht auf eine Variable zugreifen können - entweder ist es nur ein Versehen, oder es handelt sich um eine Variable, deren Änderung zusätzliche Arbeit erfordert. Wenn es Ihnen sofort zur Verfügung stünde, würden Sie es vergessen, und dann würde es lange dauern, bis Sie herausfinden, warum das Programm nicht oder nicht so funktioniert, wie Sie es wollen.

 
Реter Konow:
Ich versuche nicht, etwas zu erreichen. Nun, vielleicht verstehen, dass man nicht nur mit OOP coole Projekte schreiben kann. Und es ist nicht nur die Beherrschung von OOP, die ein Zeichen für einen Entwickler ist. Ich bestreite nicht, dass man viele Aufgaben mit OOP lösen kann. Aber es gibt auch andere Ansätze.

Ein weiterer Vorteil von OOP ist, dass man nach und nach Klassenbibliotheken erwirbt, vor allem wirklich universelle, die einen ein Leben lang begleiten und dieses Leben erleichtern.

Bei einem realen Projekt funktioniert es wirklich. Sie müssen lediglich die Anzahl und den Status der verfügbaren Aufträge/Positionen überwachen. Diese Funktion kontrolliert nur, dass die Position/der Auftrag nicht geschlossen/storniert wird und entfernt sie/ihn nach dem Schließen aus der Liste.

void OrdersControl(){
   for (CTrade* it=gPos.Begine();
        it!=NULL;
        it=it.Control()?gPos.Next():gPos.Delete());}

Wo gPos ist CList<CTrade> gPos

CList und CTrade sind nicht in der Standardbibliothek enthalten.

CTrade wird von meiner eigenen Bibliothek CPosition geerbt.

Im Folgenden finden Sie alle CTrade, die Sie benötigen, um Ihren Projektcode lesbar zu machen:

#include "..\Header.mqh"

#ifndef _C_TRADE_
#define _C_TRADE_

#include "..\..\..\Shared Projects\mqlLib\Objects\Trade\CPosition.mqh"

class CTrade:public CPosition
  {
public:
                     CTrade(double mVolume,int mDirect,double mSL,double mTP);
   bool              Control() {return !( CPosition::Control()&TRADE_FINISH);}
  };
//-------------------------------------------------------------------------------------
void CTrade::CTrade(double mVolume,int mDirect,double mSL,double mTP):
   CPosition(NULL,
             mDirect>0?OP_BUY:OP_SELL,
             mVolume,
             0.0,
             mSL,
             mTP)
{}

#endif
Die gesamte Implementierung der Auftrags-/Positionsbearbeitung ist in der plattformübergreifenden CPosition-Bibliotheksdatei verborgen.
 
Реter Konow:
Ich danke Ihnen allen für die Teilnahme an der Diskussion. Ich werde versuchen, mich in OOP zu vertiefen, um die Möglichkeiten der beiden Ansätze wirklich zu vergleichen. Ich interessiere mich für die Hierarchie, die OOP bieten kann, und wenn ihr Nutzen nicht unter der Syntax begraben ist, werde ich sie sicherlich übernehmen.

Bedienen Sie sich auf YouTube. Da gibt es eine Menge zu sehen. Vor allem in Englisch, das Sie gut beherrschen.


Sparen Sie keine 45 Minuten, Peter. Zu Beginn ist es sehr wichtig zu verstehen, worüber dieser Mann spricht. Viele Leute werden ihm wahrscheinlich widersprechen, aber im Allgemeinen hat er Recht:


 
Nikolai Semko:

Bedienen Sie sich auf YouTube. Da gibt es eine Menge zu sehen. Vor allem in Englisch, das Sie gut beherrschen.


Sparen Sie keine 45 Minuten, Peter. Zu Beginn ist es sehr wichtig zu verstehen, wovon dieser Mann spricht. Viele Leute werden ihm wahrscheinlich widersprechen, aber im Allgemeinen hat er Recht:


Vielen Dank, Nikolai. Ich werde die Augen offen halten.
Grund der Beschwerde: