Une question pour les experts de la POO. - page 6

 
Реter Konow:

Le code n'est pas portable - c'est sa particularité. Il n'est pas destiné à être portable. Il a un autre but. Eh bien, la portée globale des variables est un outil puissant pour mettre en œuvre des mécanismes complexes. Vous devez juste savoir comment l'utiliser. Quand les gens me parlent d'erreurs cachées et de bogues, je ne sais plus où donner de la tête. Je n'ai jamais eu de bogue lié à la visibilité des variables globales. En un mot, pas du tout.

Le problème avec les variables globales est que si le projet est suffisamment vaste et que les changements d'état de ces variables proviennent de nombreuses sections de code, la recherche de bogues prend beaucoup de temps.

Exemple. Un bogue est trouvé parce que la valeur d'une variable globale n'est clairement pas ce qu'elle devrait être. Il y a quelques dizaines de fichiers et 100500 lignes de code dans le projet. Personne ne se souvient du nombre de fragments de code que cette variable change. Le résultat est un pot de café et un sommeil profond avec la tête enfoncée dans le clavier.

Et maintenant la même chose, mais OOP. Nous avons écrit le code correctement et tous les champs sont privés. Par conséquent, il n'est modifié directement que dans les méthodes de la classe, et de l'extérieur que par la méthode Set. Par conséquent, nous plaçons des points d'arrêt sur la méthode Set et sur le nombre de méthodes qu'il y a dans la classe, là où le champ est modifié, et nous pouvons facilement suivre les endroits où les changements sont effectués et ceux où ils ont été modifiés de manière incorrecte.

 
Реter Konow:

Je n'ai jamais eu de bogue lié à la visibilité des variables globales. Pas du tout.

Je ne sais même pas comment vous convaincre de l'évidence, mais je ne devrais probablement pas, je ne suis pas payé pour ça, n'est-ce pas ?

Qu'est-ce que vous essayez de faire ? Eh bien, si vous voulez des éloges, voilà :

Peter ! Bien joué !

))))

 
Vladimir Simakov:

Le problème avec les variables globales est que si le projet est suffisamment vaste et que les changements d'état de ces variables proviennent de nombreuses sections de code, la recherche de bogues prend beaucoup de temps.

Exemple. Un bogue est trouvé parce que la valeur d'une variable globale n'est clairement pas ce qu'elle devrait être. Il y a quelques dizaines de fichiers et 100500 lignes de code dans le projet. Personne ne se souvient du nombre de fragments de code que cette variable change. Le résultat est un pot de café et un sommeil profond avec la tête enfoncée dans le clavier.

Et maintenant nous avons la même chose, mais c'est OOP. Nous avons écrit le code correctement et tous les champs sont privés. En conséquence, il ne sera modifié directement que dans les méthodes de la classe, mais de l'extérieur uniquement par la méthode Set. Par conséquent, nous plaçons des points d'arrêt sur la méthode Set et sur le nombre de méthodes que nous avons dans la classe, à l'endroit où le champ est modifié, et nous pouvons facilement suivre les endroits où les changements sont effectués et ceux où ils ont été modifiés de manière incorrecte.

De la pratique. J'ai plus de 100 fichiers connectés dans mon projet. Certains d'entre eux ont plus de 2000 lignes de code. Les variables globales sont utilisées partout. Je n'ai jamais eu de bugs liés à leur globalité. Peut-être que je me suis juste adapté ?)) Peut-être n'y a-t-il pas de bogues parce que toutes les variables sont en russe et que tous les noms sont significatifs. Pas de sdf ou d'iukj. Par conséquent, aucune erreur ne leur est associée. En général, les variables globales sont utilisées pour signaler des événements globaux, par exemple, l'ouverture d'une fenêtre, un clic sur les boutons de la souris, le développement d'une ancienne liste, etc... Aussi, pour la mise au point. En d'autres termes, la souris parcourt l'interface graphique et les numéros de tous les objets et éléments ainsi que leurs propriétés sont inscrits dans des variables globales. Les blocs requis sont appelés à partir de OnChartEvent, qui travaille immédiatement avec les objets et les éléments ciblés. C'est très pratique.
 
Igor Makanu:

Je ne sais même pas comment vous convaincre de l'évidence, mais je ne devrais probablement pas, je ne suis pas payé pour ça, n'est-ce pas ?

Qu'est-ce que vous essayez de faire ? Eh bien, si vous voulez des éloges, voilà :

Peter ! Bien joué !

))))

Je n'arrive à rien. Eh bien, peut-être en comprenant que ce n'est pas seulement avec la POO que l'on peut écrire des projets sympas. Et ce n'est pas seulement la maîtrise de la POO qui est un signe de développeur. Je ne dis pas que vous pouvez résoudre de nombreuses tâches avec la POO. Mais il existe d'autres approches.
 
Merci à tous d'avoir participé à la discussion. Je vais essayer de me mettre à la POO pour vraiment comparer les capacités des deux approches. Je suis intéressé par la hiérarchie que la POO peut fournir, et si son utilité n'est pas noyée sous sa syntaxe, je l'adopterai sans hésiter.
 
Реter Konow:
Eh bien, peut-être la compréhension du fait qu'il n'y a pas qu'avec la POO que l'on peut écrire des projets sympas. Et il n'y a pas que la maîtrise de la POO qui soit le signe d'un développeur. Je ne dis pas que vous pouvez résoudre de nombreuses tâches avec la POO. Mais il existe d'autres approches.

il ne s'agit pas de POO, il s'agit des principes d'écriture du code eux-mêmes, c'est la deuxième fois que j'en parle et@Vladimir Simakov a écrit un exemple ci-dessus

Si vous voulez utiliser la visibilité globale des variables - pas de problème, personne ne l'interdit, vous pouvez le faire - mais discrètement, pendant que personne ne regarde ! )))

mais en tant que style d'écriture de programmes utilisé de façon permanente, c'est un mal, et plus il y a de code, plus il y a de ce mal - ainsi l'avez-vous expliqué ? ))))

SZY : un autre essai - regardez l'aide MQL, vous voyez que toutes les fonctions sont faites comme des unités séparées, complètement indépendantes ? - passer les paramètres = obtenir le résultat ! Vous pensez que les programmeurs de Metakvot font encore tout de travers ? Nous devrions utiliser des styles libres d'écriture de fonctions - ici dans la portée globale, et ici l'utilisateur appellera la fonction et obtiendra le résultat ! )))) - le style procédural (où chaque sous-routine est un bloc logique complet) est le bon code, écrivez les codes correctement ! pas le bon ... eh bien, il viendra tout seul "quand vous en aurez besoin rapidement" ;)

 
Реter Konow:
De la pratique. J'ai plus de 100 fichiers connectés dans mon projet. Certains d'entre eux ont plus de 2000 lignes de code. Les variables globales sont utilisées partout. Je n'ai jamais eu de bugs liés à leur globalité. Peut-être que je me suis juste adapté à cela ?))

Vous avez juste une très bonne mémoire. Tout le monde n'a pas cette chance. Je me souviens déjà à peine des variables que j'ai saisies aujourd'hui. Je ne me souviens pas lesquelles d'il y a une semaine. Mais ce n'est pas un problème, ils sont tous locaux et l'accès aux champs de tout objet se fait uniquement par le biais de fonctions appropriées. La POO me permet de ne pas me souvenir de beaucoup de choses, je l'ai déjà dit plus d'une fois - idéalement, dans n'importe quel endroit du code, vous ne devriez avoir accès qu'à ce dont vous avez besoin et à aucune autre variable - ainsi, même si vous le voulez, vous ne pouvez pas changer ce que vous ne devriez pas. Et lorsque vous en aurez vraiment besoin, vous devrez comprendre pourquoi vous ne pouvez pas accéder à une variable- il s'agit simplement d'un oubli, ou plus souvent d'une variable dont la modification nécessite un travail supplémentaire. Si vous en disposiez immédiatement, vous les oublieriez, et il vous faudrait ensuite beaucoup de temps pour comprendre pourquoi le programme ne fonctionne pas ou ne fonctionne pas comme vous le souhaitez.

 
Реter Konow:
Je n'essaie pas d'atteindre quoi que ce soit. Eh bien, peut-être en comprenant que ce n'est pas seulement avec la POO que l'on peut écrire des projets sympas. Et ce n'est pas seulement la maîtrise de la POO qui est un signe de développeur. Je ne dis pas que vous pouvez résoudre de nombreuses tâches avec la POO. Mais il existe d'autres approches.

Un autre avantage de la POO est que vous acquérez progressivement des bibliothèques de classes, en particulier celles qui sont vraiment universelles, qui vous accompagnent toute votre vie et vous facilitent la vie.

D'après un projet réel, cela fonctionne vraiment. Il n'y a aucun souci à se faire, il suffit de surveiller le nombre et le statut des commandes/positions disponibles. Cette fonction contrôle uniquement que la position/ordre n'est pas fermée/annulée et la supprime de la liste après la fermeture.

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

Où gPos est CList<CTrade> gPos

CList et CTrade ne font pas partie de la bibliothèque standard.

CTrade est hérité de ma propre bibliothèque CPosition.

En fait, vous trouverez ci-dessous tout le CTrade dont vous avez besoin pour rendre le code de votre projet lisible :

#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
La mise en œuvre complète du traitement des ordres et des positions est cachée dans le fichier de la bibliothèque CPosition multiplateforme.
 
Реter Konow:
Merci à tous d'avoir participé à la discussion. Je vais essayer de me plonger dans la POO afin de vraiment comparer les capacités des deux approches. Je suis intéressé par la hiérarchie que la POO peut fournir, et si son utilité n'est pas noyée sous sa syntaxe, je l'adopterai certainement.

Aidez-vous sur YouTube. Il y a beaucoup de choses là-dessus. Surtout en anglais, que tu maîtrises bien.


N'épargne pas 45 minutes, Peter. Au début, il est très important de comprendre de quoi parle cet homme. Beaucoup de gens vont probablement le contredire, mais il a généralement raison :


 
Nikolai Semko:

Aidez-vous sur YouTube. Il y a beaucoup de choses là-dessus. Surtout en anglais, que tu maîtrises bien.


N'épargne pas 45 minutes, Peter. Au début, il est très important de comprendre de quoi parle cet homme. Beaucoup de gens vont probablement se disputer avec lui, mais en général, il a raison :


Merci, Nikolaï. Je vais garder un œil sur le sujet.
Raison: