OOP vs. programación procedimental - página 6

 
Dmitry Fedoseev:

¿Y cómo vas a hacer que el arrastre se adapte a los diferentes parámetros?

Vamos a probarlo en una tarea específica. Si tiene uno, por favor, facilítelo.
 
Реter Konow:
Preferiblemente, que conduzca a una tarea específica. Esta descripción no es muy clara. En mi práctica, el algoritmo no cambia al cambiar los parámetros externos. Se hace universal de antemano para cualquier valor de estos parámetros. Por lo tanto, no está muy claro lo que quiere decir. Descríbalo con un ejemplo concreto.
class Ордер
{
  public: int SELL;

  Ордер(void) // Конструктор имеет то же имя, что и класс. Выполняется при инициализации переменной класса
  {
    SELL=0;
    int k=OrdersHistoryTotal()-1;
    for(; k>=0; k--)
    {
      if(!OrderSelect(k, SELECT_BY_POS, MODE_HISTORY)) continue;
      if(OrderType()==OP_SELL)SELL++;
    }
  }
}x;

void OnStart()
{
  Alert(x.SELL);
}

Gracias a la POO, el programa principal es muy breve y claro. Este es sólo el primer ejemplo que se me ocurre. Si necesita calcular el número de pedidos con frecuencia, las ventajas son evidentes. Es difícil entenderlo a la primera. Pero las funciones, incluso con parámetros, también fueron en su día una dificultad

 
Реter Konow:
Probemos con alguna tarea en particular. Si lo ha hecho, por favor, indíquelo.

Tarea específica. El cliente ha pedido un Asesor Experto para dos MAs, que incluiría todas las variantes de arrastre disponibles en la base de código, pero no se ralentizaría en el probador.

El EA también debería tener la posibilidad de actualizarse con nuevas variantes de arrastre en el futuro (a bajo coste).

 
STARIJ:

Gracias a la POO, el programa principal es muy corto y claro. Este es sólo el primer ejemplo que se me ocurre. Si necesitamos calcular el número de pedidos con frecuencia, las ventajas son evidentes. Es difícil entenderlo a la primera. Pero las funciones, incluso con parámetros, también fueron en su día una dificultad

No entiendo, ¿por qué no hacer una función "int Número_órdenes()" que haga siempre el bucle anterior y devuelva el valor del contador "VENDER"?

Por ejemplo:

 int Количество_ордеров()
  {
    SELL=0;
    int k=OrdersHistoryTotal()-1;
    for(; k>=0; k--)
    {
      if(!OrderSelect(k, SELECT_BY_POS, MODE_HISTORY)) continue;
      if(OrderType()==OP_SELL)SELL++;
    }
   return(SELL);
  }


¿Por qué necesitamos una clase aquí?

 
Dmitry Fedoseev:

Por ejemplo, hay que meter 100 variantes de trailing stop en un Asesor Experto. Cuando se programa de forma procedimental, se obtiene un lío como este:

100 fragmentos de código idénticos. Cuando el programa se está ejecutando, suele incluir sólo un trailing stop. Los 99 if restantes sólo consumen recursos.

Ahora la variante OOP. Durante la inicialización del Asesor Experto, escalamos el array con punteros según el número de barras de arrastre, creamos objetos sólo para las barras de arrastre habilitadas. Como resultado, el siguiente código funcionará siempre:

Si se habilita una barra de arrastre, entonces cnt=1, es decir, no hay nada innecesario.

Haz un array de nombres de funciones, elige el nombre del índice y accede.


La OOP no tiene nada que ver. Esta es una limitación del lenguaje que están tratando de resolver con la POO

 

No lo he probado, pero por ejemplo no se puede hacer un lenguaje no típico sin una OOP.

 
Реter Konow:

No entiendo por qué no hacer una función "int Número_órdenes()" que haga siempre el bucle anterior y devuelva el valor del contador "VENDER"?

Habiendo finalizado la clase, obtendré x.VENTA x.COMPRA x.TODO y todo lo que necesite. Y será muy fácil abordarlos. Clases OOP - para simplificar
 
Dmitry Fedoseev:

Tarea específica. El cliente ha pedido un Asesor Experto para dos MAs, que incluiría todas las variantes de arrastre disponibles en la base de código, pero no se ralentizaría en el probador.

Y con la perspectiva de añadir nuevas variantes de arrastre en el futuro (no es caro).

Ya veo. Este es un argumento indiscutible a favor de la OOP. La estupidez del cliente y la falta de tiempo para luchar contra ella y la falta de voluntad para mejorar el algoritmo de otra persona). Sí, en este caso se necesita OOP. Estoy de acuerdo).
 
STARIJ:
Refinando la clase, obtendré x.SELL x.BUY x.ALL y lo que sea necesario. Y será muy fácil abordarlos. Clases OOP - para simplificar
Afinando la función, puedes obtener todas estas mismas variables en un array, que pasarás a esta función. Entonces úsalo como es debido...
 
СанСаныч Фоменко:

Haz un array de nombres de funciones, elige un nombre del índice y llámalo.


No tiene nada que ver con la OOP. Se trata de una limitación del lenguaje que intentan resolver con la ayuda de la POO.

No hay ninguna llamada a la función por el nombre definido como una cadena. Y en aquellos lenguajes en los que existe, se hace a través de un hash de una tabla, es decir, es una terrible desventaja.

Una forma normal de resolver este problema sería utilizar punteros a funciones (sobre esto escribí aquí). Pero por qué usar sólo punteros, hay una manera más conveniente - OOP, que permite no sólo aprovechar los punteros de función, sino también estructurar convenientemente los datos y el código.