Páginas

lunes, 1 de septiembre de 2014

Patrón de Diseño: Template Method. Ejemplo de valoración de un jugador de futbol


Patrón de Diseño: Template 

Ejemplo de 

valoración de un jugador de futbol



"El patrón de diseño Template Method forma parte de la familia de patrones denominados de comportamiento. Este tipo patrones ayudan a resolver problemas de interacción entre clases y objetos.

Este patrón nace de la necesidad de extender determinados comportamientos dentro de un mismo algoritmo por parte de diferentes entidades. Es decir, diferentes entidades tienen un comportamiento similar pero que difiere en determinados aspectos puntuales en función de la entidad concreta.


Una posible solución podría ser copiar el algoritmo en cada de las diferentes entidades cambiando la parte concreta en la que difieren. Esta solución tiene una consecuencia negativa ya que se genera código duplicado.


La solución que propone el patrón Template Method es abstraer todo el comportamiento que comparten las entidades en una clase (abstracta) de la que, posteriormente, extenderán dichas entidades. Esta superclase definirá un método que contendrá el esqueleto de ese algoritmo común (método plantilla o template method) y delegará determinada responsabilidad en las clases hijas, mediante uno o varios métodos abstractos que deberán implementar." (1)

Básicamente consiste en definir una clase "padre" que contengas todos los métodos con sus algoritmos correspondientes, y luego crear clases "heredadas de esta" donde modifiquemos algún método de la clase "padre", para especificar un comportamiento diferente de la nueva clase.


Ejemplo:
(Nota: Ejemplo en el realizado por Miguel Arlandy Rodríguez, pero convertido a Gambas3)
Imaginemos que tenemos que desarrollar un pequeño programa que nos de una valoración de los jugadores de un equipo de fútbol en función de ciertos parámetros. Supongamos que el equipo está compuesto por porteros y delanteros (los defensas y centrocampistas nos los saltaremos...). El programa deberá comportarse de la siguiente manera:

  • Para cada jugador devolverá una valoración: malísimo, malo, normal, bueno o galáctico.
  • Todo jugador que haya disputado menos del 20% de los minutos que disputó su equipo será considerado malísimo.
  • Los jugadores suman puntos positivos si alcanzan unos objetivos.
  • El objetivo de los delanteros es marcar goles, sumarán 30 puntos por cada gol por partido que promedien. Ejemplo: si un jugador marca de media 0,8 goles por partido sumará 24 puntos.
  • El objetivo de los porteros es no recibir goles, perderán 30 puntos por cada gol por partido que promedien, pero partirán con 50 puntos. Ejemplo si un portero encaja 1,1 gol por partido sumará 17 puntos (50 - 30*1,1), si recibiese 0,5 goles por partido sumaría 35 puntos (50 - 30*0,5).
  • A los jugadores que más cobren se les exigirá más, por lo que los jugadores perderán puntos en función de su salario. Imaginemos que el salario de los jugadores oscila del 1 al 15.
  • Los delanteros perderán el 10% de su salario en puntos. Ejemplo: si un delantero cobra 12 perderá 1,2 puntos.
  • Los porteros perderán el 8% de su salario en puntos. Ejemplo: si un portero cobra 12 perderá 0,96 puntos.
  • Los jugadores que obtengan menos de 0 puntos serán considerados malísimos.
  • Los jugadores que obtengan entre 0 y 10 puntos serán considerados malos.
  • Los jugadores que obtengan entre 10 y 20 puntos serán considerados normales.
  • Los jugadores que obtengan entre 20 y 40 puntos serán considerados buenos
  • Los jugadores que obtengan más de 40 puntos serán considerados galácticos.

Empezamos con definir una clase para manejar los intervalos:
->

A partir de esta clase generica, vamos a definir una clase heredada donde especificamos los valores de los intervalos:



El método Plantilla ( Template Method)
Antes de nada definiremos nuestra superclase Jugador, que contendrá todo el comportamiento y elementos comunes de cualquier tipo de jugador (ya sean delanteros o porteros).
Observemos las principales características de la clase:
  • La clase es abstracta, por lo que un jugador por sí solo no es nada. Habrá que precisar si es delantero o portero.
  • Contiene las propiedades comunes de cualquier jugador: nombre, minutos jugados y salario.
  • Contiene una clase ValoracionJugador que nos ayudará a definir los intervalos y la clasificacion del jugador dado
  • Contiene el método plantilla calculaValoracion que define el esqueleto de la lógica de cálculo de valoración de un jugador, implementando las partes comunes y delegando las clases concretas en las subclases.
  • Contiene los métodos abstractos: calculaPuntosPorObjetivos y getPuntosPenalizacionPorSalarioAlto que deben ser implementados por las subclases (en función de si es delantero o portero). Obsérvese que el método plantilla (método calculaValoracion) hace uso de ellos.
Las Subclases:
LLegó el momento de definir los comportamientos concretos o, lo que es lo mismo, de extender de la clase Jugador. En este punto implementaremos la forma de calcular los puntos por objetivos y los puntos de penalización por salario alto, tanto para delanteros como para porteros.

La clase Delantero quedaría de la siguiente forma:

La clase Portero quedaria:
Probando el método plantilla.
En el método Form_Show, se genera una salida como en el ejemplo original. Además se ha incluido un formulario para trabajar dinamicamente con el programa y que nos vaya dando los resultados.


Resultados del programa.


Enlace de descarga del ejemplo: enlace box

Enlace de Referencia:
(1) http://www.adictosaltrabajo.com/tutoriales/tutoriales.php?pagina=PatronTemplateMethod

No hay comentarios:

Publicar un comentario