Comunidad de diseño web y desarrollo en internet

Clases Dinámicas y Clases Estáticas

Hemos llegado lejos -al menos más lejos de lo que pensé en un principio- y hasta ahora hemos establecido las bases para entender de qué se trata todo esto de la Programación Orientada a Objetos y cómo escribir y usar nuestras clases. Lo que haremos a partir de este punto será concentrarnos más en ciertos detalles relativos a la creación y utilización de las clases, que nos permita que nuestros proyectos sean más eficientes y flexibles para, entre otras cosas, no vernos en la necesidad de tener que modificar una clase cada vez que vamos a usarla en un nuevo proyecto (algo que es muy común cuando se comienza a programar con ellas) y hallar la forma de tener un mejor control de nuestro código sin que ello sea un dolor de cabeza a la hora de usarlas en distintos proyectos.

En este post nos concentraremos en averiguar cuáles son los tipos de clases que existen y cuál es la utilidad de cada uno. Por eso, antes de comenzar, quiero hacer una aclaratoria para no confundirnos a causa del título. Existen tres tipos básicos de clases: cerradas, dinámicas y estáticas.

La razón por la que no hablaremos del primer tipo es porque ya lo conocemos (O’ RLY?). Sí, las clases que hemos estado programando hasta ahora se conocen como clases cerradas, es decir, todos los eventos, métodos y propiedades están definidas dentro de la clase, así que no es posible agregárselos dinámicamente.

Clases Dinámicas

En oposición a las clases cerradas existe lo que se conoce como clases dinámicas. Su principal característica es que permiten agregar en tiempo de ejecución, propiedades y métodos a la clase, es decir, que yo puedo agregar una nueva propiedad a la instancia de mi clase, aunque ésta no haya sido definida originalmente. Veámoslo con un ejemplo comparativo:

Clase Dinámica vs. Clase No-Dinámica

Como puedes ver, la única diferencia entre Persona y Persona2 es que en el segundo caso hemos agregado, en la declaración de la clase, la palabra clave dynamic. Esta palabrita es la que hará toda la magia, ya que, como puedes ver en la implementación (más abajo, en la imagen), la instancia de Persona nos dará un error en tiempo de compilación (diciéndonos que la clase Persona no tiene una propiedad llamada apellido), mientras que Persona2 simplemente creará la nueva propiedad (fíjate que no existe en la clase) y le colocará el valor correspondiente.

De hecho, si has trabajado con AS2 (que supongo que así es), posiblemente esto sea algo que has implementado varias veces.
En cualquier caso, no es recomendable usar clases dinámicas a menos que sea necesario, porque entre otras cosas, la verificación de datos es menos estricta que en las clases cerradas, lo que hace que se pierda control sobre los datos de la clase, haciéndola susceptible de errores inesperados.

Clases Estáticas

Por su parte, las clases estáticas están pensadas para contener elementos (propiedades o métodos) que no dependen directamente de un objeto para su funcionamiento ¿Cómo es eso? Veamos:

En varias ocasiones nos encontramos con que tenemos una función que puede ser utilizada por distintos objetos, o en diferentes situaciones, que no están relacionadas con algún objeto específico, puede ser el caso de una operación matemática, un cálculo, dibujar una forma geométrica, etc. Sin las clases estáticas la opción sería: Crear esta misma función en cada clase que utilizamos (copiar y pegar no es reusabilidad). Pero esto es algo engorroso y poco práctico (¿qué pasa si queremos agregar un nuevo parámetro a nuestra función o conseguimos una forma más efectiva de hacer lo mismo? Tendríamos que reescribir el código en cada clase donde lo hemos usado… y tú no quieres hacer eso ¿verdad?).

Un buen ejemplo de clases estáticas es la clase Math, común en ActionScript, Javascript, .Net, etc. Esta clase se encarga de hacer una serie de operaciones matemáticas a las que sólo les pasamos los parámetros que necesita. Otro ejemplo típico sería una clase que se encargara de dibujar objetos. Es la que veremos en este ejemplo:

Clase Estática

En este caso, tenemos una clase que contiene un sólo método (getSolidRectangle), que además es de tipo estático (lo sabemos por el uso de la palabra clave static en la declaración del método) y que dibuja un rectángulo con color de fondo sólido en un mc que hemos enviado como primer parámetro.

Si nos fijamos en la implementación de la clase, veremos que sólo tiene tres líneas:

  1. Importa la clase.
  2. Crea el movieclip donde dibujaremos el rectángulo.
  3. Llamamos al método getSolidRectangle para dibujar el rectángulo en cuestión

Como te habrás dado cuenta, en este caso no hemos creado una instancia de Graph (que lo haríamos con la palabra clave new). Esto se debe a que las clases estáticas no se instancian (o sea, que no podemos crear objetos a partir de ellas), sino que podemos usar directamente sus elementos, simplemente apuntando a al clase misma (Graph.getSolidRectangle()). Si alguna vez has usado la clase Math sabes de lo que estoy hablando.

Es por eso que las clases estáticas normalmente son utilizadas para albergar esos procedimientos que queremos reutilizar una y otra vez, pero que no están directamente asociados a un objeto o una clase en particular. Así, en vez de tener que escribir una y otra vez el mismo procedimiento, sólo tenemos que importar la clase y usarla. Si luego queremos hacer cambios en el(los) procedimiento(s), hacemos los cambios en la clase estática y estos se actualizarán automáticamente en todos los sitios donde se utilice. Esto sí es reusabilidad ;)

Un dato importante, cuando creamos una clase estática, todos los elementos públicos de dicha clase también deben ser estáticos.

 

Información adicional

Si tienes alguna pregunta de este ejemplo; puedes hacerla aqui en los foros.