Gespräche über die PLO in der Lounge - Seite 6

 
George Merts:

Dies (und alles, was mit einem Unterstrich beginnt) ist eine geschützte Funktion der Klasse.

Nun, sie sind zu einer Einheit verschmolzen!

Es gibt nur eine Funktion - Compare(), aber wir müssen einen Vergleich anhand des übergebenen Schlüssels durchführen. Dementsprechend wird eine der besonders geschützten Funktionen ausgewählt. Deshalb sind sie geschützt (protected), so dass der Benutzer keinen Zugriff auf sie hat - sie werden nur von Compare() aufgerufen, was durch Unterstreichung angezeigt wird.

Dies ist auch eine der Regeln für die Gestaltung des Codes - eine Funktion, die mit einem Unterstrich beginnt, ist nicht dafür gedacht, von Benutzern aufgerufen zu werden, sie dient nur bestimmten klasseninternen Aufgaben. Der Zugang zu ihr ist eingeschränkt.

Aber warum solche Zirkustricks, wenn es doch viel einfacher ist, alles mit Klassikern zu machen. Verwenden Sie Wrapper-Funktionen und geschweifte Klammern, um verschachtelte Variablen und Funktionen zu verbergen und den Zugriff auf sie zu verhindern, und Sie werden zufrieden sein. Mit diesen Protektoiden verwirren Sie nur sich selbst und andere...

 
Andrei:

Aber warum solche Zirkustricks, wenn alles viel einfacher mit den Klassikern zu machen ist. Verwenden Sie Wrapper-Funktionen und geschweifte Klammern, um verschachtelte Variablen und Funktionen zu verbergen und den Zugriff auf sie zu verhindern, und Sie werden zufrieden sein. Mit diesen Protexteds verwirren Sie nur sich selbst und andere...

Ich versteh das nicht... Geschützt ist ein Zugriffsmodifikator für eine Funktion. Das heißt, es wird eine Schutzfunktion verwendet, auf die nur von einer Funktion einer Klasse oder ihrer Nachkommenschaft aus zugegriffen werden kann. Außerdem bedeutet der Unterstrich für mich persönlich, dass es einige implizite Annahmen gibt, die bei seiner Verwendung berücksichtigt werden müssen.

Dennis Kirichenko hat richtig bemerkt, dass man alles in eine einzige Compare()-Funktion schreiben könnte. Aber dann wären es zwei Dutzend Bildschirme, es wäre unrealistisch, sie zu sehen und schwieriger zu ändern als jetzt.

Ich habe nur den Schlüsselselektor in der Funktion Compare() belassen, während der Code, der den Vergleich für bestimmte Schlüssel durchführt, in separaten Funktionen untergebracht ist. Da diese Funktionen sehr kontextspezifisch sind, werden sie im geschützten Bereich der Klasse deklariert, so dass auf sie ausschließlich von einer anderen Funktion der Klasse oder eines Nachfolgers aus zugegriffen werden kann. Und um mich auch daran zu erinnern, dass diese Funktionen dazu bestimmt sind, eine bestimmte, enge Aufgabe innerhalb einer anderen Funktion zu erfüllen - beginne ich sie mit einem Unterstrich. Wenn ich in Zukunft auf eine solche Funktion stoße, werde ich sofort sehen, dass es implizite Annahmen gibt, die beim Aufruf der Funktion berücksichtigt werden müssen.

Es scheint, als wüssten Sie (gemeint sind "Sie") nicht genau, was Zugangsmodifikatoren sind und warum sie benötigt werden.

 
George Merts:

Ich versteh das nicht... Geschützt ist ein Zugriffsmodifikator für eine Funktion. Das heißt, es wird eine Schutzfunktion verwendet, auf die nur von einer Funktion einer Klasse oder ihrer Nachkommenschaft aus zugegriffen werden kann. Außerdem bedeutet das Symbol des Unterstrichs für mich persönlich, dass es bei seiner Verwendung einige implizite Annahmen zu berücksichtigen gibt.

Nun, man kann den Zugriff auf eine Funktion auf klassische Weise beschränken, ohne OOP.
 
Artyom Trishkin:

Aber keine persönlichen Beleidigungen...

Bitte säubern Sie den Thread von Überschwemmungen und lassen Sie nur die lehrreichen Beiträgevon Alexey Volchanskiy übrig.
 
Andrei:
Nun, man kann den Zugriff auf die Funktion mit klassischen Mitteln begrenzen, ohne OOP.

Wie?

Die Aufgabe besteht darin, dafür zu sorgen, dass es in Zukunft nicht mehr möglich ist, bei der Änderung des Codes eine bestimmte Funktion "irgendwo" zu verwenden. Wie kann dies ohne OOP-Beschränkung desZugriffs auf den Klassenraum mit Hilfe von öffentlich-geschützten-privaten Modifikatoren geschehen?

 

Offensichtlich werden static und const (dies ist nicht OOP) nicht benötigt.

Was OOP betrifft, so ist es sehr interessant, wie die folgende Funktion, die eine breite praktische Anwendung hat (und überhaupt nicht abstrakt ist), im prozeduralen Stil aussehen würde.

Forum zum Thema Handel, automatisierte Handelssysteme und Strategietests

Organisieren eines Auftragsüberlaufs

fxsaber, 2017.10.18 12:29

Version ohne Bezug zur Geschichte.
struct HISTORY_UNIT
{
  long Ticket;
  int Type;
  double Lots; 
    
  HISTORY_UNIT( void ) : Ticket(::OrderTicket()), Type(::OrderType()), Lots(::OrderLots())
  {
  }

  bool operator !=( const HISTORY_UNIT &Unit ) const
  {
    return((this.Ticket != Unit.Ticket) || (this.Type != Unit.Type) || (this.Lots != Unit.Lots));
  }
      
  bool IsChange( void )
  {
    const HISTORY_UNIT Tmp;
    const bool Res = (this != Tmp);
    
    if (Res)
      this = Tmp;
      
    return(Res);
  }
};

// Возвращает true только в случае, если с последнего вызова произошли торговые изменения
bool IsChange( void )
{
  static HISTORY_UNIT History[];  

  const int Total = OrdersTotal();  
  bool Res = (ArraySize(History) != Total);

  for (int i = 0, j = Res ? ArrayResize(History, 0, Total) : 0; i < Total; i++)      
    if (OrderSelect(i, SELECT_BY_POS))
    {
      if (Res || (Res = History[j].IsChange()))
        ArrayResize(History, j + 1, Total);
      
      j++;
    }
  
  return(Res);
}

Diese Version ist besonders für MT5 auf VPS relevant, da MT5 mit History sehr langsam und rechenintensiv ist.

Natürlich kann jede OOP im prozeduralen Stil umgeschrieben werden. Aber es ist die Praxis, die mich interessiert. Also habe ich den obigen kleinen Code genommen, in dem OOP ebenfalls auf ein Minimum reduziert ist.

Wie viel schöner/bequemer/lesbarer/korrekter ist also der prozedurale Stil im Vergleich zu OOP in diesem Beispiel? Nun, nicht, um ein paar Seiten lang zu reden, sondern nur, um kurzen Quellcode prozedural vs. OOP zu vergleichen. Ich fordere die OOP-Gegner auf, eine Meisterklasse zu zeigen. Es handelt sich nicht um den gefürchteten MT5, sondern um den guten alten MT4.

 
Vladimir Pastushak:
Bitte säubern Sie diesen Thread von Überschwemmungen und lassen Sie nur die lehrreichen Beiträgevon Alexey Volchanskiy übrig.

Es ist spät )))) zumal ich nur dieses Wochenende Zeit finden werde, es ist plötzlich sehr voll geworden

Ich werde dieses Wochenende einige Studien durchführen, vielleicht auch einige Videos.

 
Vladimir Pastushak:
Bitte säubern Sie den Thread von Überschwemmungen und lassen Sie nur die lehrreichen Beiträgevon Alexey Volchanskiy übrig.

Vladimir, wenn du es in all den Jahren nicht gelernt hast, ist es zu spät, damit anzufangen;).

 
fxsaber:

Offensichtlich werden static und const (dies ist nicht OOP) nicht benötigt.

Was OOP betrifft, so ist es sehr interessant, wie die folgende Funktion, die eine breite praktische Anwendung hat (überhaupt nicht abstrakt), im prozeduralen Stil aussehen würde?

Natürlich kann jede OOP im prozeduralen Stil umgeschrieben werden. Aber ich bin an der Praxis interessiert. Also habe ich den obigen kleinen Code genommen, in dem OOP auch auf ein Minimum reduziert ist.

Wie viel schöner/bequemer/lesbarer/korrekter ist also der prozedurale Stil im Vergleich zu OOP in diesem Beispiel? Nun, nicht, um ein paar Seiten lang zu reden, sondern nur, um kurzen Quellcode prozedural vs. OOP zu vergleichen. Ich fordere die OOP-Gegner auf, eine Meisterklasse zu zeigen. Es handelt sich nicht um den gefürchteten MT5, sondern um den guten alten MT4.

Selbst bei diesem einfachen Beispiel werden Sie zu kompliziert. Es ist immer einfacher, OOP neu zu schreiben, als am Code eines anderen herumzupfuschen.... Was wollen Sie tun, sagen Sie es mir wenigstens in einfacher Sprache? Finden Sie heraus, was sich in der Auftragshistorie geändert hat.
 
Vasiliy Sokolov:

Vladimir, wenn sie es nach all den Jahren immer noch nicht gelernt haben, ist es wohl zu spät, damit anzufangen;)


Darf ich fragen, wer sie sind und was sie nicht gelernt haben? Die Moderatoren haben nicht gelernt zu putzen oder etwas anderes ).

ZS: Durch die Art und Weise, in der ganzen Thread nicht einen einzigen Wunsch, ein Thema zu decken, wie immer, die üblichen Groll gesehen. Also habe ich beschlossen, Videos auf YouTube aufzuzeichnen, die zeigen, wie OOP funktioniert, zumindest wird es nützlich sein. Wie auch immer, nach einer Weile wird die Verzweigung im branch_sucker landen.