¿Por qué es útil la Programación Orientada a Objetos? ¡Con RPGs!

¿Quieres aprender cómo funciona la Programación Orientada a Objetos? ¿Nunca te han quedado claro los conceptos que la rodean? Aprendamos entonces cómo es la OOP como un RPG (en el lenguaje de programación C#).

Para empezar, hay dos conceptos que tenemos que asimilar.

  1. Duplicar el código es el MAL.
  2. El código siempre estará sujeto a cambios a lo largo del tiempo.

A menos que sea un pequeño programa que automatice una única tarea y sólo ejecutas una vez, vas a necesitar actualizar el código ya sea para arreglar bugs o añadir nuevas características. Una gran parte de escribir buen software es hacerlo de forma legible y fácilmente modificable.

Si haces copy/paste, vas a tener que cambiar el código en varias zonas del fichero. Esto resulta problemático. Si no realizas todos los cambios pertinentes o necesarios, fallarás en la tarea de arreglar código o implementar una nueva característica. Recuerda que duplicar el código es mala cosa. Por estos motivos el código duplicado sólo da dolores de cabeza y más bugs.

Las funciones hacen que evites el código duplicado, pues es invocado allá donde lo necesitas y si actualizas, está actualizado en todo el código. Igual que las funciones que facilitan el código, las técnicas de OOP lo organiza para facilitar los cambios. Porque el código siempre va a cambiar.

¡Coge tu arma!

Muchos tutoriales de este paradigma son terribles. Tienen las Clase “Coche” con el método “TocarClaxon” y otros ejemplos que no se relacionan con los programas actuales que los nuevos programadores nunca van a usar. Así que usaremos el estilo de videojuego RPG (como World of Warcraft o Dungeons&Dragons). Observa los datos de esta captura de Diablo:

Quitando los gráficos… los personajes, sus armaduras, y otros objetos no son más que un montón de enteros y de cadenas de texto almacenadas en variables. De un modo natural, podrías implementar estos elementos así:

Personaje:

Nombre: Abraxas

  • Fuerza: 13
  • Velocidad: 10

Habilidades:

  • Ataque con espada
  • Invocación animal

¿Cómo reproducirlo en un lenguaje de programación? Con una Clase, que es como si fuera una plantilla, para rellenar los datos que vas a necesitar. ¿Cómo? Puede representarse así:

class Personaje {

// Propiedades
Nombre;
Fuerza;
Velocidad;

// Habilidades
AtacarConEspada();
InvocarAnimal();
}

A partir de esta plantilla puedes crear tantos personajes necesites, dándoles un nombre, un valor de Fuerza y Velocidad… y podrá realizar acciones como atacar con su espada o invocar criaturas salvajes que le ayuden en la batalla.

Las Clases son las plantillas para nuevos tipos de datos en tu programa, nuevos conceptos, ideas que necesitan ser abstraídas para ser usadas en el código. La OOP provee de un nuevo modo para modelar armadura, monstruos, etc., mucho mejor que listas de cualquier tipo para reunir información sobre un determinado elemento.

En el ejemplo, tenemos las características de un personaje además de dos habilidades, en el que puedes atacar con la espada e invocar animales.

Las características reciben el nombre de Propiedades y Atributos, y las habilidades son nombradas como Métodos o Funciones. El conjunto de Propiedades y Métodos recibe el nombre de miembros, miembros de una Clase.

Instancias

Vamos a crear entonces a un personaje, nuestro personaje, para empezar a jugar. Esto es crear un objeto o crear una instancia, instanciar un Personaje.

Personaje personajePrincipal = new Personaje();

Ahora tenemos nuestro Personaje, que recibe el nombre de variable personajePrincipal. Este personaje ahora podrá atacar…

personajePrincipal.Atacar();

… invocar a fieras…

personajePrincipal.InvocacionAnimal(10);

… e incluso ser renombrado:

personajePrincipal.Nombre = “Balem”;

Herencia

Imagina que tienes la Clase Criatura, para representar cualquier ser en tu nuevo mundo de fantasía.

Una vez con esa Clase, piensas en lo genial que sería crear un Dragón (porque crear dragones mola), pero los dragones tienen muchas cosas de las que puede proveer la Clase Criatura. Así que vamos a crear otra Clase llamada Dragón que tiene Propiedades como velocidadVuelo o tipoAliento (que puede ser: “fuego”, “escarcha”, “rayos”, “gas venenoso”, etc).

Pero los Dragones también van a necesitar salud, puntosMagia, inventario, y otras muchas cosas que están en la Clase Criatura. Así que podemos crear la nueva Clase Dragon, hacer copy/paste del Clase Criatura… ¿QUÉ HACEMOS COPIANDO CÓDIGO?

En lugar de tal cosa, convierte a Dragon en una subClase de Criatura, que herede de Criatura. ¿Cómo? Con una sencilla línea:

class Dragon : Criatura {
... Propiedades y Métodos aquí ...
}

Este código es lo mismo que decir “un Dragón es lo mismo que una Criatura, pero con algunos métodos y propiedades adicionales”.

Cuando creas un Objeto Dragón, contará automáticamente con todos los métodos y propiedades de Criatura (Y SIN DUPLICAR CÓDIGO) con sus propios métodos y propiedades. Útil, ¿verdad? Y hay más: cualquier fragmento de código que trate con la Clase Criatura, pueden también afectar a los Objetos Dragon, porque ha heredado sus miembros. Si puedes usar un Objeto de la Clase Criatura, puedes usar un Objeto de la Clase Dragon, porque la segunda hereda de Criatura. Este principio es llamado polimorfismo, en el que profundizaremos en el futuro.

Usar la herencia requiere de conocer bien el problema, saber qué datos pertenecen a cada Clase (entre la que hereda y la que cede su herencia) para evitar errores a medida que programamos.

Miembros estáticos

Los miembros estáticos son aquellos que no requieren de instancia, de un Objeto, para ser invocados. No necesitas crear un nuevo dragón para invocar a un método estático, solo necesitas el nombre de la Clase para ello. Por ejemplo, como algo general, queremos saber qué hacen los dragones y por qué molan tanto:

Dragon.Descripcion();

Esta línea de código te devuelve esa información de los dragones, y estamos usando el nombre de la Clase en sí, no una instancia del dragón, no un dragón en concreto.

Los miembros estáticos son poco recomendados en la programación moderna, pero no están prohibidos. No dejes como miembro estático lo que puedas escribir como un miembro de instancia.

Para finalizar…

Este post es una obra derivada del original “Why is Object-Oriented Programming Useful? (With a Role Playing Game Example)” por Al Sweigart en su blog InventWithPython.

Queda mucho por aprender y mucho código que desarrollar a partir de ahora, una emocionante aventura con la Programación Orientada a Objetos como tu fiel compañera. Happy programming!

seeU!

Anuncios

One thought on “¿Por qué es útil la Programación Orientada a Objetos? ¡Con RPGs!

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 )

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 )

Google+ photo

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

Conectando a %s