Revisión de código, parte 3: creación y refactorización del generador de publicaciones

Índice
  1. La generación de publicaciones es solo una implementación.
    1. Resumen del generador de publicaciones
  2. Importar clases al espacio de nombres actuales
  3. Haga que el indexador del bucle nos diga qué representa
  4. El índice de matriz es innecesario y tiene un menor rendimiento.
    1. ¿Por qué es esta una mejor estrategia?
  5. Indicar a PHP dónde comienza y termina el código incrustado en una cadena
  6. El estilo y el formato del código son importantes.
    1. Eliminar paréntesis innecesarios de la instanciación posterior
    2. Tareas agrupadas alineales
  7. Vamos a repasar
  8. Vamos a discutirlo

En el último artículoTe guié a través de un proceso de revisión y refactorización de código para la FilterWPQueryclase enEl complemento de Josh PollockHicimos que su clase fuera más legible y tuviera mejor rendimiento, pero no cubrimos el código del generador de publicaciones en el getPosts()método; en cambio, déjé esa revisión para este artículo. ¿Por qué? Hay dos razones.

Primero, quería darnos tiempo para revisar a fondo esta sección del código. Hay varias áreas que podemos mejorar. Este código brinda una oportunidad de aprendizaje para mejorar su propio código a medida que profundizamos en el estilo del código, la importación de espacios de nombres PHP, el procesamiento de cadenas y más.

En segundo lugar, el diseño de esta clase y, en concreto, de este método se puede adaptar de forma flexible a las aplicaciones del mundo real. Josh señala que este complemento tiene finos educativos. Aprovechemos esta oportunidad para explorar el polimorfismo y cómo convertir este código en un controlador para implementaciones flexibles.

En este artículo, tú y yo haremos una revisión exhaustiva del código de generación de publicaciones. Luego, en la Parte 4 de esta serie, analizaremos en profundidad cómo hacer que esta clase sea más flexible.

Para refrescar tu memoria, este es el código generador de publicaciones iniciales:

?phpespacio de nombres CalderaLearnRestSearch;/** * Clase FilterWPQuery * * Cambia el objeto WP_Query durante las aplicaciones de API REST * * @paquete CalderaLearnRestSearch */La clase FilterWPQuery implementa FiltersPreWPQuery{ // Código omitido por razones de brevedad. /** @hereditardoc */función estática pública getPosts() : matriz{//Crea 4 publicaciones simuladas con títulos diferentes$Publicaciones simuladas = [];para ($i = 0; $i = 3; $i++) {$post = nuevo WP_Post((nuevo stdClass()));$post-post_title = "Publicación simulada $i";$post-filter = 'sin procesar';$mockPosts[$i] = $publicación;}//Devuelve una matriz simulada de publicaciones simuladasdevuelve $mockPosts;}}

La generación de publicaciones es solo una implementación.

Cuando lea el código anterior, observe el comentario en línea. ¿Por qué existe? Piénsalo.

Está ahí porque el código realmente genera publicaciones, aunque sean publicaciones simuladas. Es un generador, es decir, crea publicaciones y las devuelve. Es solo una implementación que es posible al filtrar publicaciones para una solicitud de búsqueda.

Josh diseñó el getPosts()método como un ejemplo arbitrario de generación de publicaciones simuladas como ejercicio de aprendizaje. Lo entiendo, pero como ejercicio de aprendizaje, podemos centrar nuestra atención en la intención de este método y comenzar a pensar en una aplicación en el mundo real.

Quiero que pienses en el alcance más amplio del manejo de una solicitud de búsqueda.

Al filtrar las publicaciones para una solicitud de búsqueda, probablemente necesitará realizar algún procesamiento, como buscar, ordenar, ensamblar o incluso generar. Este “procesamiento” depende de las necesidades de su proyecto y las reglas comerciales, así como de la solicitud de búsqueda específica en sí. Eso significa que necesitamos diferentes implementaciones para manejar cada uno de estos escenarios de solicitud a fin de enviar las publicaciones relevantes para la solicitud de búsqueda.

En el siguiente artículo, analizaremos en profundidad el concepto de diseño para diferentes implementaciones. Sin embargo, en este caso, coincidimos en que, al filtrar una solicitud de búsqueda, necesitamos la flexibilidad para gestionar diferentes reglas comerciales en nuestro proyecto.

¿Estás de acuerdo? Si no, hablemos de ello. Si es así, aceptamos que el getPosts()método debería poder gestionar distintas necesidades de filtrado de publicaciones.

El código que se encuentra dentro de este método es solo una implementación, es decir, una forma de manejar el filtrado de publicaciones. Su aplicación en el mundo real necesitará diferentes implementaciones, posiblemente múltiples escenarios en el mismo proyecto.

Por lo tanto, la tarea de generar publicaciones necesita su implementación propia. En nuestro diseño actual, eso significa abstraerlo en un método independiente. Al hacerlo, esto es lo que sucede:

  1. Eliminamos el comentario en línea ya que el nombre del método nos dice lo que está haciendo.
  2. Configuramos el getPosts()método para que sea flexible.

Vamos a refactorizar.

Resumen del generador de publicaciones

Vamos a crear un nuevo método privado llamado generatePosts(). El nombre de este método nos indica que generará publicaciones.

Dado que estamos creando un nuevo método, una mejor estrategia esCuéntalo¿Cuántas publicaciones quieres que cree para ti?

/** @hereditardoc */función estática pública getPosts() : matriz{devolver static::generatePosts(4);}/** * Genera una matriz de publicaciones simuladas. * * @param int $cantidad Número de publicaciones a generar. * * @return matriz */función estática privada generatePosts($cantidad) : matriz{$Publicaciones simuladas = [];para ($i = 0; $i $cantidad; $i++) {$post = nuevo WP_Post((nuevo stdClass ()));$post-post_title = "Publicación simulada $i";$post-filter = 'sin procesar';$mockPosts[$i] = $publicación;}devuelve $mockPosts;}

Importar clases al espacio de nombres actuales

PHP nos da la posibilidad de importar clases y funciones que se encuentran en un espacio de nombres diferentes. Si bien podríamos usar el espacio de nombres completo en nuestro código, esto hace que el código sea menos legible. Incluso cuando la clase se encuentra en el espacio de nombres global, la barra invertida distrae cuando leemos el código, ya que agrega otro carácter. Esto desordena el código.

Un mejor enfoque esimportar cada uno al espacio de nombres actualutilizando la palabra clave use. Al hacer esto, podemos usar la clase en cualquier lugar de nuestro espacio de nombres sin la barra invertida precedente.

?phpespacio de nombres CalderaLearnRestSearch;utilizar stdClass;utiliza WP_Post;// Código omitido por brevedad $post = nuevo WP_Post((nueva stdClass()));

Haga que el indexador del bucle nos diga qué representa

Todos sabemos que $irepresenta el valor actual del índice de un bucle. Es una convención de nombres comunes. Sin embargo, cuando se utiliza esa variable en el código, es mejor darle un nombre expresivo y descriptivo. te digo que valor representa dentro de su contexto dado.

Cuando lees $iel código del generador, ¿qué significa para ti? ¿El valor es el número del bucle?

No, aquí en este contexto representa el número de la publicación. Sí, es un indexador, pero como lo incluimos como parte del título de la publicación, nos indica el número de la publicación.

Entonces llamémoslo $postNumber:

para ($postNumber = 0; $postNumber $cantidad; $postNumber++) { $post = nuevo WP_Post((nueva stdClass())); $post-post_title = "Publicación simulada $postNumber"; $post-filter = 'sin procesar'; $mockPosts[$númeroDePublicación] = $publicación;}

El índice de matriz es innecesario y tiene un menor rendimiento.

En esta línea de código, no es necesario indicarle a PHP que crea la publicación en esta posición de índice:

$mockPosts[$postNumber] = $post;

¿Por qué?

¿En qué posición (clave) comienza una matriz indexada cuando se agregan elementos a la matriz? Cero. Las matrices indexadas comienzan en la posición 0.

Observe el código. ¿Cuál es el número de poste inicial, $postNumberen el bucle? Cero.

Luego, a medida que el bucle se repite, ¿qué sucede con el $postNumber? Se incrementa en uno.

¿Qué tal una matriz indexada? ¿Qué sucede cada vez que agregas otro elemento a la matriz de esta manera $array[] = $someValue;? Internamente, PHP incrementa hasta el siguiente índice para agregar el elemento.

¿Entiendes a dónde quiero llegar con esto? El bucle indexa la variable y PHP indexa la matriz. El índice de la matriz coincide con el índice del bucle.

Déjame ayudarte a visualizar lo que está pasando:

  1. Primer bucle: el bucle comienza y $postNumberes 0. El código crea una nueva publicación y la asigna al elemento 0 de la matriz.
  2. Próximo bucle: el bucle se incrementa $postNumberhasta 1. El código crea una nueva publicación y la asigna al elemento 1 de la matriz.
  3. Repite hasta que estés listo.

No es necesario indicarle que coloque la publicación en un punto de índice específico dentro de la matriz. ¿Por qué? PHP lo hace automáticamente para nosotros.

Por lo tanto, podemos refactorizar el código de la siguiente manera:

$mockPosts[] = $post;

¿Por qué es esta una mejor estrategia?

En primer lugar, hay menos código para leer, lo que significa que no tenemos que intentar averiguar si la matriz indexada podría estar desincronizada con el bucle.

En segundo lugar, es más rápido. ¿Por qué? PHP no tiene que buscar el valor asociado a esa variable antes de agregar el nuevo elemento de publicación. Es un paso menos que procesar.

Indicar a PHP dónde comienza y termina el código incrustado en una cadena

PHP necesita tu ayuda para identificar rápidamente la variable o el código que está incrustado dentro de una cadena. ¿Cómo lo haces? Envolviendo la variable (o el código) dentro de las llaves.

La llave de apertura le dice al analizador PHP: “Oye, este es el comienzo de una variable incrustada”. PHP sigue leyendo hasta que llega a la llave de cierre. Al usar las llaves, estás declarando que esta es una variable incrustada que necesita ser procesada para obtener el valor que se insertará en la cadena.

¿Por qué?

Imagina que el título tuviera otro carácter después de la variable. ¿Cómo sabría PHP que se trata de la variable $postNumbery no de la variable más el/los otro(s) carácter(es)?

El analizador es codicioso. Las cadenas están compuestas por diferentes caracteres alfanuméricos. ¿Cómo sabe PHP dónde empieza y dónde termina una variable o un código? Podemos ayudarle usando llaves para indicarle explícitamente nuestra intención.

Hay un beneficio adicional. Cuando tú y yo leemos esta cadena, el código encapsulado salta a la vista. Capta nuestra atención y nos alerta de que es necesario procesarlo.

$post-post_title = "Mock Post {$postNumber}";

Consejo de código: estándar usando esta técnica. Mantendrá la coherencia de su código y eliminará la necesidad de determinar si debe encapsularlo o no. Simplemente encapsulalo.

El estilo y el formato del código son importantes.

El estilo del código es un componente importante de la calidad y la legibilidad.

“El formato del código es importante… La funcionalidad que creas hoy tiene muchas posibilidades de cambiar en la próxima versión, pero la legibilidad de tu código tendrá un efecto profundo en todos los cambios que se realizarán en el futuro… Tu estilo y disciplina sobreviven, aunque tu código no lo haga”.

Robert C. Martín, Código limpio: un manual de desarrollo ágil de software

En nuestros estándares, definimos cómo se debe nombrar, construir y formatear nuestro código. Muchos de los editores e IDE que utilizamos se pueden configurar para permitirnos reformar automáticamente un archivo completo según nuestro estándar definido.

Hay varios elementos que deben limpiarse en nuestro nuevo método. Analicémoslos juntos.

Eliminar paréntesis innecesarios de la instanciación posterior

En este momento, el código tiene una paréntesis doble alrededor de la creación de un nuevo objeto estándar. Solo necesitamos un paréntesis.

También sugeriría agregar espacio dentro de los paréntesis para darle más énfasis al nuevo objeto.

$post = new WP_Post( new stdClass() );

Tareas agrupadas alineales

Alinear un grupo de tareas nos permite reconocer rápidamente que se trata de tareas. Nos llama la atención el signo igual, donde podemos separar el trabajo de la variable. Hace que el código sea más legible al comunicar: “Oye, todas estas son operaciones de asignación”.

Vamos a repasar

Aquí está nuestro método refactorizado para generar publicaciones:

función estática privada generatePosts($cantidad): matriz{$Publicaciones simuladas = [];para ($postNumber = 0; $postNumber $cantidad; $postNumber++) {$post = nuevo WP_Post( nueva stdClass() );$post-post_title = "Publicación simulada {$postNumber}";$post-filter = 'sin procesar';$mockPosts[] = $publicación;}devuelve $mockPosts;}

En este artículo hablaré de muchas cosas. Resumamos lo que hicimos e identifiquemos cómo mejora la legibilidad y/o el rendimiento del código:

La mejora Legibilidad Accionamiento
Se creó un nuevo método privado para el código del generador de publicaciones.
Importó las clases al espacio de nombres actuales.
Se cambió el nombre de la variable indexadora del bucle.
Se elimino el indexador de matriz
Envolvió la variable incrustada dentro de la cadena.
Se mejoró el estilo y el formato del código.

El código final y cada paso de refactorización están documentados en elSolicitud de extracción en GitHubTe invitamos a explorarlo.

Vamos a discutirlo

¿Qué opinas? ¿Tiene sentido cada una de estas mejoras para ti? No, en serio, quiero saber lo que piensas.

A partir del tutorial paso a paso, ¿ve cómo implementar cada una de estas estrategias en su propio código?

Espero poder hablar contigo sobre este proceso de revisión y refactorización. No dudes en hacerme cualquier pregunta y compartir tus opiniones en los comentarios a continuación.

SUSCRÍBETE A NUESTRO BOLETÍN 
No te pierdas de nuestro contenido ni de ninguna de nuestras guías para que puedas avanzar en los juegos que más te gustan.

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Subir

Este sitio web utiliza cookies para mejorar tu experiencia mientras navegas por él. Este sitio web utiliza cookies para mejorar tu experiencia de usuario. Al continuar navegando, aceptas su uso. Mas informacion