Práctica de Clases en Programación: "La Aldea" — Implementación en Unity

Introducción

Este artícu­lo fun­cionará como la parte prác­ti­ca del artícu­lo ante­ri­or sobre Clases en Pro­gra­mación. Vamos a resolver un ejer­ci­cio sobre estruc­tura de clases y a imple­men­tar­lo en C# en Unity.

Si no sabés qué es una clase en pro­gra­mación estaría bueno que veas el artícu­lo que escribí sobre el tema antes de continuar.

Ir a la parte teórica de este artículo

🟢 El sig­nifi­ca­do de "CLASE" en POO

VÍDEOS DEL CANAL CON MÁS BÚSQUEDAS

DE UNITY

DE BLENDER

Planteo del ejercicio

Vamos a ver un ejem­p­lo que se me ocur­rió al momen­to de escribir este artícu­lo. Se tra­ta de mod­e­lar el com­por­tamien­to de una aldea que tiene habi­tantes y estos habi­tantes pueden ser aldeanos que tra­ba­jan o guer­reros que luchan.

He resalta­do lo que con­sidero pal­abras claves en el planteo del prob­le­ma, en prin­ci­pio parece que al menos vamos a nece­si­tar dos clases para resolver­lo, una para la aldea y otra para los habi­tantes, pero vamos a con­sid­er­ar el hecho de que tan­to aldeanos como guer­reros en sí son habitantes.

Aldeanos y Guer­reros ten­drán car­ac­terís­ti­cas y com­por­tamien­tos comunes que estarán definidos en la clase Habi­tante y luego las clases Aldeano y Guer­rero heredarán las car­ac­terís­ti­cas y com­por­tamien­tos de Habitante.

Una aldea tiene habi­tantes por lo que la clase Aldea ten­drá entre sus datos una o más instan­cias de la clase Habitante. 

Quisiera men­cionar que el hecho de cono­cer la difer­en­cia entre clases e instan­cia de clases es impor­tante muy impor­tante, pero este artícu­lo no tra­ta sobre eso así como tam­poco tra­ta sobre herencia. 

De momen­to la idea es que vamos a usar la clase Habi­tante para a crear todos los obje­tos Habi­tante que nece­site­mos, estos obje­tos ten­drán sus pro­pios val­ores (por ejem­p­lo nom­bres o edad dis­tin­tas) pero en sí respetarán la estruc­tura defini­da en la clase.

Diagrama de Clases

Entonces diji­mos que vamos a usar cua­tro clases, Aldea, Habi­tante, Aldeano y Guer­rero. La clase Aldea tiene entre sus datos una o más instan­cias de la clase Habi­tante. Aldeano y Guer­rero son un tipo especí­fi­co de Habi­tante por lo que se usará herencia.

El dia­gra­ma de clases de la figu­ra 1 está basa­do en el pár­rafo anterior.

diagrama de clases simple para ejemplificar las relaciones entre las clases
Fig. 1: Ejem­p­lo de lo que podría ser un dia­gra­ma de clases en un proyecto

En el dia­gra­ma obser­va­mos un "1..*" enci­ma de Habi­tante, esto quiere decir que Aldea ten­drá uno o más obje­tos Habitante.

Además obser­va­mos que la heren­cia de clases se rep­re­sen­ta con una flecha ascen­dente hacia la clase padre. 

Diagrama de Objetos

Una vez defini­da las clases que estarán pre­sentes pen­samos en sus posi­bles cam­pos y méto­dos, en esta parte está bueno reflex­ionar sobre la nat­u­raleza del obje­to que quer­e­mos mod­e­lar, cuáles son sus car­ac­terís­ti­cas, qué infor­ma­ción mane­ja y cuál puede ser su comportamiento.

Voy a inven­tar algunos cam­pos y méto­dos para las clases porque esta prác­ti­ca de clases de pro­gra­mación se tra­ta más que nada sobre el planteo de estruc­tura de clases y su pos­te­ri­or imple­mentación en Uni­ty en lengua­je C#, pero sin entrar en detalles de qué se va a hac­er con esto.

Video: ¿qué es un méto­do en programación?

En la figu­ra 2 se ven los dia­gra­mas de obje­to de las cua­tro clases. 

ejemplo simple de diagrama de clases uml
Fig. 2: Uti­lizan­do estas cajas indicamos los atrib­u­tos y méto­dos, públi­cos y pri­va­dos de las clases.

Aho­ra voy a pasar a explicar en detalle cómo se inter­pre­tan las cajas de la figu­ra 2.

El objeto Aldea

Para este obje­to con­sid­eré que toda aldea tiene un nom­bre y un grupo de habi­tantes, así que para sus cam­pos voy a usar una colec­ción de obje­tos Habi­tante lla­ma­da "habi­tantes", un string lla­ma­do "nom­bre" y un entero lla­ma­do "pobla­cion". Estos cam­pos los colo­co en la parte de arri­ba de la caja como vemos en la figu­ra 2.1.

Algunos méto­dos del obje­to Aldea pueden ser "Nuevo­Hab­i­tante" que se eje­cu­tará cada vez que naz­ca un habi­tante. "Obten­er­Nom­bre" y "Obten­er­Pobla­cion" que nos devolverán los datos cor­re­spon­di­entes (se cono­cen como "Get­ters" y son útiles por ejem­p­lo para hac­er estadís­ti­cas de todas las aldeas que podamos tener). 

El méto­do "Muere­Habi­tante" se puede encar­gar de mod­i­ficar la población y elim­i­nar el habi­tante muer­to de la colec­ción de habitantes. 

ejemplo de diagrama de objetos para una clase llamada aldea, se muestran campos y metodos de la clase
Fig. 2.1: Dia­gra­ma de obje­tos para la clase Aldea, en él vemos los cam­pos y méto­dos de la clase.

Por últi­mo el méto­do "Ali­men­ta­rHabi­tantes" que puede recor­rer la colec­ción de habi­tantes eje­cu­tan­do méto­dos apropi­a­dos en cada uno de ellos, o chequear la reser­va de comi­da y restar tan­tas unidades como población haya.

El objeto Habitante

Habi­tante va a ser la clase padre (o super­clase) de Aldeano y Guer­rero, en esta clase estará definido el com­por­tamien­to y los datos que ten­gan en común Aldeanos y Guerreros.

Todo habi­tante tiene un nom­bre rep­re­sen­ta­do por un String, un entero para la edad, otro para la salud y otro para la defensa.

ejemplo de diagrama de objetos para una clase llamada habitante, se muestran campos y metodos de la clase
Fig. 2.2: Dia­gra­ma de obje­tos para la clase Habi­tante, en él vemos los cam­pos y méto­dos de la clase.

Entre los méto­dos de Habi­tante ten­emos los "Get­ters" para obten­er nom­bre y edad, un méto­do pri­va­do para enve­je­cer y un meto­do públi­co para que el habi­tante se mue­va a una posición.

El objeto Aldeano

El obje­to Aldeano es un caso más especí­fi­co de la clase Habi­tante, entre sus cam­pos ten­emos un string que indi­ca el nom­bre del tra­ba­jo y una vari­able booleana para saber si se encuen­tra tra­ba­jan­do o no.

Los méto­dos de Aldeano están rela­ciona­dos a lo que podrían ser sus activi­dades, por ejem­p­lo Recolec­tar, Reparar, Talar, Pescar y tam­bién un méto­do pri­va­do para que entregue los recur­sos que haya con­segui­do. Este últi­mo méto­do lo puede eje­cu­tar inter­na­mente Aldeano por ejem­p­lo cuan­do esté al límite de su capaci­dad de recolección.

ejemplo de diagrama de objetos para una clase llamada aldeano, se muestran campos y metodos de la clase
Fig. 2.3: Dia­gra­ma de obje­tos para la clase Aldeano, en él vemos los cam­pos y méto­dos de la clase.



El objeto Guerrero

La clase Guer­rero es un caso más especí­fi­co de la clase Habitante.

Un Guer­rero puede estar ata­can­do o no para lo que usamos la vari­able booleana "ata­cana­do", tiene asig­na­da un arma rep­re­sen­ta­da por un String y tiene cier­tos pun­tos de ataque rep­re­sen­ta­dos por una vari­able entera.

Entre sus méto­dos ten­emos Atacar, For­ma­cion, Defend­er­se y un méto­do pri­va­do para entre­gar el botin que obtu­vo después de salir exi­toso de una batalla. 

ejemplo de diagrama de objetos para una clase llamada guerrero, se muestran campos y metodos de la clase
Fig. 2.4: Dia­gra­ma de obje­tos para la clase Guer­rero, en él vemos los cam­pos y méto­dos de la clase.

Implementación en Unity

Aho­ra pasamos a la parte bue­na, vamos a tomar el dia­gra­ma de clases y el dia­gra­ma de obje­tos de las fig­uras 1 y 2 y uti­lizar­los como ref­er­en­cia para crear las clases en Unity.

Antes de empezar tal vez nece­sitás saber cómo usar Uni­ty, acá en la pági­na ten­go un par de series, una lla­ma­da "Fun­da­men­tos de Uni­ty" y la otra "Juego del Laber­in­to", la primera tiene temas especí­fi­cos y la segun­da es un mini proyec­to. Podés encon­trar todos los artícu­los usan­do el menú de nave­gación y tam­bién están los videos en el canal.

Sig­amos, en un proyec­to de Uni­ty creamos las cua­tro clases del dia­gra­ma de la figu­ra 1. 

scripts c sharp para implementar un diagrama de clases simple
Fig. 3: Creamos los Scripts C# nece­sar­ios acorde al dia­gra­ma de clases de la figu­ra 8.

Por con­ven­ción los nom­bres de las clases comien­zan con mayús­cu­la y se uti­liza Camel­Case si el nom­bre de la clase tiene más de una pal­abra. Por ejem­p­lo la clase "Arma de Largo Alcance" podría escribirse "ArmaLargoAl­cance", mejor aún si nos acos­tum­bramos a usar nom­bre en inglés "Lon­gRangeWeapon".

Una aclaración, como se vio en el artícu­lo: "¿Qué es una Clase en Pro­gra­mación?", al crear una nue­va clase en Uni­ty, esta va a heredar de MonoBe­hav­iour, lo que per­mi­tirá que Uni­ty la con­sidere en su ciclo inter­no. Vamos a dejar esta heren­cia así como está, aunque no lo hayamos explic­i­ta­do en el dia­gra­ma de clases de la figu­ra 1. 

Si quisiéramos hac­er un dia­gra­ma más acer­ta­do deberíamos colo­car la clase MonoBe­hav­iour y hac­er que tan­to Aldea como Habi­tante here­den de ella. 

Como aclaración está bueno decir que nues­tras clases van a ser MonoBe­hav­iours, sin embar­go no tiene sen­ti­do plantear un dia­gra­ma de clases extremada­mente com­ple­to ya que MonoBe­hav­iour here­da de la clase Behav­iour, que a su vez here­da de la clase Com­po­nent, quien final­mente here­da de la clase Object. No es nece­sario ir tan lejos, hay que enfo­carnos en lo impor­tante para resolver nue­stro problema.

La clase Aldea

Para escribir el cógi­do cor­re­spon­di­ente en la clase Aldea debe­mos mirar el dia­gra­ma de Obje­to de Aldea y sim­ple­mente cono­cer la sin­taxis del lengua­je ori­en­ta­do a obje­tos que vamos a uti­lizar, en este caso C#.

En la figu­ra 4 vemos cómo se imple­men­tac lo especi­fi­ca­do en el dia­gra­ma de la figu­ra 3.1 uti­lizan­do lengua­je C# en Unity.

Noten cómo se respetan los nom­bres, los tipos de datos y la vis­i­bil­i­dad indi­ca­da en el dia­gra­ma de objetos. 

ejemplo de diagrama de objetos para una clase llamada aldea, se muestran campos y metodos de la clase
Fig. 3.1: Dia­gra­ma de obje­tos para la clase Aldea, en él vemos los cam­pos y méto­dos de la clase.

implementacion practica de clase de programacion en c sharp acorde a diagrama uml, unity
Fig. 4: Defin­i­mos los atrib­u­tos y méto­dos nece­sar­ios, tenien­do en cuen­ta las cajas de la figu­ra 9.

Esta es la idea de la prác­ti­ca de Clases en pro­gra­mación, crear clases en Uni­ty basán­donos en un análi­sis del prob­le­ma y los dia­gra­mas de clases y objetos. 

No vamos a escribir nada en los méto­dos porque es algo que depende de cuál es la final­i­dad de la solu­ción que esta­mos planteando.



La clase Habitante

ejemplo de diagrama de objetos para una clase llamada Habitante, se muestran campos y metodos de la clase
Fig. 2.1: Dia­gra­ma de obje­tos para la clase Habi­tante, en él vemos los cam­pos y méto­dos de la clase.

implementacion practica de clase de programacion en c sharp acorde a diagrama uml, unity
Fig. 5: Defin­i­mos los atrib­u­tos y méto­dos nece­sar­ios, tenien­do en cuen­ta las cajas de la figu­ra 9.

La clase Aldeano

ejemplo de diagrama de objetos para una clase llamada aldeano, se muestran campos y metodos de la clase
Fig. 2.1: Dia­gra­ma de obje­tos para la clase Aldeano, en él vemos los cam­pos y méto­dos de la clase.

implementacion practica de clase de programacion en c sharp acorde a diagrama uml, unity
Fig. 6: Defin­i­mos los atrib­u­tos y méto­dos nece­sar­ios, tenien­do en cuen­ta las cajas de la figu­ra 9.

La clase Guerrero

ejemplo de diagrama de objetos para una clase llamada guerrero, se muestran campos y metodos de la clase
Fig. 2.1: Dia­gra­ma de obje­tos para la clase Guer­rero, en él vemos los cam­pos y méto­dos de la clase.

implementacion de clase en c sharp acorde a diagrama uml, unity
Fig. 7: Defin­i­mos los atrib­u­tos y méto­dos nece­sar­ios, tenien­do en cuen­ta las cajas de la figu­ra 9.

Conclusión

En esta prác­ti­ca de Clases en Pro­gra­mación hemos vis­to cómo a par­tir del planteo de un prob­le­ma pro­ponemos una estruc­tura de clases para mod­e­lar el com­por­tamien­to de los elementos. 

La estruc­tura de clases la rep­re­sen­ta­mos uti­lizan­do un Dia­gra­ma de Clases en el que mostramos cuál es la relación que existe entre ellas.

Las Clases ten­drán sus miem­bros, es decir Cam­pos y Méto­dos, podemos rep­re­sen­tar­los uti­lizan­do Dia­gra­mas de Obje­tos, en los que mostramos nom­bres y tipos de datos para los Cam­pos y los méto­dos que ten­drá la clase. Además la vis­i­bil­i­dad de cada uno.

Todo lo ante­ri­or es inde­pen­di­ente del lengua­je de pro­gra­mación, se tra­ta sobre mod­e­lar de man­era intu­iti­va una solu­ción ori­en­ta­da a objetos. 

Para imple­men­tar­lo en Uni­ty en lengua­je C# deber­e­mos cono­cer la sin­taxis propia del lengua­je, sin embar­go es suma­mente intere­sante saber que esto mis­mo se podría reuti­lizar por ejem­p­lo para una apli­cación Android uti­lizan­do lengua­je Java en Android Studio.

Deja un comentario

Tu dirección de correo electrónico no será publicada.

Scroll al inicio
Secured By miniOrange