Reemplazar bucles básicos por las funciones nativas de arrays en PHP

En este post voy a hablar acerca de mejorar la complejidad ciclomática. Reducir el uso de bucles básicos y reemplazarlos en la medida de lo posible por las funciones nativas de arrays de PHP.

Además, pondré unos ejemplos de qué tipo de instrucciones y bucles pueden ser sustituidas por las funciones básicas.

Complejidad ciclomática

La Complejidad Ciclomática (en inglés, Cyclomatic Complexity) es una métrica del software en ingeniería del software que proporciona una medición cuantitativa de la complejidad lógica de un programa.

La complejidad ciclomática es una de las métricas de software de mayor aceptación, ya que ha sido concebida para ser independiente del lenguaje.

Esta métrica mide el número de flujos distintos de ejecución que puede tener el código de un programa de software. En resumen, nos dice cuantos ifs-then-elsewhileforswitch…etc, tenemos en nuestro código.

Funciones array nativas de PHP

Hay muchas funciones array nativas, que al ser nativas mejoran la eficiencia. El uso de las funciones nativas está sobradamente comprobado, además de mejorar su eficiencia con cada nueva versión de PHP.

La costumbre, nos lleva a crear más loops de los que necesitamos, muchas veces por desconocimiento de las propias funciones nativas. Usar las funciones nativas podrían hacer nuestro código más claro y más legible de una manera sencilla.

Indexar datos según una columna usando array_column

Un código que he visto en distintas compañías y distintos proyectos para recibir datos de la base de datos y devolverlo en un array indexado por id. Es un código muy común y que seguro que se repite en casi todos los proyectos web y PHP.

Os voy a poner un pequeño ejemplo. Indexar datos según una columna del conjunto de datos. En el ejemplo siguiente, vamos a ordenar los datos recibidos en un array, según el ID.

Podemos ver básicamente, como lo que obtenemos es un array ordenado por el id de los datos del array inicial. Para llegar a este resultado, hemos creado un array auxiliar para guardar los datos, así como el bucle para añadirlos.

Bien, el código anterior puede ser sustituido por la función nativa array_column con lo que sabiendo lo que hace la función quedaría el código así.

A la función nativa se le pasan 3 parámetros:

  • 1: El array que contiene la información que queremos procesar.
  • 2: El valor del nuevo array a generar. Puede ser el índice de la columna a extraer datos, o un string con la clave o propiedad que queremos recuperar o NULL en caso de querer que nos devuelva el elemento entero del array.
  • 3: El índice del nuevo array a generar, puede ser nulo.Este valor podría ser la clave de tipo integer de la columna, o podría ser el nombre de la clave de tipo string.

A continuación os dejo el ejemplo del código equivalente al foreach superior.

Array_column también funciona para un array de objetos.

Otros ejemplos de uso de array_column

Hasta ahora los ejemplos han sido para devolver el objeto completo indexado. Y si ahora necesitamos solamente, una propiedad de los objetos. Vamos a suponer que solo necesitamos saber el id de los datos. En ese caso, sería aún más intuitivo.

O finalmente, otro uso, queremos un array donde el id sea la clave y el nombre el valor.

Filtrar datos usando array_filter

Usar array_filter es una buena práctica para hacer un filtro de datos. Un ejemplo va a ser el siguiente.

Vemos que ambos resultados son lo mismo. Pero en tema de legibilidad, limpieza y comprensión de código usar la función nativa es bastante más intuitivo.

Resumen

Bien, pues este ha sido otro post más. Espero seguir con esta constancia y seguir compartiendo información útil. El intentar hacer un código limpio y fácil de entender, es bueno tanto para nosotros, como para la mantenibilidad del proyecto.

Reducir complejidad y facilitar la capacidad de tests del proyecto, será siempre bueno a la larga. Y el desarrollo de código limpio, poniendo un poco de atención y refactorizando en la medida de lo posible nos hará cada vez más acostumbrados a usar buenas prácticas.

Esto ha sido todo por hoy.

Enlaces y referencias

https://es.wikipedia.org/wiki/Complejidad_ciclom%C3%A1tica

https://www.php.net/manual/es/function.array-column.php

https://www.php.net/manual/es/function.array-filter.php

Comparte 🙂

Si te ha gustado el contenido de este artículo no te olvides de compartirlo ya que con eso me harías muy feliz. GRACIAS 😉

Participa 😉

Además de todo ello, si tienes dudas o puedes aportar algo con un comentario, no dudes en hacerlo. GRACIAS 😉

Resumen 2020

Pues comenzamos el 2021 con un resumen del 2020. Escribiendo una entrada en el blog después de mucho tiempo. Lo cual, espero hacer más a menudo.

Personalmente, digamos que ha sido un año de crecimiento profesional. 2020 empezó fuerte y con muchas ganas e ilusiones. Adquiriendo más responsabilidades y nuevos proyectos.

Pero poco a poco el año fue en caída libre, y también puedo decir y aunque parezca contradictorio, también ha sido un año de estancamiento. Tenía muchas ganas de adquirir conocimiento en distintos lenguajes y empezar un par de proyectos personales que no pudieron llevarse a cabo.

También tenía en mente darle un cambio visual a este blog. Añadir nuevo contenido de manera más regular al blog. Aparte de esto, también quería aprender más sobre SEO y adentrarme más profundamente en este tema. Lo cual también podría usarlo para nuevo contenido de calidad en el blog.

Siempre, cuando un nuevo año empieza, aparecen nuevas metas y propósitos para el nuevo año que entra. Lo cual, lo expondré más adelante lo que espero para el 2021. Pero ya adelanto que estará bastante relacionado con lo que he expuesto en el párrafo anterior.

Tras esta pequeña introducción, vamos a meternos en el resumen del 2020 de cabeza.

Actividad laboral del 2020

Comencemos por el principio. 2020 ha sido un año de crecimiento laboral. He mejorado en la abstracción y en el análisis de los problemas. No solo eso, la calidad del código también la he mejorado en una manera sustancial.

El liderazgo en un par de proyectos sobre los que he tenido la máxima responsabilidad ha ayudado a ello. Esto, me ha obligado a estar más pendiente y a focalizar no solo en solucionar el problema que tenía. También debería de hacerlo de la mejor manera posible.

Sistema de notificaciones en tiempo real (Real Time Updates)

En este proyecto, hemos tenido que desarrollar un sistema de notificaciones en tiempo real. Gestionando múltiples colas, usando RabbitMQ y SQS. Además, diferentes bases de datos, tanto relacionales como MySQL como bases de datos no relacionales como Redis.

Elegir la arquitectura del sistema para alcanzar la solución más eficiente, fue uno de los retos más complicados, ya que al ser una integración de varios sistemas y múltiples conexiones entre ellos la eficiencia y la eficacia era algo primordial. También, había que convencer a los managers, de que era la mejor solución. No fue fácil, pero finalmente, después de varias pruebas y demostraciones de que era la solución perfecta para el problema que teníamos que resolver.

En la planificación inicial, cometimos errores debido a la falta de requisitos claros y concisos, así como los distintos cambios de los mismos durante el desarrollo. Los hemos ido depurando hasta obtener un sistema de notificación en tiempo real fácil de expandir para añadir nuevos sistemas, con gran reutilización de código, un código limpio, entendible y siguiendo patrones de diseño.

Con bastante imaginación en el código se ha logrado un sistema de notificaciones donde, desde el inicio de la acción hasta que todos los distintos sistemas son notificados, pasando por las distintas colas de procesamiento y procesando y adaptando la información al formato de cada uno de los sistemas, se logra en apenas 2-3 segundos lo cual es fantástico.

Para terminar con este tema, he de decir, que he aprendido mucho. Ya que las notificaciones en tiempo real hoy día es algo en auge. Crear tu propio sistema te da una visión profunda de la complejidad que ello supone. Comprobar la capacidad de estar a cargo y ver que he sido capaz de hacerlo me ha dado un plus de seguridad en mí mismo.

Nuevos endpoints y helpers para el sistema

Otro de los desarrollos más importantes de este año ha sido la generación de nuevos endpoints para la API del sistema. La reorganización de la estructura de ficheros para ordenar el código.

Anteriormente, se usaba un fichero donde se le añadían los métodos de la API, esto nos iba dando lugar a ficheros enormes de +10K líneas y no era mantenible. Se ha optado por la reestructuración y tener un nuevo fichero por cada función que gestiona los nuevos endpoints.

Por otro lado, había distintas funciones que se repetían en el código. Tras estudiar el código existente y hacer un análisis de código y ver cómo se podría mejorar. Llegamos a la conclusión de crear helpers o librerías internas auxiliares.

Tener en un único lugar ese código que está repetido varias veces en nuestro proyecto. Nos va a aportar algunos beneficios:

  • Código único para esa funcionalidad única
  • Reutilización
  • Limpieza de código

El empezar a reemplazar el antiguo código por los nuevos helpers. De esa manera, tenemos centralizado el código. Un pequeño ejemplo de utilidad será el siguiente:
A la hora de actualizar/arreglar un bug en una función para leer una variable. Solventar el error en el helper, implicaría arreglarlo en todos los lugares donde se utiliza. Lo cual ya nos ahorraría, tener que revisar el código y ver dónde hacemos ese código y tener que solventarlo X veces según las veces que estuviera repetido.

Por lo tanto, es una mejora muy importante. Nos permite reutilizar código, nos da más velocidad de desarrollo y a la hora de arreglar fallos también nos ayuda.

Otras cosas

Bueno, para finalizar con el tema del 2020.Estos han sido una de las cosas que veo que han sido más productivas y más nos han ayudado en tema de desarrollo de código.

Pero el tener el liderazgo del desarrollo, también me ha obligado a planificar. Evidentemente, he cometido errores y he aprendido de los mismos. A mejorar las estimaciones también he aprendido. A ser una figura de referencia para otros compañeros, y tener que el faro que los ha estado guiando para ciertos desarrollos, también ha aumentado mi seguridad en mí mismo.

Con eso he abarcado el crecimiento profesional durante 2020, lo cual puedo decir que ha sido bastante bueno.

Por otro lado, había bastantes cosas que se me han quedado en el tintero. Como ya comenté al principio, me gustaría haber empezado a crear código en otros lenguajes de programación. Tenía en mente sobre todo Python y NodeJS.

Además, de adquirir nuevo conocimiento SEO y de marketing online, porque quería darle una vuelta al blog.

Así, que con esto vamos a dejar atrás 2020 y vamos de lleno a lo que tengo en mente para 2021.

Planes para el 2021

Primero de todo, aquí estoy escribiendo una nueva entrada, después de bastante tiempo sin hacerlo. Quiero empezar a publicar asiduamente, al menos 2 veces al mes.

El sitio, en principio no está muy mal. Pero aún así quiero darle un cambio visual. Desarrollar un nuevo tema visual y que se acuerde a los nuevos standard, y actualizar cierta información que no está del todo fina.
También, dentro de ese proceso de cambio, trataré de mejorar su posicionamiento y de añadir más SEO.

También, adquirí recientemente varios cursos de Python y NodeJS como comenté anteriormente. Quiero hacer pequeños proyectos y ver cómo se trabaja en esos lenguajes. Tras 5 años usando PHP como lenguaje principal y Laravel como framework. Creo que debería de conocer otros lenguajes y ver las posibilidades que me pueden ofrecer.

También, y esto es un aspecto más personal que profesional. Tengo un par de proyectos que tengo que terminar, así como esforzarme en mi liderazgo. Ser más claro y conciso con los objetivos que tengo que realizar y dedicar cierto tiempo a mi crecimiento personal.

Con esto creo que la entrada está completa.

Gracias por haber llegado hasta el final.

Comparte 🙂

Si te ha gustado el contenido de este artículo, no te olvides de compartirlo con eso me harías muy feliz. GRACIAS 😉

Participa 😉

Además de todo ello, si tienes dudas, sugerencias o algo que me quieras comentar, añade un comentario, no dudes en hacerlo. GRACIAS 😉

Chuletario de GIT

¡ Hola a todos ! Aquí estamos con una nueva entrada, en este caso se trata de un chuletario de GIT que me es muy útil en mi día a día. Así también me sirve para apuntar mis atajos de GIT para la consola.

Actualmente, estoy usando la consola git bash en windows, además de usar el código a través de algunas máquinas vagrant y entornos de docket.

En esta consola, el fichero .bashrc se encuentra en la carpeta del de usuario dentro del disco con la instalación de Windows, sería algo como «C:\Users\Juanra» en mi caso. Dentro de este fichero, podemos añadir nuestros alias o atajos que nos facilitaran el uso de GIT diariamente y nos ahorrará algo de tiempo que siempre viene bien.

Voy a comenzar poniendo algunos de los comandos que más uso normalmente y los alias que uso para ellos:

Cambio de rama

Comando de git: git checkout branch

Alias: gco branch

Descargar código rémoto (hacer un pull)

Comando de git: git pull

Alias: gp

Crear una rama y moverse a ella

Comando de git: git checkout -b new_branch_name

Alias: gcb new_branch_name

Subir el código de la rama actual

Comando de git: git push origin branch

alias: gpush

Subir el código de una rama nueva en local y hacer el trackeo

comando de git: git push -u origin $(current_branch)

alias: gpusht

Subir el código haciendo un force para sustituir el código remoto por el local

comando de git: git push origin $(current_branch) -f

alias: gpushf

Ver las ramas locales

comando de git: git branch

alias: gb

Ver todas las ramas locales y remotas

comando de git: git branch -a

alias: gba

Hacer un commit

comando de git: git commit -v

alias: gc

Hacer un commit con mensaje

comando de git: git commit -m ‘mensaje’

alias: gcmsg ‘mensaje’

Añadir código encima del commit (amend)

comando de git: git commit -v –amend

alias: gc!

Fichero .bashrc para descargar

Puedes echarle un vistazo al fichero con los alias que tengo para git en el enlace a continuación.

https://github.com/jrgm0005/bash_rc/blob/master/.bashrc

Pues esto ha sido todo por ahora respecto a la utilidad de los alias y su ayuda a mejorar el rendimiento en el día a día, todo basado en mi experiencia personal.

Espero que os sirva y ayude a mejorar vuestra productividad. Si tenéis dudas o cualquier comentario, no tengáis dudas en escribir.

Comparte 🙂

Si te ha gustado el contenido de este artículo, no te olvides de compartirlo con eso me harías muy feliz. GRACIAS 😉

Participa 😉

Además de todo ello, si tienes dudas o puedes aportar algo con un comentario, no dudes en hacerlo. GRACIAS 😉

Errores que hice como programador junior

Aquí estoy de nuevo con una nueva entrada en el blog, para hablar acerca de los errores que hice como programador junior cuando empecé a trabajar y que algunos de ellos aún sigo cometiendo, a pesar de trabajar en hábitos para mejorar mi manera de llevar a cabo mi trabajo como programador.

Antes de nada, me gustaría aclarar una cosa, para programadores principiantes. Este artículo no es una guía de cómo se debería de hacer ni hacerte sentir que no estás haciendo bien tu trabajo. Simplemente me gustaría enseñarte los fallos que cometí y enseñarte cómo detectar algunos de ellos y algunos pasos para evitarlos.

Yo mismo he cometido estos errores y he aprendido, o he tratado de aprender, de cada uno de ellos. He trabajado duro para formar hábitos de programación para ayudarme a evitarlos en lo máximo posible y te voy a dar algunos consejos para que tú lo hagas también.

A continuación voy a comenzar con ellos …

seguir leyendo →