Preguntas de POO (Programación Orientada a Objetos) - página 11

 

Me gustaría conocer la opinión de programadores más experimentados sobre algunos matices. Toma las declaraciones de las variables en las clases. Por ejemplo, tengo variables en clases que se declaran dentro de diferentes métodos de una determinada clase. Se declaran en cada método con mayor frecuencia. ¿Vale la pena hacer esto, o es mejor declararlos una vez en la sección privada y luego usarla?

Creo que sería más lógico utilizar variables de contador, si se utilizan en bucles, ¿no? Al fin y al cabo, el contador se fija explícitamente en un valor en el momento del cálculo, por ejemplo, si utilizamos un bucle:

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

}

En cada método, no sería razonable declarar una variable i, porque esto es probablemente un desperdicio innecesario de memoria en las celdas de memoria. En general, me interesan estas cosas.

Esto no sólo afecta a los bucles, sino también a otras opciones. Hay bastantes variables diferentes que tienen que ser declaradas más de una vez, pero juegan el mismo papel... Lo único que veo es que habrá que poner a cero el valor de algunos de ellos, para que no contengan "basura" de operaciones anteriores. ¿Es razonable hacerlo o es más fácil volver a declarar dicha variable... En general, me gustaría que los profesionales me hablaran de ello.

 
hoz:

Me gustaría conocer la opinión de programadores más experimentados sobre algunos matices. Toma las declaraciones de las variables en las clases. Por ejemplo, tengo variables en clases que se declaran dentro de diferentes métodos de una determinada clase. Se declaran en cada método con mayor frecuencia. ¿Vale la pena hacer esto, o es mejor declararlos una vez en la sección privada y luego usarla?

Creo que sería más lógico utilizar variables de contador, si se utilizan en bucles, ¿no? Al fin y al cabo, el contador se fija explícitamente en un valor en el momento del cálculo, por ejemplo, si utilizamos un bucle:

En cada método, no sería razonable declarar una variable i, porque esto es probablemente un desperdicio innecesario de memoria en las celdas de memoria. En general, me interesan estas cosas.

Esto no sólo afecta a los bucles, sino también a otras opciones. Hay bastantes variables diferentes que tienen que ser declaradas más de una vez, pero juegan el mismo papel... Lo único que veo es que habrá que poner a cero el valor de algunos de ellos, para que no contengan "basura" de operaciones anteriores. ¿Es razonable hacerlo o es más fácil volver a declarar dicha variable... En general, me gustaría que los profesionales me hablaran de ello.

La conveniencia de hacerlo o no depende del propósito de la creación de la variable. Si una entidad está encapsulada por una clase, por ejemplo un pedido, entonces necesitaremos variables definidas en la clase para expresar sus propiedades, por ejemplo un ticket para el pedido. Estas variables serán compartidas por todos los métodos de esa clase para el mismo objeto de esa clase.

Si se crea una variable para proporcionar un bucle dentro de un método, debe definirse dentro del método como automática (es decir, sin utilizar la palabra clave static). En este caso, incluso si un método llama a otro dentro de su propio bucle, que también tiene un bucle, y se utiliza la variable con el mismo nombre, no tendrá ningún problema. Cuando se utiliza una variable declarada en una clase, la variable se sobrescribirá en el bucle del segundo método.

En el caso de las variables automáticas, la memoria se asigna automáticamente cuando se introduce la función y se elimina automáticamente cuando se sale de ella, con una sobrecarga mínima. Además, si las funciones son sencillas, el compilador puede generar código que no asigne ni libere memoria automática en absoluto.

Guardar celdas de memoria de este tipo solía ser algo sensato hace algún tiempo, pero finalmente perdió su sentido hace unos 20 años...

 

Hay una clase. Tiene un método tan simple, todo sin marca al infierno, porque estaba buscando donde está el error:

// 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 solía estar sin modificador estático, luego vi que no debía perder valor y lo cambié. Me hedado cuenta de que, aunque he añadido el modificador, la variableli_LotPrecision no conserva su valor.

Lo imprimo en OnInite():

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

En el registro:

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

Esto muestra claramente que después de salir de la función LotPrecision() , el valor de la variableli_LotPrecision se pierde. ¿Cómo hacer que se mantenga constante?

Intenté añadir esta variableli_LotPrecision a la sección privada de la clase, paraasignarla posteriormente al modificador estático, pero el compilador insiste en que es imposible.

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

Lanzar la variable fuera de la clase no tiene sentido, porque no se necesita en ninguna otra parte.

¿Qué hacer?

Razón de la queja: