Incomprehensible Finder Kata en PHP - Colecciones y funcional 位

Un tiempecillo atr谩s vimos vimos c贸mo encarar esta kata en PHP y tambi茅n c贸mo resolverla utilizando Scala. Hoy vamos a demostrar que con PHP tambi茅n se pueden hacer cosillas funcionales y que encima hacen que nuestro c贸digo quede bastante m谩s cohesionado, inmutable, guay, y simple! 馃槑 Recordad que tenemos publicado el repositorio con las soluciones que hicimos en el evento de la Software Craftsmanship Barcelona, las Pull Request son bienvenidas! En esta iteraci贸n os presentamos las colecciones (y vemos cu谩ndo y por qu茅 nos son 煤tiles) y tambi茅n haremos nuestros primeros pinitos en la programaci贸n funcional haciendo uso de una librer铆a con un nombre muy original: phunctional. Os recordamos que la kata trata sobre refactorizar un c贸digo ya existente y con una base de test, pero que no hay quien lo entienda. 馃檪

Colecciones

Las colecciones son un concepto simple y que hemos hecho toda la vida sin saber c贸mo se llamaban 馃槆. Una colecci贸n no viene a ser nada m谩s que un array de un mismo tipo de objeto que nos sirve para cohesionar la l贸gica que le pertenece. Imaginaos que queremos obtener todos los usuarios nacidos despu茅s del 1950 de un listado de usuarios. Tradicionalmente lo hubi茅semos hecho tal que as铆: https://gist.github.com/rgomezcasas/5ee2dd520762c5acd53c622e40459d67#file-someusage-php Quiz谩s estamos acostumbrados a hacerlo as铆 de toda la vida y jam谩s nos hemos parado a pensar en la de problemas que esto nos acarrea. Algunos de los problemas, entre otros, que nos pueden aparecer:

  • Duplicidad de c贸digo: Si dos puntos de nuestra aplicaci贸n necesitan la misma l贸gica la estemos copiando y pegando.
  • Ofuscaci贸n de funcionalidad: No sabemos de simple vista qu茅 operaciones estamos realizando sobre los conjuntos de usuarios (falta de cohesi贸n).
  • Facilidad a que se cuelen errores en el c贸digo: Imaginaos que alguien sin querer mete un Product en lugar de un User. Empezar铆amos a reventar en el momento que se llamase a un m茅todo que existe en User y no en Product (PHP FTW 馃).
  • Responsabilidad lejos de su dominio: Tenemos la l贸gica de gesti贸n de usuarios en servicios externos en lugar de, al igual que hacemos con los Value Objects, cerca de donde sucede la acci贸n (nuevamente, cohesi贸n).

Pero todo esto tiene una soluci贸n muy simple: El uso de Colecciones. Recordemos, una colecci贸n es una clase que contiene un array de un mismo tipo de objeto, y tiene la l贸gica encargada de gestionarla all铆 dentro. Un ejemplo de colecci贸n para usuarios podr铆a ser: https://gist.github.com/rgomezcasas/5ee2dd520762c5acd53c622e40459d67#file-users-php Aqu铆 vemos algunas cositas nuevas, entre ellas el CodelyTip del d铆a: Los variadic arguments. Este (User 鈥$users) viene a ser el equivalente a "todos los argumentos que me pases me los metes en un array llamado $users", por lo tanto, al ejecutar new Users(new User(1999), new User(1800), new User(1337)) estamos creando un array llamado $users que contiene esos usuarios que hemos creado (fijaos que hemos pasado los par谩metros como diferentes argumentos, no hemos enviado en ning煤n momento un array). Otra cosita que vemos que nos puede confundir es el type hinting que hay de User delante de los tres puntitos, esto significa que todos los argumentos que recibimos han de ser de tipo User. Con esto tenemos nuestro array asegur谩ndonos que siempre nos pasan usuarios y no otra cosa de por medio 馃挭. Gracias a esto ahora podemos obtener todos los usuarios aplicando una determinada l贸gica de una manera m谩s simple, encapsulada y c贸moda.

Funcional

Si volvemos al ejemplo anterior: https://gist.github.com/rgomezcasas/5ee2dd520762c5acd53c622e40459d67#file-users-php Podemos ver que el m茅todo bornAfter tiene una complejidad ciclom谩tica muy alta. Vamos, que tenemos una asignaci贸n dentro de una condici贸n, que a su ves est谩 dentro de un bucle. Esto hace que nuestro c贸digo no quede nada simple y que cueste m谩s de entender. Una de las manera de ayudar a mejorar esto es traernos uno de las principios ampliamente extendidos en programaci贸n funcional: La inmutabilidad. Lo que promueve la inmutabilidad es evitar ir modificando el estado (una vez ya has asignado un valor a una variable, no la vuelves a reasignar). En este caso, la funci贸n que m谩s bien nos ir铆a ser铆a el filter, una funci贸n que recibe un array y te devuelve otro aplicando un filtro (el nombre hace juicio a su funci贸n 馃槵). Utiliz谩ndola nuestro c贸digo quedar铆a: https://gist.github.com/rgomezcasas/5ee2dd520762c5acd53c622e40459d67#file-users-filter-php Un c贸digo mucho m谩s simple (que no f谩cil, sobretodo si no est谩s acostumbrado), pero que se lee mucho mejor. Adem谩s, nos puede ser 煤til ir adoptando este tipo de pr谩cticas si queremos transicionar a un lenguaje de programaci贸n funcional como Scala. Si es el caso, 隆no te pierdas el v铆deo de introducci贸n a Scala! Si has disfrutado de esta kata y ves margen de mejora, agradecer铆amos infinito que lo compartieras a trav茅s de un comentario en el v铆deo, Twitter, o incluso, una PR al repo 馃殌馃

Individuos

24,91鈧/ mes 路 pago anual299鈧 al a帽o
  • 馃捇Acceso a todos los cursos
  • 馃弲Contenido de calidad
  • 馃鈥嶐煆Profesionales con amplia experiencia
  • 馃殌Nuevo contenido cada semana
  • 馃鈥嶐煠濃嶐煣Acceso a la comunidad CodelyTV
  • 馃鈥嶐煄Certificados al completar cursos
  • 馃捀12 meses por el precio de 10
SIN PERMANENCIA M脥NIMASuscr铆bete

Empresas

驴Crees que puede interesar a m谩s miembros del equipo?

  • 馃捀Descuento de hasta un 40%
  • Gesti贸n centralizada de cuentas
  • 馃鈥嶐煆Profesionales con amplia experiencia
  • 馃捈Facturas a nombre de empresa
  • 馃搱Reportes y anal铆tica