Parler de l'OLP dans le salon - page 6

 
George Merts:

Cette fonction (et toutes celles qui commencent par un trait de soulignement) est une fonction protégée de la classe.

Eh bien, ils sont fusionnés en un seul !

Il n'existe qu'une seule fonction - Compare(), mais nous devons effectuer une comparaison en fonction de la clé transmise. En conséquence, l'une des fonctions particulières protégées est choisie. C'est pourquoi ils sont protégés (protected), afin que l'utilisateur ne puisse pas y accéder - ils ne sont appelés que depuis Compare() et cela est indiqué par le soulignement.

C'est également l'une des règles de conception du code - une fonction commençant par un trait de soulignement n'est pas destinée à être appelée par les utilisateurs, elle sert uniquement à certaines tâches en classe. Son accès est restreint.

Mais pourquoi de tels tours de passe-passe quand il est beaucoup plus facile de tout faire avec des classiques. Utilisez des fonctions enveloppantes et des accolades pour masquer les variables et les fonctions imbriquées et empêcher leur accès et vous serez satisfait. Vous ne ferez que vous embrouiller et embrouiller les autres avec ces protectoïdes...

 
Andrei:

Mais pourquoi de tels tours de cirque quand tout est beaucoup plus facile à faire via les classiques. Utilisez des fonctions enveloppantes et des accolades pour masquer les variables et les fonctions imbriquées et empêcher leur accès, et vous serez satisfait. Vous ne ferez que vous embrouiller et embrouiller les autres avec ces protections...

Je ne comprends pas... Protégé est un modificateur d'accès pour une fonction. C'est-à-dire qu'on utilise une fonction protectrice, à laquelle on ne peut accéder qu'à partir d'une fonction d'une classe ou de son descendant. De plus, le soulignement signifie pour moi personnellement qu'il y a certaines hypothèses implicites dont il faut tenir compte lors de son utilisation.

Dennis Kirichenko l'a bien noté - vous pourriez tout écrire dans une seule fonction Compare(). Mais il y aurait alors deux douzaines d'écrans, il serait irréaliste de le visualiser et plus difficile à modifier que maintenant.

Je n'ai laissé que le sélecteur de touche dans la fonction Compare(), tandis que le code qui effectue la comparaison pour des touches particulières est placé dans des fonctions séparées. Étant donné que ces fonctions sont très spécifiques au contexte, elles sont déclarées dans la section protégée de la classe, afin qu'on puisse y accéder exclusivement à partir d'une autre fonction de la classe ou d'un descendant. Et pour me rappeler également que ces fonctions sont destinées à exécuter une tâche spécifique et étroite au sein d'une autre fonction - je les commence par un soulignement. Si je rencontre une telle fonction à l'avenir, je verrai immédiatement qu'il existe des hypothèses implicites à prendre en compte lors de son appel.

Il semble que vous (disons "vous") ne sachiez pas vraiment ce que sont les modificateurs d'accès et pourquoi ils sont nécessaires.

 
George Merts:

Je ne comprends pas... Protégé est un modificateur d'accès pour une fonction. C'est-à-dire qu'on utilise une fonction protectrice, à laquelle on ne peut accéder qu'à partir d'une fonction d'une classe ou de son descendant. De plus, pour moi, le symbole du trait de soulignement signifie personnellement qu'il faut tenir compte de certaines hypothèses implicites lorsqu'on l'utilise.

Eh bien, vous pouvez restreindre l'accès à une fonction de manière classique, sans aucune POO.
 
Artyom Trishkin:

Mais pas d'insultes personnelles...

Veuillez nettoyer le fil de discussion de l'envahissement, ne laissez que les messages éducatifsd'Alexey Volchanskiy.
 
Andrei:
Eh bien, vous pouvez limiter l'accès à la fonction par des moyens classiques, sans aucune POO.

Comment ?

La tâche consiste à faire en sorte qu'à l'avenir, lors de la modification du code, il soit impossible de prendre et d'utiliser une certaine fonction "n'importe où". Comment le faire sans restriction OOP de l'accès à l 'espace de classe à l'aide de modificateurs public-protégé-privé ?

 

Apparemment, static et const (ce n'est pas de la POO) ne sont pas nécessaires.

Quant à la POO, très intéressant, comment la fonction suivante, qui a une large application pratique (pas du tout abstraite), ressemblerait-elle en style procédural ?

Forum sur le trading, les systèmes de trading automatisés et les tests de stratégie

Organiser un cycle de débordement des commandes

fxsaber, 2017.10.18 12:29

Version sans référence à l'histoire.
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);
}

Cette version est particulièrement pertinente pour MT5 sur VPS, car MT5 est très lent et coûteux en calcul avec History.

Il est évident que toute POO peut être réécrite en style procédural. Mais c'est la pratique qui m'intéresse. J'ai donc pris le petit code ci-dessus, où la POO est utilisée au minimum.

Alors, à quel point le style procédural est-il plus agréable/plus pratique/plus lisible/plus correct que la POO dans cet exemple ? Eh bien, pas pour parler pendant quelques pages, mais juste pour comparer le code source court procédural contre OOP. Je demande aux adversaires d'OOP de montrer un cours magistral. Il ne s'agit pas du redoutable MT5, mais du bon vieux MT4.

 
Vladimir Pastushak:
Veuillez nettoyer ce fil de discussion de l'envahissement, ne laissez que les messages éducatifsd'Alexey Volchanskiy.

Il est tard )))) d'autant plus que je ne pourrai trouver du temps que ce week-end, il s'est avéré soudainement très occupé

Je ferai quelques études ce week-end, peut-être aussi des vidéos.

 
Vladimir Pastushak:
Veuillez nettoyer le fil de discussion de l'inondation, ne laissez que les messages éducatifsd'Alexey Volchanskiy.

Vladimir, si vous n'avez pas appris pendant toutes ces années, il est trop tard pour commencer ;).

 
fxsaber:

Apparemment, static et const (ce n'est pas de la POO) ne sont pas nécessaires.

En ce qui concerne la POO, il est très intéressant de savoir à quoi ressemblerait la prochaine fonction, qui a une large application pratique (pas du tout abstraite), dans un style procédural ?

Évidemment, toute POO peut être réécrite en style procédural. Mais c'est la pratique qui m'intéresse. J'ai donc pris le petit code ci-dessus, où la POO est également utilisée au minimum.

Alors, à quel point le style procédural est-il plus agréable/plus pratique/plus lisible/plus correct que la POO dans cet exemple ? Eh bien, pas pour parler pendant quelques pages, mais juste pour comparer le code source court procédural contre OOP. Je demande aux opposants à OOP de montrer une classe de maître. Il ne s'agit pas du redoutable MT5, mais du bon vieux MT4.

Tu deviens trop alambiqué même dans ce simple exemple. Il est toujours plus facile de réécrire la programmation opérationnelle que de comprendre le code de quelqu'un d'autre. .... Que voulez-vous faire, dites-le-moi au moins en langage humain clair ? Découvrez ce qui a changé dans l'historique des commandes.
 
Vasiliy Sokolov:

Vladimir, si après toutes ces années ils n'ont toujours pas appris, je pense qu'il est trop tard pour commencer ;)


Puis-je demander qui ils sont et ce qu'ils n'ont pas appris? Les modérateurs n'ont pas appris à nettoyer ou autre chose).

ZS : A propos, dans tout le fil de discussion, je n'ai pas vu un seul souhait de couvrir un quelconque sujet, comme toujours, la rancœur habituelle. J'ai donc décidé d'enregistrer des vidéos sur YouTube en partant de zéro sur le fonctionnement de la POO, au moins cela aura une certaine utilité. De toute façon, dans quelque temps, la branche se retrouvera dans le branch_sucker.