Representación de Coordenadas

Iniciado por amchacon, 9 Abril 2014, 16:49 PM

0 Miembros y 1 Visitante están viendo este tema.

eferion

Cita de: amchacon en  9 Abril 2014, 18:29 PM
Vaya no lo había visto así. ¿Pero es necesario el encapsulamiento en un objeto así?

En el caso concreto de las coordenadas no hay mucha diferencia... Sin embargo me gustaría matizar un detalle:

* Si cambias la implementación de la función, sin cambiar la firma, únicamente necesitas recompilar la clase para que todo siga funcionando.

* Si expones la variable directamente y después necesitas cambiarlo a función porque te das cuenta de que necesitas realizar algún chequeo u operación adicional, te ves obligado a recompilar todo el código ( en mi caso unas 6 horas ).

* Los getters y los setters pueden ser convertidos a inline por el compilador, por lo que tendrían exactamente el mismo rendimiento que exponer la variable directamente.

Por ese motivo a mí me gusta más la tercera opción... pero creo que es también cuestión de costumbre.

Cita de: ivancea96 en  9 Abril 2014, 18:04 PM
No es necesario controlarlos con una clase. Es más: se hace más engorroso poner coord.getX() que poner coord.x.

también puedes declarar la clase tal que:

Código (cpp) [Seleccionar]

class Coord
{
  public:
    int X( ) const;
    void X( int x );

    int Y( ) const;
    void Y( int y );

    void SetValues( int x, int y );
};


Tampoco hay demasiada diferencia entre poner coord.X( valor ) y coord.X = valor.

Por otro lado, si es cierto que estaría genial que en alguna revisión incorporasen el concepto de propiedades a C++... reconozco que el uso del operador = es más intuitivo.

También recordar que gracias a la sobrecarga de operadores, es posible "linealizar" este tipo de estructuras para poder acceder a sus elementos de forma secuencial:

Código (cpp) [Seleccionar]

class Coord
{
  public:
    int X( ) const;
    void X( int x );

    int Y( ) const;
    void Y( int y );

    int& operator[]( int index ) const
    {
      int to_return = 0;

      if ( index == 0 )
        to_return = x;
      else if ( index == 1 )
        to_return = y;

      return to_return;
    }
};


Otra ventaja importante de usar getters y setters es que se pueden poner breakpoints en los mismos... mientras que para los accesos directos a variables esto es imposible.

amchacon

Cita de: eferion en 10 Abril 2014, 08:39 AM* Si expones la variable directamente y después necesitas cambiarlo a función porque te das cuenta de que necesitas realizar algún chequeo u operación adicional, te ves obligado a recompilar todo el código ( en mi caso unas 6 horas ).
Un inciso.

Si cambias el tipo de la coordenada de int a float (o añades algún método/operador nuevo)... ¿No tendrías que recompilar todo el código? Para que te coja la declaración de la clase digo.

Lo pregunto por si conoces algún atajo que yo no sepa.
Por favor, no me manden MP con dudas. Usen el foro, gracias.

¡Visita mi programa estrella!

Rar File Missing: Esteganografía en un Rar

eferion

Cita de: amchacon en 10 Abril 2014, 12:41 PM
Si cambias el tipo de la coordenada de int a float (o añades algún método/operador nuevo)... ¿No tendrías que recompilar todo el código? Para que te coja la declaración de la clase digo.

Es que eso no es un chequeo u operación adicional... eso es un cambio de variable directamente.

Yo me refería a, por ejemplo, tener que añadir una comprobación para evitar coordenadas con valores negativos, o limitar el número de decimales, en el caso del tipo float, para evitar "oscilaciones" debido a la falta de precisión.


Eternal Idol

#13
Cita de: eferion en 10 Abril 2014, 08:39 AMOtra ventaja importante de usar getters y setters es que se pueden poner breakpoints en los mismos... mientras que para los accesos directos a variables esto es imposible.

Depende de que no sean metodos inline (cosa mas bien comun ya que suelen ser de un par de lineas), por otro lado si tenes muchos objetos de esa clase en uso tendras muchos breaks y si te interesa uno en particular es posible poner breakpoints en memoria (aplica a los miembros de una clase y a variables).
La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste.
Juan Domingo Perón

eferion

Si compilas en Debug, desde luego no van a ser inline porque no se aplicarán optimizaciones... por otro lado, breakpoints en memoria, estoy seguro que muchísima gente no sabe utilizarlos o, directamente, no sabe que existen.

Eternal Idol

Por eso dije que depende, en mi experiencia de miles de horas de depuracion en Release suele suceder mucho. Que lo aprendan en el foro seria muy bueno, es muy util si la funcion es llamada multitud de veces.
La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste.
Juan Domingo Perón