martes, julio 31, 2012

Tutorial de desarrollo web, Parte XLIII: Clases y objetos (I)

Bien, a lo largo de estas últimas semanas hemos aprendido cosas bastante propias del JavaScript. Funciones como la "getElementById" o los eventos no serán cosas que veamos en todos los lenguajes de programación (aunque los eventos están presentes en la gran mayoría... y el "getElementById", aunque también muchos suelen tenerlos, se usa para casos muy específicos), pero hoy vamos a volver a ver elementos bastantes básicos de la programación, los cuales ya hemos mencionado muchas veces a lo largo del curso pero que hoy aprenderemos mejor lo que son: los objetos. Como este tema es bastante complejo, hoy daremos sólo teoría y la semana que viene pasaremos a la práctica.
A lo largo del curso he hablado en múltiples ocasiones de los objetos. Los arrays son objetos, las strings son objetos, el document que tanto hemos usado es también un objeto... Pero, ¿qué es un objeto? Todos podemos apuntar que en el mundo real, un objeto es cualquier elemento con el que nos encontremos que no tenga vida. Un libro, un coche o un ladrillo son objetos. Casi cualquier cosa que se nos ocurra es un objeto. ¿Tiene ésto algo que ver con lo que es un objeto en programación? Pues, mirad por dónde, sí. Y mucho.
En programación, un objeto es cualquier tipo de ente que tenga varias propiedades. Recordemos que, cuando vimos las variables originalmente, dijimos que existían dos tipos de datos, tipos de datos simples (a los cuales pertenecían los enteros, reales, caracteres y booleanos) y tipos de datos complejos (a los que pertenecían las strings y los arrays). Realmente, un "tipo de dato complejo" y un "objeto" es básicamente lo mismo. O casi. Porque aquí entramos con otro nuevo concepto: las clases.
Bien, muchas veces incluso programadores experimentados tienen problemas para diferenciar entre un objeto y una clase (o, aunque lo tenga claro, confunde al usar un término o el otro, como probablemente me haya ocurrido a mí a lo largo del curso). Por eso es que vamos a intentar dejar claro lo que es uno y lo que es otro traspasándolo a la vida real.
  • Para nuestro ejemplo vamos a hablar de coches. ¿Qué es un coche? Un coche es una máquina creada por el hombre que tiene cuatro ruedas, un volante y un motor. Un coche tiene asientos, aunque no siempre tiene la misma cantidad de asientos, y lo mismo ocurre con las puertas. También tiene una matrícula, una marca, un modelo y un propietario. Además, un coche puede arrancar, moverse hacia adelante, moverse hacia atrás, girar, acelerar, frenar y apagarse. Por supuesto, un coche tiene muchas más características, pero para nuestro ejemplo no necesitamos más que eso. De este modo hemos descrito un coche. ¿Qué coche? Ninguno y todos a la vez. Estamos describiendo la idea básica de un coche,. pero no estamos describiendo un coche en concreto. Eso es lo que llamamos una clase.
  • Ahora imaginemos que decidimos darle datos. Nuestro coche, con cuatro ruedas, volante y motor tiene 5 asientos, 3 puertas, su matrícula es 0000-XXX, es un Opel Corsa y pertenece a Paco Hernández Santana (por supuesto, todos estos datos son ficticios). Ahora estamos hablando de un coche en concreto, no es la idea de un coche, sino el propio coche en sí. Es lo que llamamos un objeto.
De este modo, cuando hablamos de una string, estamos hablando de la clase llamada string, que tiene unas determinadas características, mientras que cuando hablamos de "Hola, mundo" estamos hablando de un objeto perteneciente a la clase string.
En programación en muchas ocasiones necesitaremos crear objetos que almacenen determinados datos (como el número de asientos o la matrícula de un coche) o que realicen determinadas acciones (como arrancar o frenar). Y, como posiblemente necesitemos crear múltiples elementos del mismo tipo pero que almacenen distintos datos, necesitaremos crear clases.
Vamos a usar nuestro ejemplo de arriba, el cual no es tan descabellado. Imaginad que estamos creando un juego de coches. Nos encontramos con el hecho de que vamos a tener que programar múltiples coches en nuestro juego. Cada coche tendrá unas características distintas, pero, como ya hemos dicho antes, todos en lo más básico son lo mismo. Por eso debemos comenzar un proceso de abstracción según el que debemos extraer de los coches aquellos datos que sean comunes (el hecho de que tenga cuatro ruedas, un volante y un motor, que tenga asientos aunque no sepamos el número, que sea capaz de arrancar, frenar o girar...) y tener en cuenta aquellos que puedan variar (el número de asientos, la matrícula...). De este modo podremos crear un coche genérico que podremos usar en el juego.
Ahora cada vez que vayamos a crear un coche en el juego, tendremos que darle datos, tal como hicimos antes. De este modo, iremos creando variables que contengan distintos objetos del tipo coche. Al igual que podíamos tener diversas strings cada una distinta en distintas variables, ahora podremos tener distintos coches almacenados en variables. Al hecho de crear un objeto al introducirle datos a una clase se le llama instanciar (de hecho, los objetos pueden ser conocidos también como "instancias de una clase").
De este modo, repasemos el camino para crear un objeto:
  1. Descubrimos que necesitamos múltiples elementos con las mismas características.
  2. Abstraemos de los elementos aquellos datos y acciones que sean comunes.
  3. Instanciamos objetos guardándolos en variables.
Sé que visto así sigue pareciendo muy abstracto y difícil de entender, pero lo que me importa sobre todo esta semana es que hayáis entendido la diferencia entre una clase (abstracta y genérica) y un objeto (concreto y particular). La semana que viene, cuando veamos código entenderemos mucho mejor el resto. Y, como no ha habido práctica, esta semana os libráis de los ejercicios. ¡Pero estudiaos esto bien!

1 comentario:

Ismael dijo...

Las string no son objetos en javascript. Prueba a añadirle un miembro a una string, y mira a ver si la conserva.