martes, 6 de septiembre de 2011

¿Por qué no consigo aprender Java?

Vuelvo al trabajo después de unas merecidas vacaciones. Y de camino en el coche voy pensando... ¿Por qué le cuesta a cierta gente aprender Java?
Programar en Java no es complicado, programar usando la filosofía Orientada a Objetos resulta muy beneficioso (reutilización de código, ...).
Aun así me encuentro con alumnos que se resisten a programar en Java. Y digo que se resisten ya que en ocasiones veo código "Orientado a Objetos" que no es otra cosa que un programa usando Programación Estructurada (al estilo C, con funciones y sin crear clases) escrito con sintaxis Java.

Maaaal, noooo!!! Las ventajas que aparecen en miles de libros sobre la programación orientada a objetos sólo tienen sentido si se usa la filosofía orientada a objetos.
Lo clarifico con un ejemplo: te vistes de Buddha, te sientas con las piernas cruzadas en el suelo durante 3 horas pensando en la cena de hoy, lo que consigues es un dolor horroroso de piernas y piensas "menuda mierda esto de la meditación".
Quiero decir si no se usa la filosofía adecuada lo único que vas a pensar de la Orientación a Objetos es: "menuda mierda".

Si todavía no sabes programar y estas leyendo esto no te asustes. Este problema que comento suele aparecer en individuos que ya han programado con otros lenguajes, y por lo tanto intentan adaptar su manera de programar a este lenguaje (cosa muy normal).
Resulta mucho más fácil empezar de cero. Asimilar bien la idea de clases y objetos, centrarse en esto y olvidar otras características (herencia, polimorfismo, ...) para cuando se tenga claro esto.

Teoría básica
Una clase es un tipo de objetos (p.e. la clase coches).
Un objeto es una ocurrencia particular de una clase (p.e. el Suzuki verde feo de mi vecina)

Cuando se programa en OO, se está describiendo el comportamiento y las características de forma general de los objetos. Esto se hace codificando en lenguaje Java las clases (definiendo sus atributos y sus métodos).

Los atributos son una serie de variables donde cada objeto almacenará sus propios valores.
Y los métodos son las acciones que pueden realizar esos objetos.

Ejemplo:
 La clase coches define atributos como: matrícula, color, marca, modelo, velocidad, combustible (y cualquier otro que se necesite para el programa particular)
 La clase coches por otro lado define el comportamiento dinámico mediante métodos: arrancar, parar, acelerar, girar (y los que se te ocurran según lo que vayas a programar)
 Ahora es cuando hay que entender los beneficios (en este caso claridad de código y reutilización).
 Imagina que quieres hacer un programa de carreras de coches, en el circuito van a haber 20 coches. Definiendo la clase coche y lo que puede hacer, ya tienes hecho este trabajo para los 20 coches y de hecho cada uno de ellos tendrá sus propias características (atributos) y podrá comportarse de forma independiente (llamando a los métodos).

Como el código de las clases se escribe en un fichero separado ("NombreClase.java"), la clase te queda física y lógicamente separada de otras clases.

Ejemplo:
Otro ejemplo en plan juego, quieres hacer un juego tipo Space Invaders. Has visto que los bichos malos se repiten por filas, que se parecen mucho y se comportan prácticamente igual.
Pues crearías:
  • Una clase Bichos (atributos: color, forma, posición; métodos: mover, disparar).
  • Una clase Nave (es la nave que manejas)
  • Una clase Bloque (para esos bloques que paran los disparos)
  • Otras clases de manejo de pantalla y teclado.
  • Una clase principal (p.e. "Juego") donde esté la función "main" que es el punto de inicio del programa. Y que gestiona la lógica del juego.
Para empezar el juego se tendrán que crear los bichos, pues creas una instancia de bicho por cada monstruito (cada uno ocupará una posición, tendrá una forma...). Creas objetos bloque y creas también tu nave. En la clase principal tendrás un bucle donde por pasos: moverás los bichos y harás las comprobaciones necesarias.
Como la nave va a su aire, se pueden usar Threads, pero esto ya escapa de la mera filosofía orientada a objetos.

Lo que he querido ejemplificar la filosofía. Ahora te queda ir probando y consultando la sintáxis Java.
Cuando crees un programilla, replanteate cómo lo harias si tuvieras que volver a hacer lo mismo. Esos cambios que observes (que te ubiesen ahorrado trabajo y que dejan el código más limpio) son los que plasman mejor la idea Orientación a Objetos.

Suerte!

1 comentario:

Unknown dijo...

Ei Ferran!
Que sorpresa ver tu blog actualizado en el lector rss, jeje!

Yo creo que a la gente le cuesta Java y la programación orientada a objetos porque realmente es difícil de aprender bien.

Para usar bien la POO hay que interiorizar muchos patrones poco a poco. Por ejemplo, para las páginas o para los videojuegos hay patrones básicos como el MVC. En realidad es sencillo entender la herencia, la composición, asociación, etc... pero es dificil saber como se interrelacionan formando patrones para resolver problemas complejos.

Hay un tipet que está escribiendo un libro sobre los patrones aplicados a los videojuegos, por si te interesa:

http://gameprogrammingpatterns.com/

Saludos y nos leemos!