Questions sur la POO dans MQL5 - page 9

 
Igor Makanu:

de quelles tonnes parlons-nous ? tout ce qui a été oublié sera signalé par le terminal, l'endroit où le supprimer est aussi connu - OnDeint() .... Cette discussion s'est-elle transformée en une discussion sur un cheval sphérique dans le vide ? )))

Non. Laissez le cheval aller où il doit aller.

Mais nous parlons de la création d'objets inconnus jusqu'alors. Et nous ne connaissons pas seulement leurs propriétés, mais aussi le nombre d'objets créés eux-mêmes.

Bien sûr, pour un objet, nous pouvons créer un pointeur et travailler avec cet objet par ce pointeur. Mais si nous ne savons pas à l'avance de combien de pointeurs nous aurons besoin, de quel genre de vide s'agit-il ? Ce n'est qu'une des solutions les plus simples et immédiatement disponibles - stocker les pointeurs dans des listes. Ils peuvent être pris dans la liste. Eh bien, chaque objet peut avoir son propre identifiant (la méthode Type()), par lequel vous pouvez identifier l'objet pointeur. Il est possible d'identifier précisément un objet (en plus de son type, l'objet peut être doté d'autres propriétés, le distinguant des objets du même type).

En général - j'ai l'impression de parler de structures plus complexes, qui nécessitent une classification des objets, des listes pour leur stockage et des méthodes de travail avec des objets qui peuvent non seulement stocker et donner des informations sur demande, mais aussi "vivre et grandir" en interagissant avec le programme, en changeant eux-mêmes de temps en temps et en rendant compte de leurs actions.

Je suis peut-être allé trop loin en parlant d'un objet dont deux champs doivent être modifiés lors de l'initialisation et qui ne doivent en aucun cas changer pendant la durée de vie de l'objet. Quel est l'intérêt d'avoir un objet s'il y a des variables d'entrée ?

 
Personne n'est obligé de retirer un objet, sauf celui qui l'a créé. Même si cela se produit dans certains cas, il ne faut pas s'y fier. Si vous l'avez créé, vous le supprimez.
 
Dmitry Fedoseev:
Personne n'est obligé de supprimer un objet, sauf celui qui l'a créé. Même si cela se produit dans certains cas, il ne faut pas s'y fier. Si vous l'avez créé, vous le supprimez.

C'est vrai. Mais ce n'est pas de cela qu'il s'agit. N'est-ce pas ?

Il s'agit de méthodes permettant de ne pas perdre les objets et de les retrouver sans ambiguïté.

Lorsque vous créez un objet, soyez-en conscient et ne le perdez pas, afin qu'il puisse être correctement supprimé par la suite et qu'il n'y ait pas de fuite de mémoire due à la perte du pointeur de l'objet (nous avons commencé par la fuite de mémoire dans l'exemple où le pointeur de l'objet passé dans la fonction a été réaffecté à l'objet nouvellement créé dans le corps de la fonction).

Et chacun a ses propres préférences - certains aiment une chose, d'autres une autre. Mais nous devons connaître chacun de nos objets - même s'il y en a deux ou deux mille deux - afin de pouvoir les supprimer ultérieurement. Et que nous les supprimions nous-mêmes par delete ou que nous laissions la liste les supprimer par Clear() ou en boucle par list et delete ou d'une autre manière - ce n'est pas le problème.

 
Artyom Trishkin:

En général, j'ai l'impression de parler de structures plus complexes, qui nécessitent une classification des objets, des listes pour leur stockage et des méthodes de travail avec les objets, qui peuvent non seulement stocker et donner des informations sur demande, mais aussi "vivre et évoluer" en interagissant avec le programme, en se modifiant de temps en temps et en rendant compte de leurs actions.

Peut-être suis-je allé trop loin et devons-nous simplement discuter d'un objet dont deux champs doivent être modifiés lors de l'initialisation et qui ne doivent en aucun cas changer au cours de sa durée de vie ? Quel est l'intérêt d'avoir un objet s'il y a des variables d'entrée ?

C'est un concept étrange de la POO. Tout d'abord, la POO est pratique - vous l'écrivez une fois et ensuite vous créez de nouvelles instances de l'objet.

Pour en revenir au début de la discussion, voici mon exemple, que j'utilise souventhttps://www.mql5.com/ru/forum/160683/page861#comment_11840254.

Je dois limiter mon trading à un intervalle de temps maintenant et 2 la prochaine fois... 4...

mon exemple en 2 clics est modifié pour cette tâche :

int OnInit()
{
   Work1=new CWorkTime(StartHour1,StartMinute1,StopHour1,StopMinute1);
   Work2=new CWorkTime(StartHour2,StartMinute2,StopHour2,StopMinute2);
   Work3=new CWorkTime(StartHour3,StartMinute3,StopHour3,StopMinute3);
   Work4=new CWorkTime(StartHour4,StartMinute4,StopHour4,StopMinute4);
}


Je ne sais pas, mais en pensant dans les catégories que la POO est juste pour envelopper tout dans une classe et là c'est un miracle - ma superclasse et elle peut faire les deux.... Et si la classe comporte 10 chaînes, vous n'avez pas besoin de OOP - pourquoi vous limiter et induire tout le monde en erreur ?

J'utilise la POO quand cela me convient, la discussion est clairement passée à la religion - interdire ou utiliser la POO )))).

 
Igor Makanu:

C'est une idée étrange de la POO, la POO est avant tout pratique - écrire une fois, puis créer de nouvelles instances de l'objet.

Pour en revenir au début de la discussion, voici mon exemple, que j'utilise souventhttps://www.mql5.com/ru/forum/160683/page861#comment_11840254.

Je dois limiter mon trading à un intervalle de temps maintenant et 2 la prochaine fois... 4...

mon exemple en 2 clics est modifié pour cette tâche :


Je ne sais pas, mais en pensant dans les catégories que la POO est juste pour envelopper tout dans une classe et là c'est un miracle - ma superclasse et elle peut faire les deux.... Et si la classe comporte 10 chaînes, vous n'avez pas besoin de OOP - pourquoi vous limiter et induire tout le monde en erreur ?

où cela me convient, c'est là que j'utilise la POO, il est clair que la discussion est passée à la religion - interdire ou utiliser la POO )))).

Sans aucun doute - je ne suis pas celui qui se lance dans cette religion, puisque j'utilise moi-même activement la POO.

Par exemple : que se passe-t-il si nous avons besoin de plus d'intervalles ? Devrions-nous en créer de nouveaux ? Pour quoi faire ? Si vous pouvez vous débrouiller avec une seule liste sans interférer avec le code du programme.

Nous semblons parler de choses différentes. Je parle de convivialité, et vous... Je parle aussi de convivialité, mais vous montrez un code qui n'est pas utilisable. Peut-être juste exagéré bien sûr, et je ne l'ai pas compris...

 
Artyom Trishkin:

Par exemple : Que faire si d'autres intervalles sont nécessaires ? Faut-il créer de nouveaux WorkNNN ? Quel est l'intérêt ? Si vous pouvez vous débrouiller avec une liste sans interférer avec le code du programme...

Si nous devons utiliser des listes ou des tableaux d'instances de classes, ce n'est pas un problème, mais il est plus facile d'utiliser un tableau pour cet exemple, et nous ne ferons qu'une seule boucle :

bool DisableTrade=false;
   for(int i=0;i<ArraySize(Work);i++)
     {
      if(Work[i].Disable()) {DisableTrade=true; break}
     }
   if(DisableTrade)
     {
      Comment("Не торговое время!!! Сопровождение открытых ордеров");
     }
   else...

Artyom Trishkin:

Nous semblons parler de choses différentes. Je parle de convivialité, et vous... Je parle aussi de convivialité, mais le code que vous montrez n'est pas commode. Peut-être que c'est juste exagéré, bien sûr, et que je n'ai pas compris...

Malheureusement, il est impossible d'écrire un code universel. Même si vous écrivez un code universel, sa modification ultérieure sera un processus fastidieux et, par conséquent, le code universel sera plus gourmand en ressources - en général, vous pouvez en parler éternellement, une fois j'ai écrit, comme l'a dit l'un des célèbres programmeurs -"le code doit accomplir sa tâche ! - c'est suffisant". Tout le reste est... Eh bien, c'est un désir de faire des bêtises ou... disons à créer ! )))

 
Artyom Trishkin:

///

Par exemple : que faire si d'autres intervalles sont nécessaires ? Faut-il créer de nouveaux WorkNNN ? Quel est l'intérêt ? Si vous pouvez vous débrouiller avec une seule liste sans interférer avec le code du programme.

///

Il n'y aura alors aucun paramètre d'intervalle numérique dans la fenêtre des propriétés. Vous ne serez pas en mesure de les optimiser. Ce n'est pas une option.

La création d'un nouvel objet pour chaque intervalle n'est pas non plus la meilleure option. Pourtant, cela entraînera un ralentissement des performances. Si nous devions créer une classe, nous devrions en créer une qui ajouterait les paramètres des intervalles dans un tableau. Ce sera plus rapide.

 
Dmitry Fedoseev: rmosa. Si vous devez créer une classe, elle doit être telle qu'elle ajoute les paramètres des intervalles dans un tableau. Ce sera plus rapide.

cela ne fait absolument aucune différence si vous créez une classe ou une fonction dans laquelle vous ajoutez() plusieurs paramètres, si vous créez plusieurs classes avec des paramètres individuels

SZZ : n'oubliez pas que si vous écrivez une grande fonction sous la forme d'une longue "bande de cheval" - le cache du CPU ne sera pas toujours utilisé efficacement, bien qu'il puisse y avoir un gain dans une telle "bande de cheval" lors de la prévision des transitions..... Seuls des tests peuvent le montrer, mais sur un PC spécifique et un compilateur spécifique...

 
Dmitry Fedoseev:

Il n'y aura alors aucun paramètre d'intervalle numérique dans la fenêtre des propriétés. Vous ne serez pas en mesure de l'optimiser. Ce n'est pas une option.

La création d'un nouvel objet pour chaque intervalle n'est pas non plus la meilleure option. Après tout, cela entraînera un ralentissement des performances. Si nous devions créer une classe, nous devrions en créer une qui ajouterait les paramètres des intervalles dans un tableau. Ce serait plus rapide.

D'accord. Là encore, tout dépend des méthodes utilisées pour définir les champs de contrôle. Et la manière de les transférer des paramètres d'entrée à l'objet stockant tous les intervalles est une question de technique. Bien qu'il soit possible de recréer tous les objets de la liste d'intervalles et de modifier un seul d'entre eux - c'est une question de praticité et de "se donner la peine/ne pas se donner la peine" de modifier les données lors de l'écriture du code.

 
Roman:

Pouvez-vous expliquer le sens de la création d'un objet dynamique à l'aide de l'opérateur new ?

Lorsqu'un objet est créé automatiquement, l'objet de classe est créé dans la pile et il est plus rapide qu'un objet dynamique en termes de temps d'exécution.
Lors de la création dynamique d'un objet, un objet de classe est créé en mémoire (dans le tas) en impliquant le gestionnaire de mémoire de l'OS, le processus est plus lent.

Voici les questions :
Si la création automatique est plus rapide, pourquoi est-il préférable d'utiliser des objets dynamiques ?
Contrôler explicitement l'allocation de mémoire ?
Éliminer un éventuel débordement de pile ?
Et ne pas perdre un objet de manière inattendue ?
Parce que si la pile déborde, l'objet sera automatiquement supprimé ?

Bon après-midi. La mémoire des ordinateurs a les mêmes performances, qu'elle soit utilisée dans un contexte de pile ou de tas. La gestion dynamique de la mémoire dépend elle-même de l'implémentation du collecteur de déchets : par exemple, il peut s'agir d'un comptage de références comme dans Python (variante plus lente) ou d'une analyse des époques de génération des objets avec traversée du graphe d'exécution en arrière-plan (Net CLR). On ne sait pas quelle variante est utilisée dans MQL, mais on peut supposer qu'elle est extrêmement efficace, car l'utilisateur de MQL5 a accès à l'opérateur delete directement, ce qui simplifie grandement le travail de GC lui-même. Par conséquent, vos préoccupations concernant les frais généraux lors de l'utilisation de new sont sans fondement - n'hésitez pas à utiliser la mémoire dynamique.

Quant au "dépassement de pile", la seule façon de rencontrer ce cas dans les systèmes modernes est d'utiliser une récursion complexe ou de faire une erreur dans l'algorithme récursif. Un programme moderne fonctionne toujours en mode protégé OC dans l'espace d'adressage virtuel, avec un chargement dynamique des pages de mémoire, donc ne vous inquiétez pas : la pile ne débordera pas :)