Una pregunta para los expertos en POO. - página 6

 
Реter Konow:

El código no es portable - esa es su peculiaridad. No está pensado para ser portátil. Tiene otro propósito. Pues bien, el ámbito global de las variables es una poderosa herramienta para implementar mecanismos complejos. Sólo hay que saber utilizarlo. Cuando la gente me habla de errores y fallos ocultos, me confundo. Nunca he tenido ningún error relacionado con la visibilidad de las variables globales. En una palabra, en absoluto.

El problema con las variables globales es que si el proyecto es lo suficientemente grande y los cambios en el estado de estas variables provienen de muchas secciones de código, es bastante lento buscar los errores.

Ejemplo. Se encuentra un error porque el valor de una variable global no es claramente el que debería ser. Hay un par de docenas de archivos y 100500 líneas de código en el proyecto. Nadie recuerda cuántos fragmentos de código cambia esta variable. El resultado es una jarra de café y un sueño profundo con la cabeza pegada al teclado.

Y ahora lo mismo, pero OOP. Hemos escrito el código correctamente y todos los campos son privados. En consecuencia, directamente se cambia sólo en los métodos de la clase, y desde fuera sólo por el método Set. En consecuencia, ponemos puntos de ruptura en el método Set y en cuantos métodos hay en la clase, donde se cambia el campo, y podemos rastrear fácilmente donde se hacen los cambios y donde se cambiaron incorrectamente.

 
Реter Konow:

Nunca he tenido ningún error relacionado con la visibilidad de las variables globales. En absoluto.

Ni siquiera sé cómo convencerte de lo obvio, pero probablemente no debería, no me pagan por ello, ¿verdad?

¿Qué intentas hacer? Bueno, si quieres elogios, ahí tienes:

¡Peter! ¡Bien hecho, sigue así!

))))

 
Vladimir Simakov:

El problema con las variables globales es que si el proyecto es lo suficientemente grande y los cambios en el estado de estas variables provienen de muchas secciones de código, es bastante lento buscar los errores.

Ejemplo. Se encuentra un error porque el valor de una variable global no es claramente el que debería ser. Hay un par de docenas de archivos y 100500 líneas de código en el proyecto. Nadie recuerda cuántos fragmentos de código cambia esta variable. El resultado es una jarra de café y un sueño profundo con la cabeza pegada al teclado.

Y ahora tenemos lo mismo, pero es OOP. Hemos escrito el código correctamente y todos los campos son privados. En consecuencia, sólo se modificará directamente en los métodos de la clase, pero desde fuera sólo mediante el método Set. En consecuencia, ponemos puntos de ruptura en el método Set y en cuantos métodos hay en la clase, donde se cambia el campo, y podemos rastrear fácilmente donde se hacen los cambios y donde se cambiaron incorrectamente.

De la práctica. Tengo más de 100 archivos conectados en mi proyecto. Algunos tienen más de 2000 líneas de código. Las variables globales se utilizan en todas partes. Nunca he tenido ningún fallo relacionado con su globalidad. Tal vez sólo me he adaptado). Tal vez no haya errores porque todas las variables están en ruso y todos los nombres tienen sentido. No hay sdf ni iukj. Por lo tanto, no tengo ningún error asociado a ellos. En general, las variables globales se utilizan para los indicadores de eventos globales, por ejemplo, la apertura de una ventana, la pulsación de los botones del ratón, la ampliación de una lista antigua, etc. También, para enfocar. En otras palabras, el ratón recorre la GUI, y los números de todos los objetos y elementos y sus propiedades se escriben en variables globales, y los bloques requeridos se llaman desde OnChartEvent, que trabajan inmediatamente con los objetos y elementos en foco. Esto es muy conveniente.
 
Igor Makanu:

Ni siquiera sé cómo convencerte de lo obvio, pero probablemente no debería, no me pagan por ello, ¿verdad?

¿Qué intentas hacer? Bueno, si quieres elogios, ahí tienes:

¡Peter! ¡Así se hace!

))))

No estoy logrando nada. Bueno, tal vez entender que no sólo con la POO se pueden escribir proyectos geniales. Y no sólo dominar la POO es un signo de desarrollador. No discuto que se puedan resolver muchas tareas con OOP. Pero hay otros enfoques.
 
Gracias a todos por participar en el debate. Intentaré adentrarme en la POO para comparar realmente las capacidades de ambos enfoques. Me interesa la jerarquía que puede proporcionar la POO, y si su utilidad no queda enterrada bajo su sintaxis, definitivamente la adoptaré.
 
Реter Konow:
Bueno, tal vez la comprensión del hecho, que no sólo con OOP puede escribir proyectos cool. Y no sólo ser competente en POO es un signo de desarrollador. No discuto que se puedan resolver muchas tareas con OOP. Pero hay otros enfoques.

no se trata de POO, se trata de los principios de escritura de código en sí, es la segunda vez que hablo de ello y@Vladimir Simakov escribió un ejemplo arriba

Si quieres utilizar la visibilidad de las variables globales, no hay problema, nadie te lo prohíbe, puedes hacerlo, pero en silencio, mientras nadie te mira. )))

pero como estilo de escritura de programas permanentemente utilizado es malo, y cuanto más código, más de este mal! - así lo has explicado? )))

SZY: una prueba más - mira la ayuda de MQL, ¿ves que todas las funciones están hechas como unidades separadas y completamente independientes? - pasar los parámetros = ¡obtener el resultado! ¿Crees que los programadores de Metakvot lo están haciendo mal de nuevo? Deberíamos utilizar algunos estilos libres de escribir funciones - aquí en el ámbito global, y aquí el usuario llamará a la función y obtendrá el resultado! )))) - el estilo procedimental (donde cada subrutina es un bloque lógico completo) es el código correcto, ¡escriba los códigos correctamente! no ... bueno, ya vendrá solo "cuando lo necesites rápido" ;)

 
Реter Konow:
De la práctica. Tengo más de 100 archivos conectados en mi proyecto. Algunos tienen más de 2000 líneas de código. Las variables globales se utilizan en todas partes. Nunca he tenido ningún fallo relacionado con su globalidad. Tal vez me haya adaptado a ello).

Es que tienes muy buena memoria. No todo el mundo tiene esa suerte. Ya recuerdo débilmente qué variables he introducido hoy. No recuerdo cuáles eran los de hace una semana. Pero eso no es un problema, todos son locales y el acceso a los campos de cualquier objeto es sólo a través de las funciones apropiadas. La POO me permite no recordar muchas cosas, ya lo he dicho más de una vez - idealmente, en cualquier lugar del código deberías tener acceso sólo a lo que necesitas y no a más variables - así que aunque quieras no puedes cambiar lo que no debes. Y cuando realmente lo necesites, tendrás que averiguar por qué no puedes acceder a una variable- es sólo un descuido, o más a menudo es una variable que necesita trabajo adicional para ser modificada. Si estuviera disponible de inmediato, se olvidaría de ellos, y entonces tardaría mucho tiempo en averiguar por qué el programa no funciona o no funciona como uno quiere.

 
Реter Konow:
No intento conseguir nada. Bueno, tal vez entender que no sólo con la POO se pueden escribir proyectos geniales. Y no sólo dominar la POO es un signo de desarrollador. No discuto que se puedan resolver muchas tareas con OOP. Pero hay otros enfoques.

Otra cosa buena de la POO es que poco a poco vas adquiriendo librerías de clases, sobre todo las realmente universales, que te acompañan toda la vida y te facilitan esta vida.

De un proyecto real, realmente funciona. No hay ninguna molestia, sólo hay que controlar el número y el estado de los pedidos/posiciones disponibles. Esta función sólo controla que la posición/orden no esté cerrada/cancelada y la elimina de la lista después del cierre.

void OrdersControl(){
   for (CTrade* it=gPos.Begine();
        it!=NULL;
        it=it.Control()?gPos.Next():gPos.Delete());}

Donde gPos es CList<CTrade> gPos

CList y CTrade no son de la biblioteca estándar.

CTrade se hereda de mi propia biblioteca CPosition.

En realidad, a continuación está todo el CTrade que necesitas para que el código de tu proyecto sea legible:

#include "..\Header.mqh"

#ifndef _C_TRADE_
#define _C_TRADE_

#include "..\..\..\Shared Projects\mqlLib\Objects\Trade\CPosition.mqh"

class CTrade:public CPosition
  {
public:
                     CTrade(double mVolume,int mDirect,double mSL,double mTP);
   bool              Control() {return !( CPosition::Control()&TRADE_FINISH);}
  };
//-------------------------------------------------------------------------------------
void CTrade::CTrade(double mVolume,int mDirect,double mSL,double mTP):
   CPosition(NULL,
             mDirect>0?OP_BUY:OP_SELL,
             mVolume,
             0.0,
             mSL,
             mTP)
{}

#endif
Toda la implementación del manejo de la orden/posición está oculta en el archivo de la biblioteca CPosition de la plataforma.
 
Реter Konow:
Gracias a todos por participar en el debate. Intentaré profundizar en la POO para comparar realmente las capacidades de ambos enfoques. Me interesa la jerarquía que puede proporcionar la POO, y si su utilidad no queda enterrada bajo su sintaxis, sin duda la adoptaré.

Ayúdate a ti mismo en YouTube. Hay muchas cosas ahí. Sobre todo en inglés, que se te da bien.


No te sobran 45 minutos, Peter. Al principio es muy importante entender de qué está hablando este tipo. Probablemente muchos le discutirán, pero en general tiene razón:


 
Nikolai Semko:

Ayúdate a ti mismo en YouTube. Hay muchas cosas ahí. Sobre todo en inglés, que se te da bien.


No te sobran 45 minutos, Peter. Al principio es muy importante entender de qué está hablando este tipo. Probablemente muchos le discutirán, pero en general tiene razón:


Gracias, Nikolai. Estaré atento.