¿Qué es programar?: Prototipado y programación orientada a objetos

Este ya es el último capítulo con teoría, y es que nos queda un último paso antes de adentrarnos al desarrollo de videojuegos. En este nos centraremos más de lleno en uno de los elementos que más se usan a día de hoy en el mundo de la programación, y por ende en la creación de videojuego.

La programación orientada a objetos (POO) puede puede resultar un tema raro así de primeras, e incluso difícil de aprender, pero luego cuando lo entiendes es una de las cosas más prácticas. La POO permite realizar un gran nivel de abstracción y reutilización de código. Para ello define una unidad básica: el objeto, el cual tiene unos atributos y unos métodos. Con los atributos podemos definir el estado actual del objeto, así como sus propiedades, mientras que los métodos nos sirven para cambiar el estado interno o realizar distintos comportamientos. Cuando le pedimos a un objeto que ejecute un método, lo que se suele hacer es enviar un mensaje de lo que tiene que hacer.

Para que no parezca tan difícil, esto lo vemos mejor en un ejemplo. Supongamos que queremos modelar un coche. Los coches tienen unas propiedades como el número de puertas; si es de tracción trasera o delantera; si es de gasolina, diesel o eléctrico; cuál es su aceleración (cuánto tarda en estar de 0 a 100 km/h); el número de bastidor; matrícula, etcétera. También tiene unos comportamientos como acelerar, frenar, cambiar de marcha, poner el intermitente derecho, poner el intermitente izquierdo, etcétera.

Para poder modelar esto, existen dos formas en POO:

  • Programación basada en clases: Para poder crear un objeto primero tenemos que definir una clase, que es la plantilla que define los métodos y atributos, actuando como nuevo tipo. Cuando queremos tener un nuevo objeto de este tipo creamos lo que se llama instancia, que se crea desde 0 partiendo de la clase. Estas clases pueden heredar de otras clases, es decir, que se puede crear una jerarquía con clases padre y clases hijas. Esto es útil, por ejemplo, si quieres definir clases que comparten elementos básicos, como puede distintas figuras geométricas como círculos, triángulos o rectángulos.
    clase Coche, que hereda de Automóvil:
        atributo númeroPuertas : entero.
        atributo marchas : entero.
        atributo aceleración : flotante.
        ...
    
        método Iniciar(númeroPuertas : entero, marchas : entero, ...):
            objeto.númeroPuertas = númeroPuertas.
            objeto.marchas = marchas.
            ...
        fin.
    
        método acelerar():
            ...
        fin.
    
        método frenar():
            ...
        fin.
    
        método entero númeroMarchas():
            devolver objeto.marcha.
        fin.
        ...
    fin.
    
    miCoche : Coche(5, 6, ...). <- Creamos un objeto Coche
    tipo miCoche. <- Devuelve “Coche”
    tipo padre miCoche. <- Devuelve “Automóvil”
    miCoche <- acelerar. <- Enviamos un mensaje al objeto
    miCoche.marchas = 8. <- Cambiamos un atributo
    miCoche <- númeroMarchas. <- Los métodos pueden devolver mensajes, en este caso retorna “8”
  • Programación basada en prototipos: Se crea un objeto que servirá como prototipo o raíz, definiendo sus métodos y atributos. Para crear un nuevo objeto que sea parecido al prototipo, se clona el prototipo. Todos los objetos son de tipo “objeto”, y para crear una jerarquía, un prototipo clona otro prototipo.
    Coche : objeto = clonar Automóvil.
    Coche.númeroPuertas : atributo entero.
    Coche.marchas : atributo entero.
    ...
    
    Coche.iniciar : método (objeto : objeto, númeroPuertas : entero, ...):
        objeto.númeroPuertas = númeroPuertas.
        ...
    fin.
    
    Coche.acelerar : método ():
        ...
    fin.
    
    Coche.frenar : método ():
        ...
    fin.
    
    Coche.númeroMarchas : método entero ():
        devolver objeto.marcha.
    fin.
    ...
    
    miCoche : objeto = clonar Coche.
    tipo miCoche. <- Devuelve “objeto”
    tipo padre miCoche. <- Devuelve “objeto”
    micoche <- iniciar(5, ...). <- Le decimos al objeto que se inicialice en el primer estado
    miCoche <- acelerar.
    miCoche.marchas = 8.
    miCoche <- númeroMarchas. <- Devuelve “8”

Como se puede ver, con esto podemos representar elementos de la realidad fácilmente y de una forma estructurada. Hay lenguajes que permiten añadir un nivel de abstracción mayor al incluir lo que se llama modificadores de acceso, que permiten definir si los miembros del objeto (los métodos y los atributos) pueden ser accedidos fuera de la estructura o no. Pongamos un ejemplo: queremos representar un rectángulo, pero que nadie pueda conocer los atributos que tienen ni que tampoco se puedan cambiar.

clase Rectángulo:
    Indicamos que los atributos no se pueden ver fuera de la clase
    atributo privado base : entero.
    atributo privado altura : entero.

    Indicamos que los métodos se pueden ver fuera de la clase
    método público Iniciar (base: entero, altura : entero):
        objeto.base = base.
        objeto.altura = altura.
    fin.

    método público entero obtenerBase(): 
        devuelve objeto.base.
    fin.

    método público entero obtenerAltura(): 
        devuelve objeto.altura.
    fin.
fin.

miRectángulo : Rectángulo(10, 8).
miRectángulo <- obtenerBase. <- Devuelve “10”
miRectángulo <- obtenerAltura. <- Devuelve “8”
miRectángulo.base. <- Lanza un error porque no existe el atributo o es privado

Los modificadores de acceso dependen del lenguaje que se use, pero podemos destacar tres:

privado Solamente permite el acceso al miembro dentro de la misma clase, es decir, ni clases externas, ni clases derivadas ni el resto de código puedan leerlo o escribirlo en el caso de un atributo o ejecutarlo en el caso de un método. Es el más restrictivo.
protegido Permite que tanto la misma clase como las clases derivadas puedan acceder al miembro. El resto no puede ni leerlo, ni escribirlo, ni ejecutarlo.
público Permite que se puede acceder al miembro desde cualquier parte, pudiendo leerlo, escribirlo o ejecutarlo.

Volviendo atrás, hasta hace poco casi todos los lenguajes que tenían orientación a objetos usaban la estructura de clase, pero como se ha popularizado las aplicaciones web, y con ello el lenguaje JavaScript, últimamente se tiende a la estructura de prototipo.

Con esto último quiero hablaros de lo que es el desarrollo prototipado, que es algo que muchos confunden con la programación orientada a prototipos pero que no tiene nada que ver, y que nos va a servir mucho a la hora de crear videojuegos. Y es que el nexo de unión entre la programación orientada a prototipos y el desarrollo prototipado es que parten de la idea de ir creando un modelo ejemplo poco a poco añadiendo nuevas partes hasta obtener un modelo complejo final.

Resumiendo mucho, en el caso del desarrollo prototipado lo que se intenta hacer son prototipos del software pequeños pero funcionales, a los que se le van añadiendo poco a poco distintos elementos, pudiendo incluso hacerlos en paralelo. Nos faltaría explicar las etapas de evaluación de riesgos y pruebas, pero lo fundamental  es lo que vamos a aplicar en estos tutoriales, creando poco a poco nuestro juego con piezas que luego podremos unirlas.

Anuncios

Un pensamiento en “¿Qué es programar?: Prototipado y programación orientada a objetos

  1. Pingback: Aprende a programar un videojuego con LÖVE: desde lo básico a lo avanzado | El blog de NEKERAFA

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión /  Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión /  Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión /  Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión /  Cambiar )

Conectando a %s