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

 
Igor Makanu:

les modificateurs de droits d'accès permettent de détecter les erreurs au moment de la compilation

En général, tout ceci ne complique pas le travail avec les classes, ne l'utilisez pas, écrivez tout en public : et il sera alors plus facile de travailler avec eux.

SZZY : Beaucoup de belles phrases sur la POO, l'encapsulation et l'héritage... Tout cela est bien, mais l'avantage le plus important de la POO par rapport aux autres styles de programmation est le stockage de toutes les données (champs de la classe) et des fonctions de travail avec ces données (méthodes de la classe) en un seul endroit (classe) - en livre, c'est l'encapsulation. En outre, l'utilisation de la POO dépend de la tâche, si la tâche permet de mettre les classes à l'échelle, une hiérarchie sera nécessaire et il y aura des classes de base et leurs descendants - l'utilisation de la POO dépend de vous.

Toutes les propriétés des objets peuvent également être "encapsulées" dans un tableau. Il est également possible de spécifier les relations entre les objets via des propriétés spécifiques des pointeurs. Il y a là un ordre, car chaque propriété est indexée et sa valeur est stockée dans une cellule spécifique. Les objets eux-mêmes sont encapsulés dans le noyau. L'accès est le plus simple - par numéro d'objet et numéro de propriété. Les transitions entre les objets d'un même contrôle se font par le biais de pointeurs de propriétés.
 
Реter Konow:
Vous pouvez également "encapsuler" toutes les propriétés d'un objet dans un tableau. Vous pouvez également spécifier les relations entre les objets par le biais de propriétés spécifiques des pointeurs. Il y a là un ordre, car chaque propriété est indexée et sa valeur est stockée dans une cellule spécifique. Les objets eux-mêmes sont encapsulés dans le noyau. L'accès est le plus simple - par numéro d'objet et numéro de propriété. Les transitions entre les objets d'un même contrôle se font par le biais de pointeurs de propriétés.

ce n'est pas commode en premier lieu !

De plus, vous avez déjà parlé plus haut de la lisibilité du code (ainsi que de la vitesse - la vitesse d'exécution dépend d'autre chose, pas du style de programmation).

en général, comme partout ailleurs - vous ne saurez pas tant que vous n'aurez pas essayé, commencez à écrire dans le style OOP, vous obtiendrez des actions spécifiques et des questions spécifiques, un exemple est déjà dans ce fil de discussion

Si l'on parle d'IA, il faut également séparer les données du travail qu'on fait avec elles. Avec la POO, ce sera plus facile.

SZZ : Qu'est-ce qui est mieux dans la POO ? Par exemple, nous avons différents types de données, disons des paramètres d'Expert Advisor dans MQL, et ces paramètres ont des répétitions dans des blocs. Nous prenons un bloc de paramètres et décrivons des champs de classe pour transférer ces paramètres à la classe, il est plus facile de créer un constructeur avec des paramètres, puis d'écrire des méthodes qui fonctionnent avec ces paramètres EA. Après avoir fait tout cela, nous créons soit un tableau d'instances de la classe, soit même seulement quelques instances de la classe ("variables de type classe") et c'est tout - le problème est résolu en écrivant une seule classe, en ne créant pas plusieurs tableaux, en créant des méthodes pour identifier chaque tableau, en créant un groupe de fonctions qui, en plus d'effectuer des modifications dans les tableaux, ne sont pas suffisantes pour gâcher des données qui ne devraient pas être traitées dans cet appel.....

ZZZY : imho, la POO est juste pratique, il y a une certaine légende selon laquelle il n'y a pas besoin d'utiliser la POO s'il n'y a pas d'héritage... pas de commentaire, ça va être une dispute mousseuse, sans moi.

 
Igor Makanu:

ce n'est pas commode en premier lieu !

De plus, vous avez déjà parlé plus haut de la lisibilité du code (ainsi que de la vitesse - la vitesse d'exécution dépend d'autre chose, pas du style de programmation).

en général, comme partout ailleurs - vous ne saurez pas tant que vous n'aurez pas essayé, commencez à écrire dans le style OOP, vous obtiendrez des actions spécifiques et des questions spécifiques, un exemple est déjà dans ce fil de discussion

Si l'on parle d'IA, il faut également séparer les données du travail qu'on fait avec elles, ce qui sera plus facile à faire avec la POO.

SZZ : Qu'est-ce qui est mieux dans la POO ? Par exemple, il y a différents types de données, par exemple les paramètres d'Expert Advisor dans MQL, et ces paramètres sont répétés dans des blocs. Nous prenons un bloc de paramètres et décrivons les champs de classe pour passer ces paramètres dans une classe, il est plus facile de créer un constructeur avec des paramètres, puis d'écrire des méthodes qui fonctionnent avec ces paramètres EA. Après avoir fait tout cela, nous créons soit un tableau d'instances de la classe, soit même seulement quelques instances de la classe ("variables de type classe") et c'est tout - le problème est résolu en écrivant une seule classe, en ne créant pas plusieurs tableaux, en créant des méthodes pour identifier chaque tableau, en créant un groupe de fonctions qui, en plus d'effectuer des modifications dans les tableaux, ne sont pas suffisantes pour gâcher des données qui ne devraient pas être traitées dans cet appel.....

ZZZY : imho, la POO est juste pratique, il y a une certaine légende selon laquelle il n'y a pas besoin d'utiliser la POO s'il n'y a pas d'héritage... pas de commentaire, ça va être une discussion mousseuse sans moi

Confortable ou non, question subjective. Je préfère une présentation tabulaire des données. D'autres la préfèrent sous la forme d'une grappe de raisin ou d'un arbre. D'autres le préfèrent sous la forme d'une grappe de raisin ou d'un arbre. Mais, je vais sérieusement réfléchir à vos propos et essayer d'apprendre les principes de base du travail avec les données en POO.
 
Реter Konow:
Confortable ou non, question subjective. Je préfère une présentation tabulaire des données. D'autres le préfèrent sous la forme d'une grappe de raisin ou d'un arbre. D'autres le préfèrent sous la forme d'une grappe de raisin ou d'un arbre. Mais je vais sérieusement réfléchir à vos propos et essayer de comprendre les principes de base du travail avec les données dans le cadre de la POO.
Je vous ai déjà dit une fois qu'un tableau de pointeurs vers des tableaux de pointeurs est un tableau à deux dimensions. Une liste est une rangée, les listes qui se trouvent dans la première sont des colonnes. Ils peuvent avoir leurs propres listes. Et ainsi de suite jusqu'au coucher du soleil. C'est la hiérarchie que vous recherchez. Et il est réalisé par une seule classe.
 
Реter Konow:

Dans la POO, un "objet" est une référence à une classe dans laquelle ses champs (propriétés) sont déclarés. Je comprends un objet comme un ensemble numéroté de propriétés, chacune d'entre elles étant une cellule dans un tableau. C'est là toute la différence.

Peter, vous devez bien comprendre que lorsque la classe elle-même est définie, aucune mémoire n'est allouée, même s'il y a des instances d'autres classes à l'intérieur de la classe comme ses propriétés. Par conséquent, il ne peut y avoir de référence à la classe, mais uniquement à l'objet classe. Lamémoire est allouée lorsqu'une instance (objet) d'une classe est déclarée (créée).

HH c'est-à-dire que s'il y a une classe dans le programme, mais aucune instance de celle-ci, le compilateur ignorera (ne remarquera pas) cette classe.

Il y a une exception. La mémoire peut être allouée lors de la définition de la classe pour les méthodes et les paramètres statiques, le cas échéant.
 
Artyom Trishkin:
Je vous ai déjà dit qu'un tableau de pointeurs vers des tableaux de pointeurs est un tableau à deux dimensions. Une liste est une ligne, les listes situées dans la première sont des colonnes. Ils peuvent avoir leurs propres listes. Et ainsi de suite jusqu'au coucher du soleil. C'est la hiérarchie que vous recherchez. Et elle est réalisée par une seule classe.

En théorie, oui. Mais il est nécessaire d'organiser de telle sorte que les transitions entre les liens hiérarchiques (conditionnellement - induction et déduction, c'est-à-dire du particulier au général et inversement) s'effectuent en chaîne. En d'autres termes, l'ordre des pointeurs doit être structuré d'une manière spéciale pour permettre de se déplacer dans n'importe quelle (bonne) direction, sans "tours" et "sauts" excessifs dans la boucle. Par conséquent, une simple disposition en tableau des pointeurs ne fonctionnera probablement pas.

Ajouté :

Mais ça pourrait marcher. Je ne sais pas encore.

 
Igor Makanu:

Nous devons mettre ces questions en pratique, sinon nous ne serons pas en mesure de voir ce qui est pratique et ce qui semble incommode )))).

Voici un exemple trivial, qui est utilisé dans MQL cent cinquante fois - la détermination d'une nouvelle barre:

OK, c'est un code qui fonctionne, mais que faire si je dois définir une nouvelle barre pour 2 TFs ? Et que faire si je veux utiliser tous les TFs du terminal ?

ce serait comme ça en OOP :

et tout ce que j'ai à faire maintenant est de déclarer plusieurs instances de la classeCNewbar - comment ? même à un tableau, même à plusieurs variables, mais j'ai protégé les données d'un changement accidentel avec OOP

J'ai déjà résolu ce problème publiquement. L'idée était de créer un tableau de tous les symboles et de toutes les échéances et de le parcourir en boucle, en fixant les événements d'une nouvelle barre. Après le premier appel d'une fonction de cet événement, son drapeau est effacé du tableau. Je ne peux pas juger à quel point c'est plus compliqué qu'en OOP. Mais, en fait, une solution plutôt simple et pratique.

 
Nikolai Semko:
Peter, vous devez bien comprendre que la classe elle-même n'a pas de mémoire allouée, même s'il y a des instances d'autres classes à l'intérieur de la classe comme ses propriétés. Par conséquent, il ne peut y avoir de référence à la classe, mais uniquement à l'objet classe. La mémoire est allouée lorsqu'une instance (objet) d'une classe est déclarée (créée).
HH c'est-à-dire que s'il y a une classe dans le programme, mais aucune instance de celle-ci, le compilateur ignorera (ne remarquera pas) cette classe.
Je n'étais pas au courant. Intéressant. Le problème est de savoir dans quelle mesure l'utilisation de la POO permettra de manipuler facilement toutes les données hiérarchiques dans les boucles. Ce sont les boucles qui constituent les principaux mécanismes de tout moteur. Plus les boucles sont performantes, plus vous pouvez fouiller dans les données et plus vous pouvez travailler.
 
Lorsqu'un objet de classe est créé, outre l'allocation de mémoire pour toutes les propriétés (variables) de la classe, l'un des constructeurs est lancé (il peut y en avoir plusieurs). Les constructeurs peuvent être non-paramétriques (par défaut), paramétriques (lorsque certains paramètres sont spécifiés lors de la création d'une instance d'une classe, ou un constructeur de copie, lorsqu'une autre instance de la classe est spécifiée comme paramètre d'une instance de la classe.
 
Реter Konow:
En théorie, oui. Mais il est nécessaire d'organiser de telle sorte que les transitions entre les liens hiérarchiques (conditionnellement - induction et déduction, c'est-à-dire du particulier au général et inversement) s'effectuent en chaîne. En d'autres termes, l'ordre des pointeurs doit être structuré d'une manière spéciale pour permettre de se déplacer dans n'importe quelle (bonne) direction, sans "tours" et "sauts" excessifs dans la boucle. Par conséquent, une simple disposition en tableau des pointeurs ne fonctionnera probablement pas.
Toutes les listes sont déjà dotées d'une recherche binaire. Cela signifie qu'il faut filtrer par la propriété recherchée, plutôt que de les parcourir une par une. En conséquence, nous obtenons l'indice de l'élément que nous recherchons.
Raison: