jueves, 4 de agosto de 2011

A veces a uno le falta teoría...

Antes que nada, no tengo formación teórica-pura de Programación Orientada a Objetos (POO). Lo que sé lo aprendí de libros varios que apuntan a enseñar programación orientada a objetos para un cierto lenguaje. Y tampoco tengo un conocimiento de compiladores+assembler lo suficiente bueno como para no estar preguntandome ésto. El lado bueno: al menos se me ocurre pensarlo :-)

Veamos éste caso:

class PublicFoo {
public:
  int mFoo;
}

Si, justo lo que no debiese hacerse en POO. Pero suponiendo que ya instancié un objeto con ésta clase y éste tuviese un valor, podría accederlo como:

PublicFoo data = new PublicFoo();
// De alguna manera se carga un dato...
int valor = data.mFoo;

Desde el punto de vista de acceso, debería ser inmediato. Si ahora usamos:

class PrivateFoo {
public:
  int foo() { return mFoo; };
  void setFoo(int foo) { mFoo = foo; };
private:
  int mFoo
}

Para obtener el valor de foo haríamos:

PrivateFoo data = new PrivateFoo();
// De alguna manera se carga un dato...
int valor = data.foo();

Lo que puede llegar a implicar que el compilador genere código para entrar en el método foo(), haciendo mas lento el acceso al valor.

Ahora, en éste otro caso:

class PrivateInlineFoo {
public:
  inline int foo() { return mFoo; };
private:
  int mFoo
}

Un acceso quizás sea tan rápido como en el primero, ya que se me ocurre que el compilador tenga el hint del inline para mejorar el acceso.

Seguramente me estoy perdiendo *mucho* a causa de mi ignorancia. Pero les cuento a que vino todo ésto: se me ocurrió pensar que pasaría si existiese una propiedad de visivilidad que permita que cualquiera acceda al valor de la propiedad de la clase para lectura, pero sólo la clase pueda modificar dicho valor. ¿sería mas "sencillo" programar?

En fin, nada mas mostrándole al mundo mis dudas e ignorancia :-)

3 comentarios:

  1. Interesante propuesta, un "solo lectura" en la instancia del objeto. ¿Alguna vez programaste en Objective-C? No es lo que propones, pero resulta una alternativa interesante en POO

    ResponderEliminar
  2. En C# me parece que eso es posible, se llaman Propiedades

    en POO, uno se acostumbra a que lo que "se puede obtener" de una clase comienza con get, es decir "getAlgo()" y lo que "se puede establecer", comienza con set "setAlgo(valor)"

    he estado leyendo tu blog, es fantástico.

    ResponderEliminar
  3. La teoría de objetos no es tan loca. La idea es que para interactuar con el objeto tenés que mandar mensajes. En general eso se logra agregando un nuevo método de instancia a la clase. Lo mismo que vos hiciste.

    La cuestión de eficiencia en general en Java y C++, donde tenés "hints" de los tipos de datos de los objetos, los métodos se convierten en inline. Lo mismo que planteás.

    El punto no es exactamente de sencillez, sino de implementación. La clase de ejemplo que vos usaste es bastante trivial, pero la razón básica es que sea posible cambiar la representación interna de los datos sin modificar la interfaz. Asignar un valor a una variable es un detalle de implementación.

    Entonces, en vez de tener dos funciones para guardar y leer una variable, se puede cambiar de clase y hacer algo diferente. Por ejemplo, llamar a su vez a otra funcion para guardar y leer el estado del objeto y que se calcule al momento de llamar la función.

    Este cambio es mucho más fácil de lograr si solo accedés al objeto por funciones, sin tocar las variables internas.

    ResponderEliminar