jueves, 8 de octubre de 2009

Polymorphism for dummies


(aka: Polimorfismo pa los pasguatones)
No deja de sorprenderme las cosas que los reclutadores o head hunters les preguntan en entrevistas a candidatos para desarrolladores senior en Java o .NET.

Ya van varias veces que me toca reírme de experiencias de amigos que fueron cuestionados sobre cosas tan básicas como “Qué es herencia?”, “Permite C# herencia múltiple…y Java?”, “Una clase sealed se puede heredar?”… Todas estas cosas son preguntas que un candidato a ese puesto debería considerar sencillas y casi rayar en lo grosero.

Sin embargo hay varios amigos que los han agarrado en curva con la pregunta “Cómo defines tú el polimorfismo?” y siendo uno de los pilares de la OOP es elemental entenderlo. Sin embargo aunque muchos entienden como usarlo, la definición se torna complicada aún para los “expertos”.
He aquí pues una breve reseña del polimorfismo narrada en “mexicano” para los que les de flojera entender lo que encuentran en Google o que simplemente encuentran los textos y ejemplos muy aburridos y difíciles.

Así lo dijo Wikipedia
In computer science, polymorphism is a programming language feature that allows
values of different data types to be handled using a uniform interface. The
concept of parametric polymorphism applies to both data types and functions. A
function that can evaluate to or be applied to values of different types is
known as a polymorphic function. A data type that can appear to be of a
generalized type (e.g., a list with elements of arbitrary type) is designated
polymorphic data type like the generalized type from which such specializations
are made.

Parece muy largo para una definición…así que sigamos buscando algo más sencillo

Ven los pajaritos que están en la imagen de arriba (sin albur), bueno pues ahí está el ejemplo más claro de polimorfismo y que la naturaleza nos deja apreciar gratis. Es fácil darse cuenta que las tres aves son de la misma especie, sin embargo sus colores y plumaje varia un poco esto los hace diferentes unos de otros, eso es el polimorfismo.

Tenemos una clase base Humano que será abstracta, en nuestro ejemplo esto significa que todas aquellas acciones que puede hacer un humano pueden ser redefinidas por sus clases concretas, es decir los tipos de humanos que definamos, en el ejemplo serán 2 clases de humanos: Hombre y Mujer

Hay una publicidad de cerveza muy buena que usaré como ejemplo.

Este será nuestro método HaveSex


Este otro es el GoToBathroomWhileParty



Y por ultimo el HaveDrink




Esta es la definición de nuestra clase base.

using System;
using System.Collections.Generic;
using System.Text;

namespace Polymorphism
{
public abstract class Human
{
public abstract void HaveSex();
public abstract void GoToBathroomWhileParty();
public abstract void HaveDrink();
}
}


Hombres y mujeres hacemos las mismas cosas pero vean como lo hace un hombre


using System;
using System.Collections.Generic;
using System.Text;

namespace Polymorphism
{
class Man : Human
{
public override void HaveSex()
{
DrinkBeer();
GetGirl();
GetBed();
}

public override void GoToBathroomWhileParty()
{
DrinkBeer();
FindBathroom();
TakeALeak();
}



public override void HaveDrink()
{
JustGoGetIt();
}
}
}


…Y como lo hace una mujer


using System;
using System.Collections.Generic;
using System.Text;

namespace Polymorphism
{
class Women:Human
{
public override void HaveSex()
{
SexRating howGoodisHe;
FindADrink();
FindABoy();
howGoodisHe = FindBed();
switch (howGoodisHe)
{
case SexRating.Gentleman:
GetRomanticDate();
WaitRing();
GetMarried();
HaveAFamily();
break;
case SexRating.Heartbreaker:
HaveAnIceCream();
break;
case SexRating.JustSex:
WaitForCall();
FindItWasJustSex();
HaveAnIceCream();
break;
}
}

public override void GoToBathroomWhileParty()
{
Boolean isEnoughPaper = false;
FindADrink();
WaitsASit(new TimeSpan(0,10,0)); //Ten minutes!
TalkSillyThingWithFriend(new TimeSpan(0, 5, 0)); // Five minutes!
if (isEnoughPaper)
CleanYourSit();
else
DontEvenTouchTheSit();
WaitYourSillyFriend();

}

public override void HaveDrink()
{
Boolean HasBeenThreeHours= false;
while (!HasBeenThreeHours)
{
TryToGetDressed();
}
ChooseADrink();
}

enum SexRating
{
Gentleman,
Heartbreaker,
JustSex
}


}
}


Esto es un claro ejemplo de polimorfismo, ambos géneros hacemos lo mismo, pero vaya que hay “implementaciones” complicadas.

Dicho esto podemos decir del polimorfismo:

Es la capacidad de una clase concreta para renegar de la voluntad de su clase abstracta padre y hacer las cosas como se le pegue la gana.


Ya por último me atrevo a medio recomendar esto, un ejemplo grotesco…pero eficaz y cuando aprendes a programar a los 17, este tipo de ejemplos sin duda ayudan bastante.


Saludos!





3 comentarios:

Jaime Obed dijo...

Como diria el lic. raul de anda en su blog...

Rayenle chido!!!!!

*
**
***
****
*****

PRIMIS!!!!

- Que gusto hacer que tu blog parezca una basura mas de los metroflogs que se encuentra uno hoy en dia.

Saludos.
Atte. Jaime

Solfegieto dijo...

JAJAJAAJ. Excelente.

Estaba buscando algun ejemplo de codigo para la definicion larga que conocía yo y me tope con esto. Genial ejemplo.

Rulas dijo...

Que bueno que te haya servido y gustado =) Saludos