Questions sur la POO (programmation orientée objet) - page 11

 

J'aimerais avoir l'avis de programmeurs plus expérimentés sur certaines des nuances. Prendre les déclarations de variables dans les classes. Par exemple, j'ai des variables dans des classes qui sont déclarées dans différentes méthodes d'une certaine classe. Ils sont déclarés dans chaque méthode le plus souvent. Cela vaut-il la peine de le faire, ou est-il préférable de les déclarer une fois dans la section privée et de l'utiliser ensuite ?

Je pense qu'il serait plus logique d'utiliser des variables de compteur, si elles sont utilisées dans des boucles, n'est-ce pas ? Après tout, le compteur est explicitement fixé à une valeur au moment du calcul, par exemple, si nous utilisons une boucle :

for (i = OrdersTotal() - 1; i >= 0; i--)
{

}

Dans chaque méthode, il ne serait pas raisonnable de déclarer une variable i, car cela constitue probablement un gaspillage inutile de mémoire sur les cellules de mémoire. En général, je m'intéresse à ce genre de choses.

Cela concerne non seulement les boucles mais aussi d'autres options. Il y a suffisamment de variables différentes qui doivent être déclarées plus d'une fois, mais elles jouent le même rôle... La seule chose que je vois est que certains d'entre eux devront être mis à zéro en valeur, afin qu'ils ne contiennent pas de "déchets" provenant d'opérations précédentes. Est-il raisonnable de le faire ou est-il plus simple de redéclarer une telle variable... En général, j'aimerais que des professionnels nous en parlent.

 
hoz:

J'aimerais avoir l'avis de programmeurs plus expérimentés sur certaines des nuances. Prendre les déclarations de variables dans les classes. Par exemple, j'ai des variables dans des classes qui sont déclarées dans différentes méthodes d'une certaine classe. Ils sont déclarés dans chaque méthode le plus souvent. Cela vaut-il la peine de le faire, ou est-il préférable de les déclarer une fois dans la section privée et de l'utiliser ensuite ?

Je pense qu'il serait plus logique d'utiliser des variables de compteur, si elles sont utilisées dans des boucles, n'est-ce pas ? Après tout, le compteur est explicitement fixé à une valeur au moment du calcul, par exemple, si nous utilisons une boucle :

Dans chaque méthode, il ne serait pas raisonnable de déclarer une variable i, car cela constitue probablement un gaspillage inutile de mémoire sur les cellules de mémoire. En général, je m'intéresse à ce genre de choses.

Cela concerne non seulement les boucles mais aussi d'autres options. Il y a suffisamment de variables différentes qui doivent être déclarées plus d'une fois, mais elles jouent le même rôle... La seule chose que je vois est que certains d'entre eux devront être mis à zéro en valeur, afin qu'ils ne contiennent pas de "déchets" provenant d'opérations précédentes. Est-il raisonnable de le faire ou est-il plus simple de redéclarer une telle variable... En général, j'aimerais que des professionnels nous en parlent.

La décision de le faire ou non dépend de l'objectif de la création de la variable. Si une entité est encapsulée dans une classe, par exemple une commande, alors nous aurons besoin de variables définies dans la classe pour exprimer ses propriétés, par exemple un ticket pour la commande. Ces variables seront partagées par toutes les méthodes de cette classe pour le même objet de cette classe.

Si une variable est créée pour fournir une boucle dans une méthode, elle doit être définie à l'intérieur de la méthode comme automatique (c'est-à-dire sans utiliser le mot-clé static). Dans ce cas, même si une méthode appelle une autre méthode à l'intérieur de sa propre boucle, qui comporte également une boucle, et que la variable portant le même nom est utilisée, vous n'aurez aucun problème. Lorsqu'on utilise une variable déclarée dans une classe, la variable sera écrasée dans la boucle de la deuxième méthode.

Pour les variables automatiques, la mémoire est allouée automatiquement à l'entrée de la fonction et supprimée automatiquement à la sortie, avec une surcharge minimale. De plus, si les fonctions sont simples, le compilateur peut générer un code qui n'alloue et ne libère pas du tout de mémoire automatique.

La sauvegarde des cellules de mémoire de ce type était une chose sensée à faire il y a quelque temps, mais elle a finalement perdu son sens il y a environ 20 ans...

 

Il y a une classe. Il a une méthode si simple, sans aucune marque, parce que je cherchais où se trouve le bug :

// 1.5 Определяем минимальную разрядность лота. ===========================================================================================
int BaseInfo::LotPrecision()
{
   static int li_LotPrecision = 0;     // устанавливаем минимальную разрядность лота в ноль
   Print ("LotPrecision()_Before: li_LotPrecision = ", li_LotPrecision);
   Print ("LotPrecision()_BeforeCircle: SLots.gd_LotStep = ", SLots.gd_LotStep);
   while (SLots.gd_LotStep < 1)
   {
      Print ("LotPrecision(): SLots.gd_LotStep < 1");
      SLots.gd_LotStep *= 10;
      Print ("SLots.gd_LotStep *= 10");
      Print ("LotPrecision(): SLots.gd_LotStep = ", SLots.gd_LotStep);
      li_LotPrecision++;
      Print ("LotPrecision(): li_LotPrecision = ", li_LotPrecision);
   }
   Print ("LotPrecision(): LOTPRES = ", li_LotPrecision);
   return (li_LotPrecision);
}

La variableli_LotPrecision était auparavant sans modificateur statique, puis j'ai vu qu'elle ne devait pas perdre de valeur et je l'ai modifiée. On a remarqué que même si j'ai ajouté le modificateur, la variableli_LotPrecision ne conserve pas sa valeur.

Je l'imprime à OnInite():

void OnTick()
{
   int Lot = CBase.LotPrecision();
   Print ("Lot = ", Lot);
}

Dans le journal :

17:26:03 2014.07.22 14:10  RSI EURUSD,M5: SLots.gd_LotStep = MarketInfo (_Symbol, MODE_LOTSTEP); = 0.01
17:26:03 2014.07.22 14:10  RSI EURUSD,M5: LotPrecision()_Before: li_LotPrecision = 0
17:26:03 2014.07.22 14:10  RSI EURUSD,M5: LotPrecision()_BeforeCircle: SLots.gd_LotStep = 0.01
17:26:03 2014.07.22 14:10  RSI EURUSD,M5: LotPrecision(): SLots.gd_LotStep < 1
17:26:03 2014.07.22 14:10  RSI EURUSD,M5: SLots.gd_LotStep *= 10
17:26:03 2014.07.22 14:10  RSI EURUSD,M5: LotPrecision(): SLots.gd_LotStep = 0.1
17:26:03 2014.07.22 14:10  RSI EURUSD,M5: LotPrecision(): li_LotPrecision = 1
17:26:03 2014.07.22 14:10  RSI EURUSD,M5: LotPrecision(): SLots.gd_LotStep < 1
17:26:03 2014.07.22 14:10  RSI EURUSD,M5: SLots.gd_LotStep *= 10
17:26:03 2014.07.22 14:10  RSI EURUSD,M5: LotPrecision(): SLots.gd_LotStep = 1.0
17:26:03 2014.07.22 14:10  RSI EURUSD,M5: LotPrecision(): li_LotPrecision = 2
17:26:03 2014.07.22 14:10  RSI EURUSD,M5: LotPrecision(): LOTPRES = 2
17:26:03 2014.07.22 14:10  RSI EURUSD,M5: LotPrecision()_Before: li_LotPrecision = 0
17:26:03 2014.07.22 14:10  RSI EURUSD,M5: LotPrecision()_BeforeCircle: SLots.gd_LotStep = 1.0
17:26:03 2014.07.22 14:10  RSI EURUSD,M5: LotPrecision(): LOTPRES = 0
17:26:03 2014.07.22 14:10  RSI EURUSD,M5: Lot = 0
17:26:03 2014.07.22 14:10  RSI EURUSD,M5: LotPrecision()_Before: li_LotPrecision = 0
17:26:03 2014.07.22 14:10  RSI EURUSD,M5: LotPrecision()_BeforeCircle: SLots.gd_LotStep = 1.0
17:26:03 2014.07.22 14:10  RSI EURUSD,M5: LotPrecision(): LOTPRES = 0
17:26:03 2014.07.22 14:10  RSI EURUSD,M5: Lot = 0
17:26:03 2014.07.22 14:10  RSI EURUSD,M5: LotPrecision()_Before: li_LotPrecision = 0
17:26:03 2014.07.22 14:10  RSI EURUSD,M5: LotPrecision()_BeforeCircle: SLots.gd_LotStep = 1.0

Cela montre clairement qu'après avoir quitté la fonction LotPrecision() , la valeur de la variableli_LotPrecision est perdue. Comment faire pour qu'il reste constant ?

J'ai essayé d'ajouter cette variableli_LotPrecision à la section private class, afin de l'assigner au modificateur statique plus tard, mais le compilateur insiste que c'est impossible.

unresolved static variable 'BaseInfo::li_LotPrecision'  BaseInfo.mqh    60      10

Jeter la variable hors de la classe n'a aucun sens, car elle n'est pas nécessaire ailleurs.

Que faire ?

Raison: