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!





domingo, 26 de julio de 2009

Ya sabía yo que un día iba a pasar….

usb

Hace unos días estaba cenando con algunos familiares, hay un pequeño primo (como 7 u 8 años) y me empezó a preguntar cosas,bastante despierto el engendro…

Y a estos niños ya les interesa saber de tecnología desde pequeños (tienen wii, psp, laptop, facebook, messenger, twitter, etc etc) por lo tanto alguna vez le estuve explicando como hacer textos en Word, ya saben sólo lo básico.

Y pues una de las lecciones que le di fue el cortar y pegar (nadie puede sobrevivir sin eso en la actualidad). El niño entendió rápido que el icono de la tijeras era cortar y que el que estaba a un lado era pegar (aunque no esta tan claro que imagen es).

Y cuando le dije como guardar me dijo…

Oye y ese cuadrito de guardar, ¿qué es?

En ese momento comprendí que acababa de suceder lo que tanto temí…había envejecido =(

Y es que le tuve que explicar…

Antes las computadoras tenían unos disquitos así como de plástico, donde podías guardar tus trabajos, les decían discos de 3 y media

El niño me observo, pensó unos segundos y me dijo…

Ahhh, es como una memoria USB??

Y yo… ¬¬

Ándale igual, sólo que no le cabía tanto, ni siquiera una canción

Y me dice el muy maldito…

Ah ps que chafa, yo en mi Ipod traigo como 1000

Y pues sí, yo a su edad tenía un walkman…de cassetes.

Moraleja: Desarrolladores, pongan una USB en sus barras de comandos y botones de “Guardar” sino, las nuevas generaciones no entenderán que demonios es el cuadrito ese…

Saludos

viernes, 19 de junio de 2009

¿Qué hará usted este 5 de julio?

Estimados 5 lectores, ya antes, con muchos meses de antelación había yo comentado de lo que se avecinaba el 5 de julio.

Sin embargo ahora la cosa se pone más tensa, y la verdad es una elección sosa, sin personas reales solo rostros por ahí y por allá, en el fondo impera el vacío y la censura.

Nos pregunta Jesús Silva Herzog Márquez

¿Cuál es el lema más ofensivo de esta campaña?

  • "Elige creer." PRI
  • "Yo voy a votar por mantener la estabilidad." PAN
  • "Porque nos importa tu vida, pena de muerte." Partido "Verde."

Y la verdad nos la pone muy difícil. Este tipo de propaganda hueca sólo alimenta la desolación que nos azota como mexicanos, entre la influenza, la crisis, guarderías quemadas y demás señales inequívocas del fin del mundo; nuestros líderes no representan ni ínfimamente una luz al final del túnel.

Es triste de verdad, que en este país sólo se interesan en la política los analistas (a los que los jóvenes consideran “viejillos aburridos”), los políticos y demás sabuesos buscadores de hueso, y una mínima parte de la población que se preocupa por el futuro del país y que está totalmente desprovista de herramientas para manifestarse.

No nos vengan con la jodedera de que el voto es tu voz!! en las circunstancias actuales y con nuestras lustrosas opciones, no hay a quién elegir, es la realidad, tenemos el valor contundente de sólo un voto más para sus clientelismos.

Es por esto que aunque no me convence del todo el voto nulo, me sumo a ésta, al menos significa algo, una purga de los demónios internos, me gustaría defecar sobre la boleta y meterla así a la urna, al menos sería algo divertido para subir a YouTube. 

Súmese pues amable lector a la iniciativa del buen Ademyr, y exprésese!!

Ahora que sí usted es un ferviente fan de la partidocracia aquí le dejo estas tentadoras ofertas, directamente traídas del HECF

diputable_1

Como si fuese buffet…insisto, al menos me vomitaré en la boleta, finalmente la inspiración para el vómito es basta.

Saludos

jueves, 18 de junio de 2009

Natal Project

En estas semanas pasadas mucho se habló sobre el E3 y sus impactos en la vida de millones de gamers alrededor del mundo, ahora veo con gusto y un poco de sarcasmo como mucha gente escribe en blogs y comenta en tertulias geek acerca del fabuloso Natal Project como si se tratará del cutting edge del 2009.

Y no es para menos, la verdad es impresionante ver los videos con los que lo promocionan, y aunque el tiempo ya no me permite ser tan intenso en el mundo de los videojuegos, a mi no me pareció taaaaaaan novedoso como a la mayoría de la audiencia. Mas sabe el diablo por viejo que por diablo…

Yo ya había hablado de esto en otra entrega de este su noble blog, hace más de un año, y ahora veo con gusto como Microsoft lo ha implementado de manera brillante, lo que resultara en una nueva guerra de consolas, la única guerra que se revive con más ardor cada 5 años…aquí les dejo el video del Natal Project.

Y recuerde…la verdadera novedad la vio usté primero por estos lares.

Saludos

jueves, 23 de abril de 2009

Google Chart (Para reportear gratis n_n)

Hace tiempo un amigo me mostró una monería más de Google, se trata de Google Charts, el cual es un servicio que provee gráficas (tipo excel) usando un API muy sencilla.

Lo único que hay que hacer es meter en el navegador una url de este tipo.

http://chart.apis.google.com/chart?cht=p3&chd=t:60,40&chs=500x200&chl=Hello|World

En este ejemplo los parámetros son los siguientes

cht (chart type) = p3 >> Con esto le indicamos el tipo de gráfico que queremos usar (Círcular, barras, etc), en este paso es un pie 3D.

chd (chart data) = 60, 40 >> Aquí especificamos los datos que queremos graficar, separados por una coma.

chs(chart size) = 500x200 >> Ancho y largo del gráfico que se genera.

chl(chart labels) = Hello|World >> Son los labels correspondientes a los datos separados aquí por un pipe (|), en este ejemplo Hello = 60, World = 40.

Así de fácil, la documentación completa la pueden encontrar en la liga que puse antes.

Este tipo de gráficas pueden ser muy útiles para crear algunos pequeños reportes muy decentes sin incurrir en costos extras por licenciamiento de alguna herramienta de reporteo.

Adicional a esta API me encuentro con un wrapper para C# que hace las cosas más sencillas aún.

Aquí un pequeño ejemplo de como usarlo.

if (pieRadioButton.Checked == true)

{

    PieChart pieChart = new PieChart  (500,200,PieChartType.ThreeD);

    pieChart.SetTitle("Pie Chart");

    pieChart.SetData(new float[] { float.Parse(valueOneTextBox.Text), float.Parse(valueTwoTextBox.Text) });

    pieChart.SetPieChartLabels(new string[]{labelOneTextBox.Text,labelTwoTextBox.Text});               

    url = pieChart.GetUrl();

}

else

{

   BarChart barChart = new BarChart(500, 200, BarChartOrientation.Horizontal, BarChartStyle.Grouped);

    barChart.SetTitle("Bar Chart");

    barChart.SetData(new float[] { float.Parse(valueOneTextBox.Text), float.Parse(valueTwoTextBox.Text) });

   url = barChart.GetUrl();

}

En este ejemplo se usa hardcode para definir el tamaño de las gráficas así como los títulos pero estos parámetros también son personalizables, esta es la interfaz de creación de los gráficos que use, con sólo dos valores como muestra.

image

image

Y por si todo esto fuera poco, esta misma API permite crear mapas dinámicos así como los llamado Googlometros, pero de estos dos les comentaré en próximas entregas.

Espero les sirva. Saludos