Questions sur la POO dans MQL5 - page 21

 
Alexey Navoykov:
S'agit-il d'une classe de test ou allez-vous vraiment l'utiliser ?
Si c'est le dernier cas, vous ne devriez pas le faire. Les variables statiques ne sont pas réinitialisées lorsqu'un personnage change, pour autant que je m'en souvienne.
Et en général, ce n'est pas une bonne idée d'initialiser les statiques constantes avec des valeurs externes, qui ne sont pas nécessairement disponibles au moment de l'initialisation.

Lesecond, je l'écris de toute façon sous MT4, même pour moi - il ne fonctionne pas dans le testeur pour quelques symboles, si je vois quelque chose d'utile dans MT4, je passerai à MT5 en utilisant MT4Orders - j'ai vérifié mon "travail créatif" sans problèmes avec cette bibliothèque

tout d'abord, je veux voir l'idée d'une véritable POO - c'est pourquoi je la teste, pour voir ce qui en sortira, jusqu'à présent ça se passe assez mal.... on verra, j'ai le temps, voici le chargeur que j'ai décidé de fabriquer moi-même ))))


Je sais que ce n'est pas la meilleure façon d'initialiser avant le début du code principal, ou plutôt je le pensais, mais je ne l'ai jamais vérifié, peu importe le nombre de nouvelles constructions que j'ai eues - dans MQL tout est toujours disponible, même au niveau de la visibilité globale, j'ai vu les gens des sources aller directement au sommet et l'écrire de cette façon :

#property strict
int    dig = _Digits;
double point = _Point;
double startbalance = AccountBalance();

et ces initialisations invalides ont fonctionné pendant des années de build en build. Les développeurs ont donc gâté les gens jusqu'à l'os )))).




SZZY : ici, en général, comme toujours lorsqu'on utilise la POO - l'essentiel est de diviser correctement le problème en éléments complexes et de ne pas hériter de tout ce qui est à portée de main. Je ne sais pas où "mettre" la sortie texte des erreurs - elle a besoin de partout, dans n'importe quelle classe et à n'importe quel endroit du programme, très probablement vous devrez créer une classe de base comme@Vladimir Simakov a montré ci-dessus son code

 
Igor Makanu:

pp 1-3 tous solvables, MAIS... OK, ici avec la statique aidé, qu'il en soit ainsi car il y a une aide, au moins quelque chose pour justifier sa décision, maintenant le code est le suivant :

J'ai créé 3 instances de Cdeal, je suis dans le journal :

...

jusqu'à présent, tout fonctionne comme prévu !

Même si cela fonctionne, ce n'est pas fiable. Comme la fonction est implémentée en dehors de la classe, il est difficile de contrôler l'ordre des champs dans la classe elle-même. Vous devriez au moins écrire un commentaire en gras dans la classe disant que tel ou tel champ ne doit pas être réarrangé). Mais votre variante initiale était quand même meilleure. Vous ne devez pas sacrifier la sécurité pour sauver une ligne de code.)
 
Alexey Navoykov:
Mais tout de même, votre version originale était meilleure. Ne sacrifiez pas la fiabilité pour économiser une ligne de code.)

laquelle ? - J'ai la moitié du sujet dans mes variations ))))

mais oui, tu as raison à cent pour cent !

SZY :

le moyen le plus simple et le plus fiable - créer une instance de la classe via new dans OnInit() - et copier immédiatement toutes les variables d'environnement du terminal, mais ce n'est pas le meilleur moyen - si je prévois d'ouvrir un ordre immédiatement au démarrage du constructeur dans cet exemple, alors cette instance de la classe sera probablement supprimée et ensuite éventuellement recréée - cela pose déjà quelques problèmes à cause des appels répétés - je recommence à charger le terminal, gaspillant à nouveau de la mémoire.... en général, ce n'est pas soluble de cette façon


ZZZY : peut-être une autre journée d'expériences, et éventuellement prendre l'exemple de@Vladimir Simakov- tout y est très clair

 
Igor Makanu:

J'ai esquissé ma classe, qui doit initialiser les champs une fois avec des valeurs constantes, et cela semble fonctionner comme prévu :

Je n'aime pas 2 choses :

1. je répète l'appel de SymbolInfoDouble(_Symbol,SYMBOL_VOLUME_STEP) - parce que l'ordre d'initialisation n'est pas défini, c'est-à-dire qu'il n'est pas sûr que VolumeSTEP sera initialisé en premier et seulement ensuite GetDigitsInVolumeStep() sera appelé

2. je veux me débarrasser de la méthode statique static int GetDigitsInVolumeStep() - j'ai vu une vidéo sur youtube disant qu'en pure POO on ne devrait pas utiliser de méthodes statiques, et maintenant je me bats contre des moulins à vent

le lien vers la vidéo, c'est essentiellement la même chosehttps://youtu.be/lfdAwl3-X_c ethttps://youtu.be/zME4SOCHT0I


comment puis-je réécrire ces 2 points qui ne me plaisent pas ?

1. Il n'y a rien de mal à appeler cette fonction deux fois.

2. ne trouvez-vous pas déroutant que ceux qui sont contre l'utilisation des fonctions statiques ne donnent pas le moindre argument ?

Il vaut mieux ne pas regarder les vidéos de n'importe qui, mais lire des livres.

 
Koldun Zloy:

2. n'êtes-vous pas troublé par le fait que ceux qui sont contre l'utilisation des fonctions statiques ne donnent pas le moindre argument ?

Et vous êtes le premier à soutenir que la vidéo ne correspond à rien dans la pratique, j'ai écrit dans un autre fil mon opinion sur la vidéo - le conférencier ne pouvait même pas répondre aux questions des étudiants.

 
Igor Makanu:

et vous êtes le premier à me soutenir que la vidéo ne correspond à rien de la pratique, j'ai écrit dans un autre fil mon opinion sur la vidéo - le journaliste ne pouvait même pas répondre aux questions des étudiants.

Je ne pense pas qu'OOP consiste à réduire ses propres capacités pour suivre aveuglément les postulats infondés de certains porte-parole de l'Internet, où chacun balaie à sa façon.

 
Artyom Trishkin:

Je ne pense pas que la POO consiste à réduire ses propres capacités pour suivre aveuglément les postulats infondés de certains porte-parole de l'Internet, où chacun balaie devant sa porte.

Si vous avez vu la vidéo, vous devriez comprendre que la cible est ..... en général, vous ne comprenez rien et vous n'êtes pas encore assez mûr. C'est du moins ce que m'a expliqué A100.

SZZ : Je vais expérimenter un peu plus tard avec les interfaces, peut-être qu'une certaine "entité-beauté" apparaîtra )))).

 

J'ai regardé sa vidéo sur la statique, tout ça pour écrire comme ça :

new Type0(new Type1(new Type2(...))); 

Eh bien, écrire un wrapper sur une statique est un problème, n'est-ce pas ?

class Stateless_with_state {
        Stateless q;
        Data d;
        call() {q::call(d);}
};

Et les modèles sont clairement plus efficaces. J'ai aimé la question du public https://www.youtube.com/watch?v=75U9eefFYoU#t=33m25s

 
Igor Makanu:

ZS : Je vais expérimenter avec les interfaces un peu plus tard, peut-être qu'une certaine "entité-beauté" apparaîtra )))).

Vérifié si "OOP pattern - Behavioural patterns - Strategy" fonctionnera

interface IStrategy
  {
   void Algorithm();
  };
//+------------------------------------------------------------------+
class Strategy_1 : public IStrategy
  {
public:
                     Strategy_1()   {Print(__FUNCTION__);}
   void              Algorithm()    {Print(__FUNCTION__);}
  };
//+------------------------------------------------------------------+
class Strategy_2 : public IStrategy
  {
public:
                     Strategy_2()   {Print(__FUNCTION__);}
   void              Algorithm()    {Print(__FUNCTION__);}
  };
//+------------------------------------------------------------------+
class Context
  {
private:
   IStrategy         *s;
public:
                     Context(IStrategy &_strategy) {Print(__FUNCTION__); s = GetPointer(_strategy); s.Algorithm();}
                    ~Context() {delete s;}
  };
//+------------------------------------------------------------------+
void OnStart()
  {
   Context c1(new Strategy_1);
   Context c2(new Strategy_2);
  }
//+------------------------------------------------------------------+

2019.08.31 21:04:40.441 tst (EURUSD,H1) Stratégie_1::Stratégie_1

2019.08.31 21:04:40.442 tst (EURUSD,H1) Contexte::Contexte

2019.08.31 21:04:40.442 tst (EURUSD,H1) Strategy_1::Algorithm

2019.08.31 21:04:40.442 tst (EURUSD,H1) Stratégie_2::Stratégie_2

2019.08.31 21:04:40.442 tst (EURUSD,H1) Contexte::Contexte

2019.08.31 21:04:40.442 tst (EURUSD,H1) Strategy_2::Algorithm


Fonctionne sans aucun problème à mon avis

 
Igor Makanu:

vérifié si le "OOP Pattern - Behavioural Patterns - Strategy (Strategy)" fonctionnera

2019.08.31 21:04:40.441 tst (EURUSD,H1) Stratégie_1::Stratégie_1

2019.08.31 21:04:40.442 tst (EURUSD,H1) Contexte::Contexte

2019.08.31 21:04:40.442 tst (EURUSD,H1) Strategy_1::Algorithm

2019.08.31 21:04:40.442 tst (EURUSD,H1) Stratégie_2::Stratégie_2

2019.08.31 21:04:40.442 tst (EURUSD,H1) Contexte::Contexte

2019.08.31 21:04:40.442 tst (EURUSD,H1) Strategy_2::Algorithm


fonctionne sans aucun problème pour moi

Context(IStrategy* _strategy):s(_strategy){Print(__FUNCTION__); s.Algorithm();}

L'opérateur new renvoie un pointeur. Bien sûr, les développeurs se sont plantés avec le déréférencement implicite et c'est pourquoi votre version fonctionne, mais je préfère ne pas m'attarder sur des choses non documentées.

2. Ce n'est certainement pas C++, mais c'est très similaire, donc les listes d'initialisation (je ne sais pas pour l'efficacité) sont kasher.