Don’t call us, we’ll call you

No nos llame, nosotros le llamaremos. También conocido como el principio de Hollywood. ¿De qué narices estoy hablando? Es obvio, de uno de los principios de la programación orientada a objetos.

En un sistema se suelen tener diferentes niveles de abstracción, diferentes capas o diferentes subsistemas unos por encima de otros; según el contexto se usaría un termino u otro. Este principio básico nos dice que los niveles superiores (el jefe en Hollywood) llamarán a los de abajo (los actores piltrafilla), pero no en el sentido contrario. No nos llame, nosotros le llamaremos.

Este principio aunque pueda parecer simple es mucho menos obvio de lo que se cree. Un simple hola mundo o derivados ya lo viola, pues un hilo de ejecución se hace cargo del flujo del programa, ahí estamos violando el principio, pues estamos dando la vara llamando a todo Hollywood para que nos dejen actuar. Los ejemplos más claros donde se puede ver cómo se aplica este principio son en los conocidos patrones de diseño Observer, Factory Method, Strategy, y sobretodo, el más evidente, el patrón Template Method. Explicaré brevemente con un ejemplo práctico este último para poder visualizar en él el principio de Hollywood.

El patrón template method define la estructura de un algoritmo dejando a las subclases definir ciertas partes o pasos del mismo. Por ejemplo, defino la clase abstracta Trabajador


abstract class Trabajador
{
private
{
string trabajador;
int jornada;
int horasTrabajadas;
}

this(string trabajador)
{
this.trabajador = trabajador;
jornada = 6;
horasTrabajadas = 0;
}

void trabajar()
{
llegaAltrabajo();
while(!finDeJornada())
if(necesitaDescansar())
descansar();
else
trabajarUnRato();
irseDelTrabajo();
}

void descansar()
{
writefln("DescansoooOoOO");
}

void llegaAltrabajo()
{
writefln("Soy un gran ", trabajador, " y llego a mi trabajo");
}

void irseDelTrabajo()
{
writefln("Soy un gran ", trabajador, " y me piro del trabajo");
}

bool finDeJornada()
{
horasTrabajadas++;
return horasTrabajadas == jornada;
}

abstract void trabajarUnRato();
abstract bool necesitaDescansar();
}

Ahí hemos definido el algoritmo de un trabajador, hay que fijarse del par de métodos abstractos declarados. Éstos deberán de ser implementados por las clases que hereden de trabajador. Veamos un par, primero un funcionario, y luego un programador:


class Funcionario : Trabajador
{
this()
{
super("Funcionario");
}

void trabajarUnRato()
{
writefln("con el pim pam pum, bocadillo de atún");
}

bool necesitaDescansar()
{
return horasTrabajadas > 1;
}
}


class Programador : Trabajador
{
bool descansoCafe = false;

this()
{
super("Programador");
}

void trabajarUnRato()
{
writefln("void trabajarUnRato(){ writefln(\"void trabaja, oh wait!");
}

bool necesitaDescansar()
{
if(!descansoCafe)
{
if((rand() % 8 ) == 0)
descansoCafe = true;
return descansoCafe;
}
return false;
}
}

Estas dos clases están definiendo parte del comportamiento del trabajador, pero en ambas el algoritmo y la estructura sigue siendo la misma. Veamos un uso de estos dos trabajadores:


void main(String [] args)
{
auto funcionario = new Funcionario();
auto programador = new Programador();
funcionario.trabajar();
programador.trabajar();
}

Soy un gran Funcionario y llego a mi trabajo
con el pim pam pum, bocadillo de atún
DescansoooOoOO
DescansoooOoOO
DescansoooOoOO
DescansoooOoOO
Soy un gran Funcionario y me piro del trabajo
Soy un gran Programador y llego a mi trabajo
void trabajarUnRato(){ writefln(“void trabaja, oh wait!
void trabajarUnRato(){ writefln(“void trabaja, oh wait!
void trabajarUnRato(){ writefln(“void trabaja, oh wait!
void trabajarUnRato(){ writefln(“void trabaja, oh wait!
void trabajarUnRato(){ writefln(“void trabaja, oh wait!
Soy un gran Programador y me piro del trabajo

En definitiva, la clase abstracta actúa como el director de Hollywood, y las subclases están actuando como actores que buscan un papel. No nos llame, nosotros le llamaremos. Las subclases implementan unos métodos que serán usados por la superclase en la estructura del algoritmo ya definido. En definitiva, el principio de Hollywood nos guía para establecer la toma de decisiones en los niveles de abstracción superiores, los cuales pueden decidir cómo y cuando llamar métodos de módulos de más bajo nivel.

Por cierto, el lenguaje usado en los ejemplos es D, curioso cuanto menos.

4 Thoughts on “Don’t call us, we’ll call you

  1. Acabo de descubrir que he usado éste patrón de disenio sin conocerlo.
    Por cierto, qué tal D? Tiene soporte y merece la pena?

  2. @Dorian, no es patrón de diseño, es un principio de la POO, si programas OO bien, lo usas, no falla. Básicamente lo leí por ahí y como me hizo gracia el nombre pos ele, escribamos algo.

    D está mejor de lo que creía. Yo pensaba que sería un lenguaje raro y tal, pero es básicamente un C++ bien hecho. Es bastante nuevo (la versión 1.0 es de febrero de este año) por lo que para proyectos reales acojona un poco usarlo, pero tiene bastantes historias, por ejemplo SWT (la api para hacer GUIs que usa eclipse o azureus) de Java está portado a D (como DWT). Tiene carencias debido a que es poco usado (por ejemplo no hay ningún IDE decente y lo que hay está aún muy verde), pero no parece malo.

  3. Y te dio por probarlo por alguna razón misteriosa?

  4. Porque terminé una semana antes lo que tenía que hacer en el trabajo, y ahora estoy sin hacer nada O_o, jaja. Y debido a la posición de Júpiter respecto a la trayectoria intrópica de los asteroides de la galaxia de periférica, tuve que probarlo :O.

Post Navigation