Está en la página 1de 43

Aliens contra Elefantes

Buenas prácticas en PHP


Gorka Urrutia Landa
Table of Contents
Introduccion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1
¿De qué va este libro? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1
¿Cómo leer el libro? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1
¿Dónde conseguir el libro? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1
Invasión . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2
Los preparativos. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2
¡Una nave se aproxima! . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2
El primer encuentro . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3
Comienza la invasión . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3
Tras la guerra . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5
Se forma la resistencia . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7
María tiene una idea . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7
La primera misión . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8
¡Tenemos un robot! . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8
El robot . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9
El primer objetivo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9
El script. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10
La misión . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12
El desastre . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13
La decisión. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13
Reflexiones. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15
¿Qué salió mal?. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15
Hacer las cosas mal es muy caro . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16
Un nuevo comienzo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18
Cavando un túnel con una cuchara. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18
Se puede cavar un túnel con una cuchara . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19
El "Principio de responsabilidad única" . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19
A vueltas con SOLID. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23
SOLID: Principio de abierto/cerrado . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23
¡Nos han encontrado! . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28
Descubriendo los interfaces. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30
Encantada de conocerte, Bárbara. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33
El principio de sustitución de Liskov . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33
Problemas que puede causar violar el principio de Liskov. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35
¿Cómo identificar violaciones del principio de Liskov? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36
Evitar estos problemas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36
¡Rodeados! . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37
Patrocinadores . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38
Agradecimientos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 39
Elephant Lovers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 39
Elepant Haters . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 39
Términos y definiciones . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 40
Meetup . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 40
Introduccion
¿De qué va este libro?
Este libro es una compilación de mis años de experiencia como programador que quiero compartir
con el mundo.

En él muestro las que están consideradas como mejores formas de hacer un código en PHP que no
nos de urticaria mirar al de cierto tiempo.

Usando como hilo conductor la historia de una invasión extraterrestre a la tierra presentaré todos
los conceptos de las "buenas prácticas". Los protagonistas serán una pandilla de frikis inadaptados
que tendrán que luchar contra los aliens usando sus habilidades como programadores. Descubrirán
que solo a través de las buenas prácticas podrán hacer un código con el que poder vencer a los
aliens.

¿Cómo leer el libro?


Cada capítulo del libro introducirá un concepto relacionado con las buenas prácticas. Para hacerlo
más ameno habrá una historia que servirá de hilo conductor. Los conceptos los introducirán los
propios protagonistas a través de conversaciones y discusiones de tal forma que iremos
aprendiendo con ellos.

¿Dónde conseguir el libro?


El libro se puede comprar a través de la web oficial:

https://aliensvselephants.com/es

1
Invasión
Los preparativos
Año 2022.

La tierra.

Yelena Ztsaitsev, la última programadora de Java, ha fallecido en extrañas circunstancias.

Con ella la humanidad ha perdido a todos sus desarrolladores; de Java y de todos los lenguajes de
programación.

Es la culminación del plan de una raza alienígena que busca el control de nuestro planeta.

Hace años los sistemas de inteligencia artificial extraterrestres escrutaron todas nuestras redes
sociales para detectar posibles amenazas. Programadores y hackers fueron el principal objetivo
detectado.

Así que decidieron acabar con ellos.

Con todos ellos.

El siguiente paso fue analizar los comentarios de la comunidad de desarrolladores. Y encontraron


un patrón, una verdad que parecía indiscutible: los programadores de PHP no son
[1]
programadores de verdad .

Así que dejaron a éstos fuera de su punto de mira. Un error que pagarán muy caro.

¡Una nave se aproxima!


Una vez culminada la primera fase del plan los aliens pasaron a la segunda.

Su nave fue localizada por los radio telescopios terrestres.

2
Figure 1. La misteriosa nave extraterrestre se acerca a la tierra

El primer encuentro
Se recibió un mensaje. Un mensaje breve. Tan solo contenía un texto:

"Venimos en son de guerra"

En la tierra saltaron todas las alarmas. Salió en portada de todos los periódicos y fue el tema
estrella por todo Internet.

Había tiempo para prepararse ante la llegada de la misteriosa nave. Pero simplemente, estábamos
ocupados en cosas más importantes.

Comienza la invasión
La invasión comenzó en China. Los aliens atacaron con fuerza y el ejército se vio incapaz de
contener el ataque. El gobierno chino negó que estuvieran siendo atacados… hasta que el país fue
invadido por completo.

El resto del mundo concluyó que los aliens solo estaban interesados en el país asiático. Y se
olvidaron del asunto.

Cuando comenzó la invasión de Japon el resto de países siguió pensando que era un problema local.
Un mes más tarde Asia al completo estaba en manos de los extraterrestres.

Las redes sociales, ante el problema, reaccionaron… creando un montón de cuentas parodia de los
aliens.

Cientos de tertulianos televisivos e influencers, todos ellos anteriormente expertos en fútbol,


política y pandemias, se reconvirtieron en expertos en exopolítica. Opinaban sobre estrategia

3
militar, acusaban a los gobiernos de acción e inacción a la vez. Negaban la existencia de los aliens y
a la vez criticaban el genocidio causado por la negligente actuación del gobierno ante ellos.

E.E.U.U. dijo que aprovecharía la caída de China para recuperar su lugar en el mundo. Tomaron la
decisión de actuar pretendiendo que los aliens no eran un problema para ellos. Por algo tenían el
ejército más poderoso de la tierra. El Reino Unido decidió actuar de igual forma. Un mes más tarde
ambos habían sido invadidos y su fuerza militar anulada.

Algunos países tenían valientes patriotas que soltaban bravuconadas sin cesar y se mofaban de la
incompetencia de los países invadidos. Se descubrió más tarde que, en secreto, buscaban hacer
tratos con los aliens y conseguir ventajas en el nuevo orden que éstos impondrían. Los aliens se
rieron un poco de ellos al principio y luego los ignoraron.

El Vaticano amenazó con excomulgar a los extraterrestres pero eso no pareció asustarles
demasiado.

Mientras los países iban cayendo uno tras otro la población no se quedó quieta. Se hicieron memes,
vídeos y chistes. Surgieron, por todas partes, gurús que prometían ayudar a adaptarse a la vida en
un mundo gobernado por aliens.

Al final resultó que los conspiranoicos tenían razón: los aliens existían y fueron ellos quienes
habían fomentado en secreto las redes 5G para ayudarles en su invasión.

Los países que aún eran libres crearon una formidable fuerza de ataque y montaron su base en las
Islas Marshal. Los aliens debieron de olvidarse de la isla y se cree que los soldados siguen ahí hoy
en día. Si tiene usted algún problema y si los encuentra, quizá pueda contratarlos.

Figure 2. Los soldados aguardan la llegada de los aliens.

4
Tras la guerra
Tras la rendición de todos y cada uno de los países del mundo los extraterrestres impusieron sus
normas. A los humanos se les permitiría seguir con sus vidas siempre y cuando respetasen esas
normas.

Y la norma principal prohibía todos los lenguajes de programación. Todos excepto PHP.

5
[1] Es un chiste bastante habitual entre las comunidades de desarrollo de software decir que PHP no es un lenguaje de
programación.

6
Se forma la resistencia
María tiene una idea
María llevaba un tiempo oyendo hablar de soldados que habían sobrevivido y habían empezado a
crear la resistencia. A ella también le gustaría formar parte de toda esa gente valiente dispuesta a
luchar.

Pero no era más que una pringada.

Peor que eso.

¡Era una programadora de PHP!

Los aliens, al tomar el poder, avisaron de que programar significaba una muerte segura. Así que
dejó de hacerlo. Hasta que se dio cuenta que no consideraban PHP como un lenguaje de
programación. Tantas burlas y críticas en el pasado por su profesión le habían salvado la vida.

Pero toda la gente que se reía de ella había desaparecido. Incluso había desaparecido la gente que
maquetaba CSS y HTML ¡Pero si eso no es programar! Los aliens habían considerado que ESO era
programar.

Aún así, se siente agradecida. Y quiere hacer algo por el mundo. Entonces recordó las Meetups, esas
reuniones de comunidades de desarrollo en las que algunas personas dejan salir sus egos. Egos tan
grandes que no caben en sus limitados cuerpos y podrían llegar a estallar si no son liberados cada
cierto tiempo.

Así que decidió organizar una reunión. Tenía un poco de miedo al hacerlo por si levantaba las
suspicacias de los aliens. Pero, qué demonios, era una meetup de PHP. No había riesgo.

La convocatoria fue todo un éxito ¡Más de doscientas personas apuntadas! Así que se animó y
reservó un salón de actos capaz de albergar a tanta gente. Y compró pizzas. Pizzas para todo el
mundo.

Más de doscientas personas apuntadas… Se presentaron diez: Una chica que no sabía qué era eso
de PHP pero iba allí para conocer gente. Uno que se apuntaba a estos saraos para ligar. Uno que se
quedaba al fondo, callado, sin hablar con nadie.

Y por supuesto estaba ese tío. Ese que siempre es el centro de atención. Que todo lo sabe. Que de
todo opina. Con fuertes convicciones. Al que no se puede llevar la contra.

Y luego estaba la gente normal. Esa gente que siempre ha hecho que las meetups merezcan la pena.

María, tímida como era, comenzó a hablar nerviosa y entrecortada. Expuso su idea. Había que
hacer algo. Había que luchar.

¡Era el momento de poner en marcha la resistencia!

7
La primera misión
¡Tenemos un robot!
María les contó su idea de poner en marcha la resistencia. Y eso es lo que consiguió… mucha
resistencia. Le criticaron, insultaron y destriparon sus ideas.

María calló mientras los demás le interrumpían.

El único apoyo vino de alguien que dijo:

— ¡Dejad que hable la diseñadora!".

La diseñadora.

Diez años como programadora de PHP. Pero, dado que era mujer, supusieron que era diseñadora.
María se visualizó saltando hacia él y arrancándole el corazón con las manos. Suspiró.

Por supuesto, las principales y más negativas aportaciones vinieron del listo del grupo. Ese que
todo lo sabe. En su cabeza, María decidió llamarle, de manera despectiva, Alpha. Por aquello de que
actuaba como un macho alfa.

Si en algo destacaba María era por su timidez. Le costaba mucho hablar en público y ser el centro
de atención. Más siendo una chica en un mundillo habitado, sobre todo, por hombre.

Pero decidió dar un paso hacia adelante e interrumpió la discusión dando un fortísimo golpe en la
mesa que tenía junto a ella. El golpe no sonó tan fuerte como esperaba pero sí le dolió mucho más
de lo que esperaba.

Conteniendo una lágrima de dolor y con una voz firme que le sorprendió a ella misma dijo:

— Creo que deberíamos dejar de hablar y ponernos en acción.

Explicó que había visto muchas pelis de ciencia ficción y sabía lo que debían hacer. En ese
momento el listo del grupo le interrumpió para decir que él leía libros. Y todo el mundo sabe que
los libros son mejores que la pelis. Y así comenzó otra intrascendente discusión.

Cuando parecía que no iban a llegar a ninguna parte llamaron a la puerta.

Se hizo un gran silencio.

Nervios a flor de piel.

María se dirigió a la puerta y la abrió temblando.

En la puerta estaba plantado con una gran sonrisa un tipo alto, de anchos hombros, rubio, ojos
azules. ¡Qué guapo! Pensó María sonriendo de forma bobalicona.

Michael, que así se llamaba aquel Adonis, entró en la habitación con paso firme. Su presencia
invadió hasta el último rincón de la habitación. Empezó a hablar con una poderosa y firme voz que
María admiró y envidió a partes iguales.

8
— He conseguido robar un robot a los aliens y podemos usarlo contra ellos.

María también se preguntó por qué algunas personas lo tenían todo y otras nada. Ella llevaba
dando vueltas a la idea de la resistencia largo tiempo y tan solo había conseguido reunir a un
puñado de desgraciados. Este desconocido se acababa de enterar de la convocatoria, había
adivinado sus planes y hasta tenía un robot.

Figure 3. ¡Tenemos un robot!

El robot
Michael explicó que había estado experimentando con el robot. Había probado a reprogramarlo
usando varios lenguajes de programación. C, Java, Python, Go… Pero el cerebro del robot
[2]
identificaba todos los intentos de ser alterado y activaba subrutinas de defensa. Por suerte,
Michael consiguió detener estas rutinas cada vez.

Descubrió que, por alguna razón, esas subrutinas no se activaban con scripts de PHP. Pero él no
sabía nada de PHP y por eso se había apuntado a la resistencia.

Todos se preguntaron cómo había sobrevivido siendo programador de PHP. Michael les contó que,
en realidad, era ingeniero, abogado y médico… Además de voluntario en varias asociaciones. Lo de
la programación era solo una afición secreta de la que nadie sabía.

En ese momento María sintió cómo su pulso se aceleraba y su sangre circulaba más deprisa. Viendo
la cara de la otra chicha del grupo supo que no era la única a la que tan imponente ejemplar le
revolvía. Y también le pareció notar algo parecido en las caras de varios de los chicos.

Alpha, dolido en lo más profundo de su ser por la atención que recibía el recién llegado, intentó
tomar las riendas. Agradeció a Michael por su "pequeña aportación" y añadió que era hora de dejar
el asunto en manos expertas. Y, dado que él era uno de los más capaces programadores de la sala, lo
más adecuado era que él tomase las riendas del proyecto.

El primer objetivo
Los aliens habían colocado una gran antena para comunicar a las tropas de tierra con su flota de
naves. Todas las comunicaciones de los aliens pasaban por esa gran antena. Absolutamente todas.

Alguien comentó que era un poco raro que una raza tan tecnológicamente avanzada hiciera algo

9
así. Parecía absurdo que no tuvieran sistemas redundantes por si su único sistema de
comunicaciones se veía comprometido. Pero, quiénes eran ellos para criticar a una raza que había
conquistado un planeta entero tan rápido.

Y no solo usaban una única antena para sus comunicaciones sino que, además, esa antena estaba ¡a
las afueras de su cuidad! La suerte estaba de su lado.

Todos coincidieron en que era el objetivo a atacar.

Destruirían la antena. Los otros grupos de resistencia y los restos de los ejércitos terrestres se
enterarían y pasarían a la acción. Atacarían a las descoordinadas y confusas tropas aliens de la
tierra. Robarían su armamento y sus naves. Y, por último, sorprenderían con un fulminante ataque
a las naves que rodeaban el planeta. La victoria estaba al alcance de su mano. Era un plan sin
fisuras.

El script
Así que se pusieron manos a la obra. Dirigidos por la encarnizada lucha de egos de Alpha y el
poderoso Adonis comenzó el frenético repiqueteo de teclas. Líneas y líneas de código empezaron a
aparecer en las pantallas de sus portátiles.

Tras repartirse el trabajo y después de varias horas trabajando cada cual en su pantalla por fin
terminaron su gran obra. He aquí un pequeño extracto del código resultante:

No le des muchas vueltas para entender cómo funciona. Es un código infame de


 una calidad pésima.

10
<?php
class ControlarRobot {

function girar_robot($angulo) {
...
}

function moverRobot($metros)
{
...
}

function cargarrarma($arma, $municion)


{
if ($arma=='laser-mortal') {
if($municion=='RPN-40') {
$this->cogerRPN40();
}
else if ($municion=='LPT-20') {
$this->usarMunicionLPT20();
}
}
if ($arma=='lanza-misiles')
{
if ($muncion=='MK-10')
$this->usarMisilMk10();
else if ($municion=='MK-20') $this->usarMisilMK20();
else $this->MisilesMk30();
}

function cogerRPM40() {
$this->arma = 'rpn-40'
}

function escogerarma($arma) {
$this->arma = $arma;
if ($arma=='laser-mortal') {
$this->enfriar_gas();
}
}

function disparar_arma($municion)
{
if ($this->arma=='laser-mortal') {
if ($municion=='RPN-40') $this->dispararRPN40();
}
...
}

11
Michael fue el encargado de cargar el código en el robot. Para usarlo bastaba con cambiar el fichero
principal del programa, robot.php, donde se introducirían las órdenes que debería ejecutar el robot.

<?php
$robot = new ControlarRobot;
$robot->girar_robot(20);
$robot->cargararma('lanza-misiles', 'MK-20');
$robot->escogerrarma('lanza-misiles');
$robot->disparar_arma('MK-20');

 ¿Has visto uno de los posibles grandes fallos de este código?

La misión
Aprovechando la oscuridad de la noche salieron a la calle. Se llevaron el robot en furgoneta hasta la
gran antena. Allí lo descargaron y prepararon con cuidado el ataque.

María sentía que el corazón se le iba a salir del pecho. Pero sentía que formaba parte de algo
grande. Iba a cambiar la historia. A salvar el mundo.

Entraron en un edificio abandonado cerca de la antena, colocaron el robot junto a una ventana y lo
encendieron. María se preguntó cómo era posible que no vigilasen un edificio abandonado junto a
un punto tan estratégico.

Sabían que tenían poco tiempo pues las defensas de los aliens lo detectarían al robot en cuanto lo
encendieran.

Y lanzaron el script.

¡Un error!

¿Qué?

Un sudor frío recorrió sus cuerpos. María creía que iba a morir allí mismo.

Alguien tuvo una idea:

— ¡Prueba con otra munición!

Alpha reaccionó rápidamente (era un imbécil pero tenía iniciativa), borró todo lo que había y
tecleó:

<?php
$robot = new ControlarRobot;
$robot->girar_robot(20);
$robot->cargararma('lanza-misiles', 'MK-10');
$robot->disparar_arma('MK-10');

12
El robot cargó el arma pero no disparó.

¿Qué estaba pasando? ¿Por qué fallaba todo?

— ¡No estamos escogiendo el arma!

Alpha añadió la línea que faltaba:

$robot->cargararma('lanza-misiles', 'MK-10');

— ¡Lo has añadido después de disparar_arma!

Los gritos y el apremio nunca han ayudado en situaciones de tensión.

El desastre
En ese momento un potente foco les iluminó.

— ¡Aaaaah! ¡Huyamos! - Gritó alocadamente uno de los personajes secundarios mientras corría
hacia la ventana y saltaba contra ella.

El cristal de la ventana se rompió en mil pedazos (varias veces, a cámara lenta, repitiéndose la
escena desde distintos ángulos). La habitación en la que estaban se encontraba en una quinta
planta. Creo que se entenderá que este personaje secundario no tendrá más apariciones en este
libro.

Los demás corrieron hacia la escalera lo más rápido que pudieron. Llegaron a la calle. Un robot
alien vigilante, alertado por el sonido de los cristales rotos, se había acercado al lugar. Al verlo, otro
de los secundarios, aterrorizado, se acercó a él gritando:

— ¡Me rindo! Ellos me obligaron.

A lo que el imperturbable robot respondió con un disparo láser que lo vaporizó.

Los demás consiguieron escapar sin más bajas y con su robot. María se preguntó cómo era posible
que una panda de frikis que apenas hacían ejercicio y sin entrenamiento militar consiguieran
escapar sin mayor problema de quienes habían conquistado el planeta con tanta facilidad.

La decisión
Se reunieron de nuevo en su local. El agotamiento, el miedo y la angustia inundaban la sala. Se
preguntaban cómo podía haber ido todo tan mal. Se echaron las culpas unos a otros. Hubo
amenazas e insultos. Ningún reconocimiento de culpas. En general no dijeron más que tonterías.

María se alejó de la testosterona. Se acordó de algunos artículos que había leído en algunas
ocasiones que hablaban sobre buenas prácticas, código limpio y cosas similares. Se preguntó si
podrían haber escrito un programa que no fallara.

Sí, tenía que haber otra forma ¡Y ella la iba a encontrar!

13
Se marchó de allí sin decir nada y les dejó discutiendo.

Al de un rato alguien se percató de su ausencia y preguntó:

— ¿Dónde está la diseñadora?

[2] Siempre me ha encantado cómo se usa la palabra "subrutinas" en las películas que hablan sobre ordenadores.

14
Reflexiones
María no pudo dormir esa noche. Se sentía culpable. La resistencia había fracasado por su culpa.
¿Cómo había podido pensar que ella podría haber puesto en marcha algo tan grande? ¡Qué ilusa! Se
estuvo auto flagelando varias horas (en sentido figurado, claro). Por fin, al amanecer cayó en sueño
profundo.

Es muy posible que, de haber sido hombre, también hubiera pasado la noche desvelada pero
buscando culpables en otro lugar.

Durmió un día entero.

Esa noche, mientras ella luchaba por conciliar el sueño, los aliens tampoco pudieron dormir bien.
Habían sufrido un ataque en su principal sistema de comunicaciones. Podía haber sido fatal.

Habían detectado a un robot desaparecido hacía unos días junto al lugar del ataque. El ordenador
central comenzó a analizar los datos recibidos:

Uno de nuestros robots ha sido reprogramado…

La reprogramación se ha hecho con un lenguaje llamado PHP…

Buscando PHP…

PHP no es un lenguaje de programación…

La reprogramación se ha hecho con un lenguaje llamado PHP…

Buscando PHP…

El ordenador central entró en un bucle infinito. Varios condensadores se sobrecargaron. La matriz


[3]
del núcleo se sobrecalentó. . Tardaron varias horas en solucionar el fallo.

Y se olvidaron del ataque.

Los aliens eran muy buenos viajando por el espacio, construyendo robots y conquistando planetas.
Pero, por lo demás, no parecían muy listos.

¿Qué salió mal?


María despertó por fin. Hacía un día estupendo.

Encendió el ordenador y se puso a repasar el código que habían usado para el robot. Su cabeza le
decía que algo no estaba bien.

15
<?php
$robot = new ControlarRobot;
$robot->girar_robot(20);
$robot->cargararma('lanza-misiles', 'MK-20');
$robot->escogerrarma('lanza-misiles');
$robot->disparar_arma('MK-20');

Algo hizo click en su cabeza. Se dio cuenta de que si usabas el método disparar_arma() sin antes
haber llamado a escogerarma() se producía un fallo porque no había arma seleccionada. Había que
llamar a los métodos en un orden determinado. Y ese era uno de los problemas que habían tenido
¡Había localizado un error muy grave en el código! ¡Y ni si quiera parecía un error!

Concluyó que una clase debería estar siempre lista para ser usada. Obligar a usar los métodos con
un orden determinado era una fuente de errores. Por ejemplo, tener que llamar a escogerarma()
antes de poder usar disparar_arma() era un disparate. Se le ocurrió que quizá disparar_arma()
debería comprobar si había un arma escogida antes de intentar disparar.

Animada por su descubrimiento siguió mirando el código. Comprobó que al cargar el arma no se
comprobaba si había munición. ¡Otro error más!

Y entonces, otra cosa llamó su atención:

girar_robot()
moverRobot()
cargarrarma()
usarMisilMk10()

¡Cada nombre usaba un formato diferente! Nunca le había importado pero, de pronto, aquello le
molestaba sobremanera.

¡Y ni siquiera estaba bien tabulado!

¡Y unos if con llaves y otros sin llaves!

Hacer las cosas mal es muy caro


Cuanto más miraba el código más horrorizada se sentía. Nunca le habían preocupado ninguna de
esas cosas. Pero ahora veía que esas cosas tenían importancia. Y costaban vidas.

Vidas como la de Alpha.

Vale, esto no había sucedido. Pero se dio cuenta de que no le parecía tan grave si hubiera ocurrido.
Pero ¡no! era una vida. Y las vidas son todas importantes.

Si quería ser parte de la resistencia tenía que asegurarse de que su código no costaría más vidas
humanas.

Así que empezó a investigar cómo era posible hacer un código de buena calidad.

16
[3] Lo siento, tenía que decir lo de "la matriz del núcleo"

17
Un nuevo comienzo
María estaba convencida, al igual que la mayoría, de que era una buena desarrolladora. Cada vez
que le presentaban un problema lo resolvía. Si había algún fallo en su código lo solucionaba en
poco tiempo. Se consideraba una programadora rápida.

Pero la experiencia en la antena le hizo abrir lo ojos y darse cuenta de que, quizás, no estaba
haciendo las cosas todo lo bien que podía. Había conseguido descubrir algunos errores en el código
ella sola y eso le llenaba de orgullo. Pero también se dio cuenta de que necesitaba ayuda. Había
visto que más gente había estado donde estaba ella ahora (sin luchar con unos aliens sanguinarios,
claro). Y podía aprovecharse de su experiencia.

María buscó y buscó por la web información sobre código limpio y buenas prácticas. No encontró
mucho. Los aliens habían hecho un buen trabajo de limpieza. Habían eliminado blogs, webs
enteras, liberías online… de todo.

[4]
Pero el golpe definitivo fue el cierre de Stack Overflow . Con eso los aliens se aseguraban de que
los pocos desarrolladores que se les hubieran podido escapar quedaran bloqueados, incapaces de
programar.

Entonces se acordó ¡La biblioteca municipal! Allí encontraría libros. Los aliens, esos que
conquistaban planetas sin mayor dificultad, a veces parecían un poco, digamos, "despistados". Se
habían centrado en Internet pero habían olvidado las que, en otra época, habían sido una gran
fuente de conocimientos, las bibliotecas públicas.

Cavando un túnel con una cuchara


Cogió su bici y salió disparada, emocionada, hacia su nuevo templo de la sabiduría.

Entre lo poco que había encontrado por Internet había visto que era importante investigar sobre
una cosa llamada principios SOLID y otra llamada patrones de diseño. Así que solicitó varios libros
sobre esos temas.

Abrió, con gran ilusión, el primer libro sobre los famosos principios SOLID. Leyó, leyó y leyó. Y se
aburrió como nunca se había aburrido antes.

No entendió nada.

Así que se pasó a los libros de patrones de diseño… y tampoco entendió nada.

Frustrada, abrumada y triste cerró todos los libros. Se sentía como si tuviera que cavar un túnel con
una cuchara.

Y lloró.

Y se quedó dormida.

18
Se puede cavar un túnel con una cuchara
Se despertó sobresaltada ¿Cuánto había dormido? Con disimulo limpió las babillas que habían
caído sobre los libros.

Había soñado con una de las mejores comedias de todos los tiempos: Top Secret (también conocida
como Super secreto). Recordó la hilarante escena donde un científico intenta escapar construyendo
un túnel con una cuchara. Un enorme túnel de varios carriles con asfalto e iluminación.

¡Ella también podría hacer un túnel con una cuchara! En su caso cavaría un túnel a través de la
gigantesca montaña de su ignorancia.

— ¿Eso de cavar un túnel ha través de la ignorancia lo he dicho yo? - pensó - ¡qué poética me he
despertado!

Con el ánimo fortalecido volvió a coger uno de los libros sobre los principios SOLID. Abrió tanto el
libro como su mente. Y comenzó a leer.

El "Principio de responsabilidad única"


"Principio de responsabilidad única o SRP (siglas del inglés, Single
Responsibility Principle).

Una clase debe tener solo una razón para cambiar."

En realidad, sacado de Wikipedia

— Wikipedia, Principios SOLID

Pensó que eso tenía sentido.

Se acordó de la clase ControlarRobot que habían creado para el ataque. ¿Qué cosas hacía esa clase?
Entre otras se encargaba de: mover el robot, cambiar de arma, cargar la munición y disparar.

Se le ocurrió que el movimiento del robot podría ser una de las responsabilidades y gestionar las
armas otra. Entonces su clase violaba este primer principio ¡Sí que empezaron mal!

¿Y qué problema hay con que una clase tenga más de una responsabilidad? Si tienes que cambiarla,
la cambias y listo. Pero entonces recordó todas las veces que había cambiado cosas y se había "roto"
el programa entero. Todas esas veces donde cambiar algo en una función afectaba a otras partes
que no había tenido en cuenta.

De repente una palabra vino a su mente acoplamiento. Recordó una charla donde el apuesto
ponente, un tal Gorka Urrutia, hablaba de acoplamiento de código. Fue muy interesante pero no
entendió nada. Aquel simpático chico decía en su charla que el acoplamiento era muy malo y éste
se producía cuando unas clases dependían de otras. Se anotó en su cabeza que ese era un tema
sobre el que tendría que investigar más adelante.

Estuvo un buen rato dándole vueltas para separar las responsabilidades. Se le ocurrió crear dos

19
clases nuevas: MoverRobot y DispararRobot.

Pero, un momento, algo no cuadraba. Empezó a pensar en todo esto de la Programación Orientada
a Objetos.

Objetos.

Un robot es un objeto, un arma es un objeto. Se fijó en que a la clase que controlaba el robot la
habían llamado ControlarRobot. Pero "controlar un robot" no es un objeto, es una acción. ¿Y por
qué no llamarla Robot? Era un cambio sencillo pero, de repente, todo cuadraba más.

— Entonces, - pensó- si quiero dejar de usar verbos y centrarme en los objetos, ¿por qué no llamar
Armamento a la parte que controla las armas?

Y tendría que buscar un nombre para la parte que controlaba el movimiento. Dado que el robot se
mueve usando piernas ¿por qué no llamar a la parte que las controla, simplemente, Piernas?

Ya tenía dos clases cada una con su propia responsabilidad. Ahora, si tenía que modificar algo
relacionado con el armamento tendría la garantía de que no iban a afectar a la parte de mover el
robot.

Parecía que iba por el buen camino ¿Cómo podría juntar esas dos clases para que funcionaran
dentro del robot? Se le ocurrió algo así:

<?php
class Robot {
public function $piernas;
public function $armamento;

public function __construct() {


$this->piernas = new Piernas();
$this->armamento = new Armamento();
}
}

class Piernas {
public function moverrobot() {
/* Esto son puntos suspensivos para ahorrarme trabajo, no es algo de PHP */
}
}

class Armamento
{
public function escoger_arma($arma) {
...
}

public function dispararArma($arma) {...}


}

20
 Esto va mejorando pero todavía queda bastante.

¿No te molesta cómo María mezcla las distintas notaciones camel_case


(escoger_arma), snakeCase (dispararArma) y sin case (moverrobot)? ¿Y esa forma
 de poner las llaves unas veces seguido del nombre de la función y otras en la línea
siguiente?

Eso tenía mejor pinta. La clase se podría usar así:

<?php
$robot = new Robot;
$robot->piernas->moverrobot();
$robot->armamento->escoger_arma('misil');
$robot->armamento->dispararArma('misil');

Al principio sintió un gran orgullo por su nuevo código con clases que tenían una única
responsabilidad. Pero se preguntó si eso no sería precisamente eso que llamaban acoplamiento. Y
también resonaba en su cabeza la palabra encapsulación.

Y entonces se fijó en este pequeño fragmento:

public function $piernas;

No había caído en que al hacer eso, cualquiera que usase la clase Robot podría modificar esa
propiedad haciendo algo así:

$robot->piernas = null;

Y el robot empezaría a hacer cosas extrañas.

También se dio cuenta de que, si en el futuro quería cambiar el nombre de las propiedades $piernas
o $armamento ya no podría ¿Y por qué? Pues porque quien usase la clase Robot esperaría poder
hacer ésto:

$robot->piernas->moverrobot();

Y si $piernas cambiaba de nombre le "rompería" el código a esa persona. Así que concluyó que
debería hacer $piernas y $armamento privadas para que nadie se sintiera tentado de usarlas:

<?php
class Robot {
private function $piernas;
private function $armamento;

21
También se dio cuenta de que esto se aplicaba a los métodos de la clase. Cuantos más métodos
públicos hubiera más le costaría hacer cambios en el futuro pues quien usase la clase Robot
esperaría un determinado comportamiento.

Y también pensó ¿Y qué pasaría si mañana decido que ya no quiero usar la clase Piernas? Entonces
se le ocurrió una mejora:

<?php
class Robot {
private function $piernas;
private function $armamento;

public function __construct() {


$this->piernas = new Piernas();
$this->armamento = new Armamento();
}

public function moverrobot()


{
$this->piernas->moverrobot();
}

public function escoger_arma($arma) {


$this->armamento->escoger_arma($arma);
}

public function dispararArma($arma) {


$this->armamento->disparararma($arma);
}
}

Eso parecía una gran mejora. Ahora era libre para modificar la clase Robot como ella quisiera. Tan
sólo tenía que respetar unos pocos métodos: moverrobot(), dispararArma() y similares.

Había conseguido separar las responsabilidades y podía hacer modificaciones dentro de Robot
libremente sin afectar a quien usara la clase.

Así que se prometió a sí misma que, a partir de ese momento, todo su código sería más encapsulado
y respetaría siempre el principio de responsabilidad única en clases y en métodos o funciones.

— Bueno, pues sí que he avanzado mucho - se dijo llena de orgullo.

Estaba tan emocionada y absorta en sus pensamientos que no notó cómo alguien se había acercado
a ella por la espalda. Una mano agarró fuertemente su brazo y le dijo:

— Hola, tú eres la diseñadora de la resistencia ¿verdad?

[4] Stack Overflow es la web donde acabas cuando buscas dudas sobre programación.

22
A vueltas con SOLID
Era Alpha.

María nunca había gritado tan fuerte a nadie en su vida. Primero fue un grito causado por el
tremendo susto que se había llegado. Después, una vez recompuesta, gritó por la torpeza de Alpha
al mencionar a la resistencia en público (cosa que ella también hizo mientras gritaba). Y tercero,
gritó de rabia por lo de diseñadora.

— ¡Que soy programadora! ¡Caramba! - repitió luego con más calma.

 Sí, "caramba", que en este libro no se dicen palabrotas.

Alplha se sintió un poco intimidado. No esperaba esa reacción. Cuando se le pasó el susto le contó a
María lo que había sucedido tras su marcha. En resumen, habían seguido echándose culpas unos a
otros y no llegaron a ninguna conclusión provechosa. Él decidió que se había rodeado de inútiles
que habían hecho todo mal. Y que él tendría que buscar la raíz del problema en el código que
habían escrito.

A María se le iluminó la cara. Pensó que quizá no era tan estúpido como había pensado al
principio. Y creyó que sería capaz de apreciar sus descubrimientos.

Y le sonrió.

Alpha le devolvió la sonrisa.

Él sabía que gustaba a las chicas. Casi todas estaban enamoradas sin remedio de él. Y sabía lo que
aquella sonrisa significaba ¡Ya se está imaginando nuestra boda! Se dijo para sus adentros
irguiéndose lleno de orgullo.

Pero la cabeza de María no iba por ahí. Ella no era una chica especialmente llamativa. De hecho, en
su propia cabeza se veía como un trol de las cavernas indigna de la atención de ninguna persona.
Pero sonrió porque creía haber encontrado un compañero en su nuevo y emocionante viaje. No, ya
no le veía como alguien tan estúpido, pero aún quedaba mucho margen de mejora.

Con gran ilusión le contó lo que había avanzado. Él parecía escuchar con atención.

SOLID: Principio de abierto/cerrado


Lo siguiente que le expuso fue el segundo y confuso principio SOLID:

Principio de abierto/cerrado (Open/closed principle) la noción de que las


“entidades de software … deben estar abiertas para su extensión, pero
cerradas para su modificación”.

— Wikipedia, Principios SOLID

Cuando lo leyó se preguntó cómo era posible que algo estuviera abierto y cerrado a la vez. ¿Acaso
Schrödinger había sido un visionario capaz de prever los problemas del mundo de la

23
programación? Se rió para sus adentros con esa simpática analogía que prefirió no compartir.

Entonces Alpha estalló:

— ¡Menuda bobada! ¿Cómo va a estar algo abierto y cerrado a la vez? Mira, esto que has visto está
bien, pero estamos en el mundo real. Todo esto que dices está bien como teoría, pero hay que ser
prácticos. Esto es una pérdida de tiempo.

María le miró asombrada. A veces se equivocaba con las primeras impresiones que tenía con la
gente. Pero estaba claro que éste no era el caso. Ese chico era realmente un imbécil.

Alpha se marchó mascullando, sin despedirse.

— Perdona - oyó decir a sus espaldas - Eres la programadora que organizó la resistencia ¿verdad?

No pudo evitar que su corazón se llenara de gozo con aquellas palabras.

Programadora.

Organizadora.

Por fin alguien le reconocía sus méritos. Pensó que aquella voz masculina debía tener como
propietario al ser más maravilloso del mundo. Sintió un poco de lástima por sí misma por alegrarse
tanto con tan poco. Se giró esperando ser impresionada por la magnificiencia de aquel ejemplar del
sexo opuesto.

Y se encontró con un chico bastante normal al que no había visto jamás en su vida.

— Me llamo Mario, estuve en la reunión de la resistencia. Estuviste impresionante.

Vaya, Mario, qué curioso. Mario y María. Pero no, esta vez tampoco se imaginó su boda. Mario
había estado en la reunión pero debió quedar totalmente eclipsado por Michael, el adonis porque
no le recordaba.

Él le contó que había oído la conversación con Alpha y le había parecido muy interesante lo que
había dicho. También le había descolocado este último principio SOLID.

Lo analizaron con más calma.

una entidad de software (clase, módulo, función, etc.) debe quedarse abierta
para su extensión, pero cerrada para su modificación.

Abierta para su extensión, pero cerrada para su modificación.

¿Se preguntaron cómo puedes extender algo sin modificarlo? Mentes en blanco.

— ¿A qué se refiere con lo de "extender"? - preguntó María.

— ¿Igual se refiere a, por ejemplo, añadir una nueva arma? - respondió Mario.

— ¡Eso es! Tenemos que ser capaces de añadir una nueva arma pero sin tocar la clase Robot o
Armamento.

24
— ¿Y cómo hacemos eso? - Inquirió Mario todavía perdido.

— ¡Con parámetros! - dijo una triunfal y entusiasmada María.

Decidieron tomar la clase Armamento y ver cómo podían aplicarle este principio.

<?php
class Armamento
{
public function escoger_arma($arma) {
...
}

public function dispararArma($arma) {...}


}

Analizaron los métodos y se dieron cuenta de la cantidad de if que usaban para ver con qué arma
se estaba trabajando:

<?php
function escoger_arma($arma)
{
if ($arma=='laser-mortal') {
if($this->municion=='RPN-40') {
$this->cogerRPN40();
}
else if ($this->municion=='LPT-20') {
$this->usarMunicionLPT20();
}
}
if ($arma=='lanza-misiles')
{
if ($this->muncion=='MK-10')
$this->usarMisilMk10();
else if ($this->municion=='MK-20') $this->usarMisilMK20();
else $this->MisilesMk30();
}

Vieron que si querían añadir una nueva arma tendrían que añadir más if y modificar la clase
Armamento ¡Y eso violaría este segundo principio! Así que empezaron a experimentar para
cambiar la clase con la idea de María de usar parámetos.

En ese momento Mario no aguantó más y dijo:

— María, me molesta lo visualmente confuso que es éste código ¿te importa que lo formatee bien?

— Venga, si no tardas mucho.

Diez minutos más tarde, que a María se le hicieron eternos, Mario había terminado:

25
<?php
class Armamento
{
public function escogerArma($arma)
{
if ($arma=='laser-mortal') {
if ($this->municion=='RPN-40') {
$this->cogerRPN40();
}
else if ($this->municion=='LPT-20') {
$this->usarMunicionLPT20();
}
}

if ($arma=='lanza-misiles')
{
if ($this->muncion=='MK-10') {
$this->usarMisilMk10();
}
else if ($this->municion=='MK-20') {
$this->usarMisilMK20();
}
else {
$this->MisilesMk30();
}
}
}

public function dispararArma($arma)


{
...
}

María, que al principio pensó que aquello era una pérdida de tiempo, se fijó en que ahora el código
era mucho más fácil de leer. Era un cambio muy "tonto" pero visualmente era mucho más
agradable.

— Y también he usado el formato "camelCase" en toda la clase. Podía haber usado "snake_case"
pero a mí me gusta más el otro. ¿te parece bien?

María estaba sorprendida del cambio. Nunca había dado importancia a esas cosas pero ahora lo
veía claro.

— ¡Sí! ¡El código limpio tiene que parecer limpio! ¡buen trabajo! - Se le escapó en voz alta.

Y por fin, después de varias vueltas llegaron a ésto:

26
<?php
class Armamento
{
public function escogerArma($arma)
{
$arma->escoger();
}

public function dispararArma($arma)


{
$arma->disparar();
}

¡Lo habían logrado! Ahora podían añadir nuevo armamento al robot sin necesidad de llenar la
clase Armamento de if. Bastaba con añadir una nueva clase que tuviera los métodos escoger() y
disparar() y ya estaría. Habían conseguido dejarla abierta para su extensión pero cerrada a cambios.

La clase Robot ahora quedaría:

<?php
class Robot {
private function $piernas;
private function $armamento;

public function __construct() {


$this->piernas = new Piernas();
$this->armamento = new Armamento();
}

public function moverrobot()


{
$this->piernas->moverrobot();
}

public function escogerArma($arma) {


$this->armamento->escogerArma($arma);
}

public function dispararArma($arma) {


$this->armamento->dispararArma($arma);
}
}

Y las clases para manejar las armas quedarían de esta forma:

27
<?php
class Misil {
public function escoger()
{
...
}

public function disparar()


{
...
}
}

Esta clase Misil tenía un método escoger() y un método disparar(), así que cumplía con las
condiciones para ser usada dentro de Armamento.

María estaba muy emocionada. Tan solo habían arrascado la superficie de eso que llamaban buenas
prácticas y sentía que habían avanzado mucho. Entonces Mario se dio cuenta de un detalle:

— Pero ¿y si quien crea una de las clases para Armamento se le olvida uno de los dos métodos que
necesitamos? ¿O cómo evitamos que les ponga un nombre erróneo?

María estaba segura de que algo encontrarían.

En ese momento las puertas de la biblioteca estallaron con un terrible estruendo.

¡Nos han encontrado!


María cometió el error al escoger los libros de programación. Uno de ellos no estaba etiquetado
como PHP e hizo saltar las alarmas de los aliens ¡Alguien está intentando aprender a programar!
Los otros veinte libros de PHP, por supuesto, no despertaron ninguna sospecha.

Un robot apareció entre los escombros de la puerta.

— ¿Don-de pro-gra-ma-dor? - Dijo el robot.

Mario, asustado, se había escondido bajo la mesa. María estaba allí de pie, incapaz de moverse. El
robot apuntó hacia ella:

— Hu-ma-na. Hem-bra. No pro-gra-ma-dor. Po-si-ble di-se-ña-do-ra. No pe-li-gro. - dijo mientras se


giraba buscando otros objetivos.

Ahora sí. Ahora sí que la habían enfadado. Habían conquistado su planeta. Le había privado de su
trabajo. Pero eso de diseñadora ya era la gota que colmaba el vaso. Estaban acabados. Iba a echar a
todos los aliens de la tierra y a destruir hasta el último de sus robots.

En ese momento se oyó un disparo que impactó contra el robot.

¿Sería la resistencia que por fin estaba contra atacando? ¿Había llegado el momento de la salvación
de la tierra?

28
María se giró y vio al bibliotecario sobre el mostrador. Era un hombre pequeño, bastante mayor,
con una enorme arma.

— ¡Silencio en la biblioteca! - dijo enfadadísimo.

Y volvió a disparar contra el robot. Y comenzó el fin del mundo. Balas chocando contra el robot,
rebotando en las mesas de roble. Láseres que atravesaban paredes y libros. Misiles y granadas que
salían del robot y explotaban por doquier. Hojas sueltas volando por el aire. Libros ardiendo.

Figure 4. ¡Silencio en la biblioteca!

Tras unos minutos de intenso ruido, fuego y miedo se hizo el silencio. El robot estaba inmóvil. El
bibliotecario había vencido. Pasado el susto la gente empezó a salir de debajo de las mesas. ¡Y
comenzaron a aplaudir al héroe lanzándole vítores!

— ¡Silencio en la biblioteca! - dijo, otra vez, enfadadísimo.

María se preguntó cómo era posible que aquel hombrecillo hubiera derrotado a un robot. A uno de
los robots que habían derrotado sin mayor dificultad a los más poderosos ejércitos de la tierra.

29
Descubriendo los interfaces
El despertador sonó por décima vez. María se preguntaba por qué seguía poniendo el despertador.
Ya no tenía un trabajo y podía levantarse cuando quisiera. Aunque PHP no se consideraba un
trabajo de programación nadie quería arriesgarse. No tenía sentido salir de la cama.

Pero entonces recordó la emoción de los últimos días y su cruzada personal contra los aliens y
hacia una nueva forma de desarrollo. Y salió de la cama de un salto.

Mientras se preparaba su imprescindible café le estaba dando vueltas al problema que habían
encontrado Mario y ella el día anterior.

¿Cómo podían hacer para que quien programase contra la clase Armamento lo hiciera de forma
correcta?

¿Usar una buena documentación?

— Sí, porque todo el mundo se lee la documentación. - Pensó en tono irónico.

Se acordó de esa frase que había oído alguna vez:

— Cuando todo lo demás falla lee la documentación.

Tenía que haber algo.

Entonces le volvió a venir a la mente la charla de aquel apuesto ponente, Gorka Urrutia. Recordó
que mencionó algo de los interfaces. En aquel momento le pareció que aquello que contaba era
una complicación innecesaria. Pero ahora le veía sentido.

Así que empezó a investigar sobre los interfaces. ¡Y resulta que era precisamente lo que estaba
buscando! Con los interfaces podía obligar a que una clase tuviera unas determinas funciones. En el
caso de armamento podrían definir un interfaz así:

<?php
interface ArmaInterface {
public function escoger();

public function disparar();


}

Y así se puede obligar, en la clase Armamento, a que los parámetros $arma cumplan con ese
interfaz indicando que sean del tipo ArmaInterface:

30
<?php
class Armamento
{
public function escogerArma(ArmaInterface $arma)
{
$arma->escoger();
}

public function dispararArma(ArmaInterface $arma)


{
$arma->disparar();
}

Y para que un arma cumpla con ese interface tendría que implementarlo:

<?php
class Misil implements ArmaInterface {
public function escoger()
{
...
}

public function disparar()


{
...
}
}

¡Menudo descubrimiento! De esta forma no había que ponerlo en la documentación. Y quien crease
una nueva arma tendría que respetar esos métodos o no podría usarla con Armamento.

En realidad ya había oído hablar de los interfaces y hasta los había usado alguna vez. Pero los
había usado sin entender lo que estaba haciendo. Fue una cosa de "prueba y error" hasta que le
funcionó. Pero ahora veía lo útiles que podían ser.

Se preguntó por qué en un interfaz solo se podían poner métodos públicos.

Esto tengo que compartirlo con Mario.

Mario.

Parecía un chico majo. Cuando cogió el teléfono para mandarle un mensaje se dio cuenta de que se
había puesto nerviosa ¿Le gustaba ese chico? ¿Más que aquel pedazo de ejemplar llamado Michael?

Barrió aquellos pensamientos de su cabeza y le envió un mensaje. Esto era algo importante.
Estaban salvando el mundo.

31
Le invitó a venir a su casa para enseñarle los avances. Mario aceptó.

Entonces se dio cuenta de la pocilga en la que vivía.

32
Encantada de conocerte, Bárbara
María le enseñó a Mario sus recientes descubrimientos. Mario estaba impresionado. Y también
sentía mucha envidia por todo lo que había avanzado ella por su cuenta.

El principio de sustitución de Liskov


Emocionados como estaban y con una confianza exagerada en sus recién descubiertas capacidades
retomaron los principios SOLID. Era el turno del "Principio de sustitución de Liskov". Mario tomó
un libro y comenzó a leer:

— Sea ϕ(x) una propiedad comprobable acerca de los objetos x de tipo T. Entonces ϕ(y) debe ser
verdad para los objetos y del tipo S, donde S es un subtipo de T.

Ambos se quedaron en silencio mirando al libro.

Un largo rato.

Cuando por fin se recompusieron del shock fueron conscientes de que habían llegado al límite de
su capacidad. Aquello era indescifrable. Entonces vieron una aclaración:

"si S es un subtipo de T, entonces los objetos de tipo T en un programa de computadora pueden ser
sustituidos por objetos de tipo S (es decir, los objetos de tipo S pueden sustituir objetos de tipo T),
sin alterar ninguna de las propiedades deseables de ese programa."

María quiso parecer lista delante de Mario, pero su cara era el fiel reflejo de su perplejidad ¿Por
qué este tal Liskov enunciaba las cosas de forma tan complicada? Así que investigaron un poco. Y
resulta que el tal Liskov era en realidad una mujer: Bárbara Liskov.

María sintió un cierto orgullo ajeno. Una mujer en un mundo de hombres y el único principio
SOLID con nombre era el que planteó una mujer. Así que tenía que entenderlo. Sentía que era su
obligación.

Después de darle vueltas llegaon a la conclusión. El principio hablaba de cuando hacemos uso de
una determinada clase y, en algún momento, queremos sustituirla por una clase "hija". Si la clase
hija tiene un comportamiento que difiera en algo de la madre entonces el código que las usa puede
"romperse".

Mario recordó entonces un código que había visto en su programa de control del robot. Había una
clase llamada Ojo:

33
<?php
class Ojo
{
public function capturarImagen() {
...
return $imagen;
}
}

Y también había visto una clase llamada OjoVisionNocturna que heredaba de la anterior y le añadía
nueva funcionalidad (el control de la visión nocturna):

<?php
class OjoVisionNocturna extends Ojo
{
public function setVisionNocturna($estado) {
$this->estadoVisionNocturna = $estado;
}

public function capturarImagen() {


if ($this->estadoVisionNocturna) {
$this->capturarImagenNocturna();
}
else {
$this->capturarImagenNormal();
}
return $imagen;
}
}

Se dio cuenta de que si tenías un código donde usabas la clase Ojo no iba a funcionar bien con
OjoVisionNocturna porque tendrías nuevos métodos (setVisionNocturna()) de los que no sabías
nada. Por ejemplo el siguiente código se estaba usando para capturar imágenes:

<?php

function sacarFoto(Ojo $ojo) {


$ojo->capturarImagen();
}

Si a este código le pasamos una instancia de OjoVisionNocturna en lugar de Ojo PHP no se va a


quejar puesto que le llega una clase hija de Ojo. Sin embargo no vamos a poder usar la
funcionalidad de la visión nocturna porque es algo para lo que no está preparada la clase Ojo.

Entonces María se preguntó ¿y por qué no añado los nuevos métodos de visión nocturna?

34
<?php

function sacarFoto(Ojo $ojo) {


$ojo->setVisionNocturna(true);
$ojo->capturarImagen();
}

Pero se dio cuenta de que entonces el código se rompería al llamarlo con un objeto de tipo Ojo.

Mario siempre había pensado que la herencia de clases era algo maravilloso que te permitía
reutilizar código. Pero esto le había abierto los ojos; la herencia puede ser peligrosa si se abusa de
ella o no se usa con cuidado.

Entonces se preguntaron cómo se podría hacer para garantizar que se cumplía este principio.

— ¡Los interfaces! - Dijeron ambos al unísono - Podemos crear un interface OjoInterface.

<?php
class OjoInterface
{
public function capturarImagen();
}

Y para usarlo habría que modificar la función sacarFoto():

<?php

function sacarFoto(OjoInterface $ojo) {


$ojo->capturarImagen();
}

Pero según lo escribían se dieron cuenta de que el interface obligaba a la existencia del método
capturarImagen pero no impedía que se añadieran nuevos métodos ni ponía limitaciones a la
lógica interna de la clase.

Problemas que puede causar violar el principio de


Liskov
No se les ocurrió una forma sencilla de obligar a que se cumpla el principio de Liskov así que
empezaron a pensar si realmente era tan grave no seguirlo. Después de un rato escurriendo el
cerebro se dieron cuenta de que se podían dar varios problemas:

La clase hija, en alguno de sus métodos, podría devolver un tipo de objeto diferente del que
devuelve la madre. Y estos objetos podrían ser incompatibles.

Pensaron que este problema sí podría resolverse con un interfaz, obligando a que el tipo que

35
devuelven los métodos sea de un tipo determinado. Por ejemplo:

<?php
class OjoInterface
{
public function capturarImagen() : ImagenJPG;
}

Otra cosa que podría suceder era que la clase hija podría lanzar una excepción que la clase madre
no lanzaba. Como la clase madre no contempla la posibilidad de lanzar esa excepción en la función
sacarFoto() no la estarían tratando y acabarían teniendo problemas.

Y, por supuesto, estaba el problema que ya habían visto de que si cambiaban el comportamiento de
la clase o añadían nuevas funcionalidades podrían aparecer problemas inesperados.

¿Cómo identificar violaciones del principio de Liskov?


Como aún no habían encontrado una forma de hacer que se cumpliera este principio buscaron
formas de detectar cuando no se hacía.

Se dieron cuenta de el uso de get_class() o de instanceof era una pista. Cuando alguien usa estas
funciones es porque necesita saber si la clase que se está usando es la madre o la hija. Pensaron
que, en el caso de la función sacarFoto(), se podría haber hecho algo así:

<?php

function sacarFoto(Ojo $ojo) {


if ($ojo instanceof OjoVisionNocturna) {
$ojo->setVisionNocturna(true);
}
$ojo->capturarImagen();

Y eso sería una pista clarísima de la violación del principio.

Otra pista era la aparición de métodos heredados sin nada de código dentro. Métodos que se crean
para anular algún comportamiento de la clase madre.

Y también estaba, claro, el hecho de que se lanzasen excepciones en la clase hija que no se lanzan
desde la madre.

Evitar estos problemas


Viendo el problema que suponía no seguir este principio se preguntaron cómo obligar a cumplirlo.
Los interfaces parecían solucionar parte del problema pero no todo.

36
Entonces a María le vino a la cabeza una frase que había oído varias veces pero nunca había
entendido del todo:

Se debe preferir la composición sobre la herencia.

¿Y qué porras quería decir aquello? ¿Qué era eso de la composición?

¡Rodeados!
En ese momento notó que Mario agarraba su mano. Su acelerada mente frenó en seco. Su corazón
se aceleró. Y su cara se volvió del color del tomate. Un tomate muy maduro.

Y entonces Mario se acercó a su oído y le dijo en susurros:

— He oído robots en la calle. Muchos robots.

Su mente volvió a acelerarse. Su corazón se aceleró aún más. Y su cara recuperó el color.

¡El edificio estaba rodeado!

Se asomaron a la ventana y vieron un montón de robots. Había incluso alienígenas. Éstos no


dejaban verse mucho así que venían por algo importante. Venían a por ellos. Habían conseguido
escapara de la biblioteca, pero estaba claro que se les había acabado la suerte.

— En-tre-guen a la mu-jer que cra-quea nues-tros sis-te-mas. En-tre-guen a su he-ro-í-na - Dijo uno
de los robots usando un megáfono interno.

María entró en pánico ¡Venía a por ella!

¡Un momento! ¿Heroína? ¡Pero si nadie la conocía! Nadie la consideraba una heroína.

Entonces, desde uno de los pisos de más arriba se oyó una ráfaga de disparos que acribilló a uno de
los robots. Los robots respondieron disparando con una precisión impecable. Pequeñas granadas,
láseres, disparos. Otra vez el infierno desatado.

Apenas diez minutos más tarde el fuego cesó. Varios robots yacían hechos pedazos en la calle. Otros
habían entrado en el edificio.

María recordó el piso de narcotraficantes que había en su edificio. Traficaban con crack y heroína
entre otras cosas.

María pensó que, quizá, las IA de los aliens habían malinterpretado las palabras crack y heroína.
¿En serio? ¿Unos aliens que viajan por el espacio y conquistan planetas con facilidad cometen un
error tan tonto? María empezaba a pensar que los aliens, o sus IA, eran un poco estúpido.

37
Patrocinadores
Si este proyecto te parece interesante y quieres aprovechar su difusión para promocionar tu
empresa puedes aprovechar la oportunidad y hacerte patrocinador:

https://aliensvselephants.com/es#seccion-alien-soldier

Y si os sobra el dinero, queréis una buena promoción y os venís muy arriba podéis haceros
patrocinadores "top":

https://aliensvselephants.com/es#seccion-alien-supremo

38
Agradecimientos
Elephant Lovers
¿Quieres ver tu nombre en esta sección?

Si te gusta PHP o te caigo bien pero el libro no te interesa esta es tu opción.

Ventajas:

• No te tienes que leer el libro.

• Como soy un crack este libro hará aún mejor a la boyante comunidad PHP y acabará creciendo
aún más.

Condiciones:

• No se incluye el libro.

• Es una forma de apoyar al proyecto.

Si quieres ser un "Elephant Lover" entra aquí:

https://aliensvselephants.com/es#seccion-elephant-lover

Elepant Haters
¿Quieres ver tu nombre en esta sección?

Si odias PHP o me odias a mí no dudes más y escoge esta opción.

Sabes que soy un inútil y el lanzamiento de este libro hará que la calidad de los desarrollos en PHP
sea aún peor. Así puedes contribuir a acabar con la decadente comunidad de PHP.

Ventajas:

• Podrás presumir de haber ayudado a acabar con PHP.

• Puedes aparecer en la lista oficial de "Haters" de PHP que se publicará en la web PHPSensei.

Condiciones:

• No se incluye el libro.

https://aliensvselephants.com/es#seccion-elephant-hater

39
Términos y definiciones
Meetup
La web meetup.com permite encontrar grupos de gente con gustos afines a los tuyos.

Las meetups (léase mitaps, mir-aps o como te de la gana) son reuniones de gente a las que la gente
va a conocer a otra gente gente, a presumir, a vender su moto o ligar.

40

También podría gustarte