Alternative Implementierungen von Standardfunktionen/-ansätzen - Seite 8

 
fxsaber:

Ein Beispiel für meinen Stil?

Zum Beispiel dies:

return((int)((Value > 0) ? Value / Points[digits] + HALF_PLUS : Value / Points[digits] - HALF_PLUS) * Points[digits]);

Stellen Sie sich vor, Sie haben 100 Funktionen und jede davon gibt einen solchen Datensatz zurück. Sie suchen nach einem Fehler unter diesen Einträgen. Wie lange werden Sie für die Suche brauchen?

 
Реter Konow:

Zum Beispiel dies:

Stellen Sie sich vor, Sie haben 100 Funktionen, von denen jede diesen Datensatz zurückgibt. Sie suchen nach einem Fehler unter diesen Einträgen. Wie lange werden Sie für die Suche brauchen?

Ich würde nicht länger als ein paar Minuten suchen, zumal ein Datensatz in diesem Stil die Möglichkeit bietet, mehr als ein paar Dutzend Funktionen in "einem Bildschirm" anzuzeigen, was die Arbeit mit dem Code erleichtert

 
Реter Konow:

Zum Beispiel dies:

Stellen Sie sich vor, Sie haben 100 Funktionen, von denen jede diesen Datensatz zurückgibt. Sie suchen nach einem Fehler unter diesen Einträgen. Wie lange wird es dauern, bis Sie es finden?

Glauben Sie mir, wenn ich solche Texte schreibe, dann nicht um des Stils oder des Prinzips der Kürze willen, sondern weil es für mich wirklich viel einfacher ist.

Sie haben den einfachsten Weg genannt. Ehrlich gesagt, ich wüsste nicht, was daran auch nur im Geringsten verwirrend sein sollte.

Ich muss gestehen, dass ich C++-Code nicht lesen kann, weil ich ihn überhaupt nicht kenne. Aber die Leute schreiben darin. Es ist also nur eine Frage der Unwissenheit.

 
fxsaber:

Glauben Sie mir, wenn ich es so schreibe, dann nicht um des Stils oder der Kürze willen, sondern weil es für mich wirklich einfacher ist.

Sie haben die einfachsten Begriffe zitiert. Ehrlich gesagt, verstehe ich nicht, was daran auch nur im Geringsten verwirrend sein könnte.

Ich muss gestehen, dass ich C++-Code nicht lesen kann, weil ich ihn überhaupt nicht kenne. Aber die Leute schreiben darin. Es ist also nur eine Frage der Unwissenheit.

Vielleicht haben wir unterschiedliche Vorstellungen von der Einfachheit des Codes.

Ich weiß, dass Sie ein großer Profi in Sachen Programmierung sind. Aber wenn man in allem die höchste Produktivität anstrebt, sollte man dieArbeitsproduktivität nicht vergessen. Es beginnt mit der Lesbarkeit des Codes. Mir ist nicht klar, warum der Drang zur Komprimierung des Codes auf Kosten der Lesbarkeit des Codes gerechtfertigt ist, aber bei großen (unabhängigen) Projekten ist er völlig inakzeptabel.


Ehrlich gesagt, ich hasse C++, weil es zu unlesbar ist. Für die Anhäufung von Einheiten, deren Existenz leicht vermieden werden könnte. Und es kann nur noch besser werden. Geräumig.

SZU: Ich bin der Meinung, dass bei der Entwicklung der Code nicht auf Kosten der Lesbarkeit, sondern auf Kosten besserer Lösungen komprimiert werden sollte, wobei er so lesbar wie möglich bleiben sollte. Die Geschwindigkeit, mit der Sie den Code verstehen, hat einen großen Einfluss auf Ihre eigene Produktivität.

ZSY: Das Thema ist großartig. Ich danke Ihnen.

Productivity - США - MetaTrader 5
Productivity - США - MetaTrader 5
  • www.metatrader5.com
Индекс производительности труда показывает изменение объема выпущенной продукции, приходящегося на одного работника. Этот показатель полезен для предсказания инфляции и прироста объема производства. Если стоимость труда увеличивается соответственно увеличению производительности, и, кроме того, маловероятно увеличение производственных издержек...
 
Renat Fatkhullin:
Überlegen Sie sich, was Sie außerhalb einer ganzen Zahl erhalten werden.

Die Prüfung auf LONG_MAX - sollte also vor der Umwandlung von double in long erfolgen. Die Rundungsfunktion ist eindeutig nicht für Werte gedacht, die nicht in eine Ganzzahl passen. Und das ändert nichts an dem Problem.

Wenn die Funktion double zurückgibt, das wir dann in long umwandeln, besteht die gleiche Gefahr eines Überlaufs.

Ich persönlich achte kurz vor dem Runden - ich habe immer eine Assert-Prüfung für Grenzwerte, plus die Logik des Programms - immer darauf, dass die Konvertierung nie mehr als den Maximalwert für eine ganze Zahl erreichen kann.

 
Vitaly Muzichenko:

Ich würde nicht länger als ein paar Minuten suchen, vor allem, weil man mit dieser Schreibweise mehr als ein paar Dutzend Funktionen auf einem einzigen Bildschirm anzeigen kann, was die Arbeit mit dem Code erleichtert

Daran habe ich meine Zweifel.

Hier ist der aktuelle Code meiner Funktion, die die Art der Ausführung zurückgibt (der Code wurde von fxsaber vorgeschlagen, wofür ich ihm sehr dankbar bin):

// Для МТ4 - возвращает otfFilingType. // Для МТ5 - возвращает тип исполнения ордера, равный otfFilingType, если он доступен на символе strSymbol, иначе - корректный вариант. ENUM_ORDER_TYPE_FILLING CSymbolInfo::GetTypeFilling(string strSymbol,ENUM_ORDER_TYPE_FILLING otfFilingType = ORDER_FILLING_FOK) {    #ifndef __MQL5__       return(otfFilingType);    #else // __MQL5__          // Функцию предложил fxsaber. Серьезной проверки не было - полагаемся на его авторитет.          const ENUM_SYMBOL_TRADE_EXECUTION steExeMode = (ENUM_SYMBOL_TRADE_EXECUTION)::SymbolInfoInteger(strSymbol, SYMBOL_TRADE_EXEMODE);    const int iFillingMode = (int)::SymbolInfoInteger(strSymbol, SYMBOL_FILLING_MODE);

   return((iFillingMode == 0 || (otfFilingType >= ORDER_FILLING_RETURN) || ((iFillingMode & (otfFilingType + 1)) != otfFilingType + 1)) ?          (((steExeMode == SYMBOL_TRADE_EXECUTION_EXCHANGE) || (steExeMode == SYMBOL_TRADE_EXECUTION_INSTANT)) ?            ORDER_FILLING_RETURN : ((iFillingMode == SYMBOL_FILLING_IOC) ? ORDER_FILLING_IOC : ORDER_FILLING_FOK)) :           otfFilingType);      #endif // __MQL5__ };

Die Funktion funktioniert wirklich gut. Ich habe es mehrmals überprüft und es sind keine Fehler aufgetreten. Aber ich verstehe immer noch nicht, wie das Ergebnis bei dieser schrecklichen Rückgabe zustande kommt, trotz meiner eigenen ziemlich guten Erfahrung. fxsaber hat außerdem auf die Frage geantwortet, dass er sich selbst nicht daran erinnern kann.

Vitaly, sagen Sie mir, wie dieser Code funktioniert, wenn es nicht zu schwierig für Sie und Sie "verstehen es in ein paar Minuten" in diesem Stil!

Ich würde im Rückgabeoperator"Klammern öffnen", alle "Fragen" durch "wenn" ersetzen und gefundene Werte durch logisches "oder" zurückgeben. Mich persönlich stört der Operator "Frage" überhaupt nicht. Es ergibt genau den gleichen Code wie ein ähnliches if, aber seine Lesbarkeit ist viel schlechter.

 
Georgiy Merts:

Ich habe da so meine Zweifel.

Hier ist der aktuelle Code meiner Funktion, die den Ausführungstyp zurückgibt (der Code wurde von fxsaber vorgeschlagen, wofür ich ihm sehr dankbar bin):

Die Funktion funktioniert wirklich gut. Ich habe es mehrmals überprüft und es sind keine Fehler aufgetreten. Allerdings verstehe ich immer noch nicht, wie das Ergebnis bei dieser schrecklichen Rückgabe zustande kommt, trotz meiner eigenen recht guten Erfahrung. fxsaber hat außerdem auf die Frage geantwortet, dass er sich selbst nicht daran erinnern kann.

Vitaly, sagen Sie mir, wie dieser Code funktioniert, wenn es nicht zu schwierig für Sie und Sie "verstehen es in ein paar Minuten" in diesem Stil!

Ich würde im Rückgabeoperator"Klammern aufmachen", alle "Frage" durch "wenn" ersetzen und gefundene Werte per logischem "oder" zurückgeben. Mich persönlich stört der "Frage"-Operator überhaupt nicht. Es ergibt genau den gleichen Code wie ein ähnliches if, aber seine Lesbarkeit ist viel schlechter.

Ich werde den Code nicht interpretieren, aber ich habe einmal ein Stück aus meiner Vorlage gepostet, und es gibt einen ähnlichen Ansatz. Ich mag es nicht, wenn die Wenns auf zwei Bildschirmseiten verteilt werden.

 
Реter Konow:

vergessen Sie nicht dieArbeitsproduktivität. Das beginnt bei der Lesbarkeit des Codes.

Ein Beispiel für meinen Code, den ich im Moment überhaupt nicht verstehe. Und es gibt eine Reihe von Faktoren, die Sie sehr gut verstehen müssen.

Forum zum Thema Handel, automatisierte Handelssysteme und Strategietests

Abfolge der Ausführung von Init() und DeInit()

fxsaber, 2017.04.14 23:35

  bool Check( void ) const
  {
    static bool FirstRun = true;
    static bool FirstRunInit = true;

    if (FirstRun && (!::GlobalVariableCheck(this.GlobalName)))
    {
      FirstRun = (::GlobalVariableSet(this.GlobalName, 0) == 0);

      if (!FirstRun)
      {
        ::EventKillTimer();

        ::OnInit();
        FirstRunInit = false;
      }
    }
    else if (FirstRun)
      ::EventSetMillisecondTimer(1);
    else
      FirstRunInit = true;

    return(FirstRun || !FirstRunInit);
  }

Wie Sie sehen können, ist der Code/Stil sehr einfach. Aber ich werde nur dann in der Lage sein, einen Fehler darin oder sein Fehlen zu erkennen, wenn ich denselben Code neu schreiben kann. Es wird wirklich viel Zeit in Anspruch nehmen, da ich das Problem vollständig verstehen muss.

Deshalb ist das Prinzip, dass komplexe Dinge in der Erstellungsphase bereinigt werden (Stresstests werden geschrieben) und in einfacher Form durch Einfügen von mqh verwendet werden. Wie Sie sehen, wird die Komplexität nicht immer durch Stil oder Kürze bestimmt.


Es gibt auch ein Beispiel für rein sprachliche Konstrukte - TypeToBytes. Die Komplexität des Verständnisses ist dort eine ganz andere. Und das ist der Punkt, an dem ich ohne Makros verkümmern würde. Dank der Makros gelangen Sie recht schnell in den Quellcode. Denn Makros werden oft nicht aus Gründen der Kürze, sondern des Verständnisses verwendet.


Und es gibt auch den Fall, dass man viele unkomplizierte, aber vergessliche Fallstricke beachten muss. Dies ist bei MT4Orders der Fall. Deshalb sind manche Zeilen dort mit Kommentaren versehen, die nur an einen selbst gerichtet sind. Es hilft, Ihren Code zu verstehen.


Beachten Sie aber, dass es sich dabei um mqh handelt, die Sie nicht zu kennen brauchen. Und der Code von TC ist mit mqh geschrieben, was sehr einfach ist. Sie haben keinen Einblick in den Quellcode der regulären iHigh-Funktionen. Und sie sind in der Tat Ungeheuer. Man benutzt sie einfach. Sie sollten dasselbe mit Bibliotheken tun. Um dieselbe generische Schreibweise zu verwenden, müssen Sie sie nicht vollständig verstehen.


Sehen Sie sich die QB für MT4 EAs und ihre MT5 Ports an. MT5-Ports sind schwer zu verstehen. Es riecht nicht nur nicht annähernd nach Prägnanz (der Code ist um ein Vielfaches größer als das Original), sondern enthält auch klappernde MT5-Fallen, die in den mqh-Dateien nicht berücksichtigt sind.

 
Vitaly Muzichenko:

Ich werde den Code nicht interpretieren, aber ich habe einmal ein Stück aus meiner Vorlage gepostet, und es gibt einen ähnlichen Ansatz. Ich mag es nicht, wenn die Wenns in zwei Bildschirmrollen gestreckt werden.

In diesem Fall ist es ratsam, Funktionen zu verwenden.

Und die Tatsache, dass Sie den Code nicht interpretiert haben, zeigt, dass Sie auch nicht auf Anhieb herausfinden können, wie er funktioniert. Sie müssen die Klammern, die "Fragen" und das logische "oder" gründlich analysieren. Eine solche "Anhäufung" ist jedoch in sehr begrenzten Fällen akzeptabel, wenn dadurch ein effizienterer Code für den "Flaschenhals" des Programms entsteht. In diesem Fall kann die Ermittlung der Ausführungsart kein Engpass sein, und ein solcher Code ist hier unerwünscht. Ich verwende es ausschließlich aufgrund der Autorität von fxsaber und wiederholter Selbsttests. Dies ist jedoch eine Ausnahme. In der Regel verwende ich keinen Code, den ich nicht selbst bis ins Detail durchdacht habe.

 
Georgiy Merts:

Die Funktion funktioniert wirklich gut. Ich habe es mehrmals überprüft, es sind keine Fehler aufgetreten. Aber ich verstehe immer noch nicht, wie das Ergebnis bei dieser schrecklichen Rückgabe zustande kommt, trotz meiner, meiner Meinung nach, ausreichenden Erfahrung. fxsaber selbst hat übrigens auf die Frage geantwortet, dass er sich selbst nicht daran erinnert.

Es geht nicht um den Rückkehrer. Wenn Sie dieselbe Logik in Form von if-else beschreiben, werde ich sie nicht besser verstehen. Genau das ist der Fall, wenn man das Problem der "nicht unterstützten Füllung" sehr gründlich untersucht. Man muss eine Menge damit verbundenen Stresscode schreiben, eine Menge Konten auf verschiedenen Torus-Servern eröffnen und durch alle Symbole rennen. Auffinden von Mustern zwischen verschiedenen Kombinationen von Flaggen. Und schließlich, um alle Tabellen auf den gleichen Nenner zu bringen. Hier kommt das "ich kann mich nicht erinnern" ins Spiel.

Erreicht, dass das Problem nicht mehr auftritt und sicher vergessen. Es ist toll, wenn man nicht auf einmal geschriebenen Code zurückgreifen muss. Es funktioniert - das ist die Hauptsache.

Grund der Beschwerde: