Documentos de Académico
Documentos de Profesional
Documentos de Cultura
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.
https://aliensvselephants.com/es
1
Invasión
Los preparativos
Año 2022.
La tierra.
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 dejaron a éstos fuera de su punto de mira. Un error que pagarán muy caro.
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:
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.
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.
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.
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.
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.
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:
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.
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.
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.
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:
10
<?php
class ControlarRobot {
function girar_robot($angulo) {
...
}
function moverRobot($metros)
{
...
}
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');
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.
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ó.
$robot->cargararma('lanza-misiles', 'MK-10');
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:
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.
13
Se marchó de allí sin decir nada y les dejó discutiendo.
[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.
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:
Buscando PHP…
Buscando PHP…
Los aliens eran muy buenos viajando por el espacio, construyendo robots y conquistando planetas.
Pero, por lo demás, no parecían muy listos.
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!
girar_robot()
moverRobot()
cargarrarma()
usarMisilMk10()
¡Cada nombre usaba un formato diferente! Nunca le había importado pero, de pronto, aquello le
molestaba sobremanera.
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.
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.
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;
class Piernas {
public function moverrobot() {
/* Esto son puntos suspensivos para ahorrarme trabajo, no es algo de PHP */
}
}
class Armamento
{
public function escoger_arma($arma) {
...
}
20
Esto va mejorando pero todavía queda bastante.
<?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.
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;
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;
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.
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:
[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.
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ó.
É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.
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.
— ¡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.
— Perdona - oyó decir a sus espaldas - Eres la programadora que organizó la resistencia ¿verdad?
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.
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.
una entidad de software (clase, módulo, función, etc.) debe quedarse abierta
para su extensión, pero cerrada para su modificación.
¿Se preguntaron cómo puedes extender algo sin modificarlo? Mentes en blanco.
— ¿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.
Decidieron tomar la clase Armamento y ver cómo podían aplicarle este principio.
<?php
class Armamento
{
public function escoger_arma($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.
— María, me molesta lo visualmente confuso que es éste código ¿te importa que lo formatee bien?
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();
}
}
}
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.
26
<?php
class Armamento
{
public function escogerArma($arma)
{
$arma->escoger();
}
¡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.
<?php
class Robot {
private function $piernas;
private function $armamento;
27
<?php
class Misil {
public function escoger()
{
...
}
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?
Mario, asustado, se había escondido bajo la mesa. María estaba allí de pie, incapaz de moverse. El
robot apuntó hacia ella:
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.
¿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.
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.
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!
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?
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();
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();
}
Y para que un arma cumpla con ese interface tendría que implementarlo:
<?php
class Misil implements ArmaInterface {
public function escoger()
{
...
}
¡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.
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ó.
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.
— 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.
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;
}
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
Entonces María se preguntó ¿y por qué no añado los nuevos métodos de visión nocturna?
34
<?php
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.
<?php
class OjoInterface
{
public function capturarImagen();
}
<?php
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.
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.
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
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.
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:
¡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.
Su mente volvió a acelerarse. Su corazón se aceleró aún más. Y su cara recuperó el color.
— 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.
¡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?
Ventajas:
• 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.
https://aliensvselephants.com/es#seccion-elephant-lover
Elepant Haters
¿Quieres ver tu nombre en esta secció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:
• 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