OOP Avanzado para WordPress Parte 7: El reflectorio es una oportunidad para adoptar el desarrollo basado en la prueba

Hasta ahora, en esta serie sobre la escritura de WordPress usando PHP orientado a objetos, me concentré principalmente en las pruebas. Esto se debe al hecho de que una ventaja clave del PHP orientado a objetos es que se puede escribir de una manera que sea extremadamente testible y muy reutilizable. Solo el uso de cursos no nos da esto mágicamente, no escribí ningún código que haga algo prácticamente útil. La idea es mostrar cómo personalizar la búsqueda a través de la API REST WordPress. El ejemplo de complemento, en el punto donde me detuve, devuelve solo una serie de wp_posts. Pero, la API pública para el sistema ahora está completamente desarrollada y tiene pruebas que describen su comportamiento correcto.
En mi viaje personal como desarrollador, a veces tomé las pruebas más en serio y menos en serio. Ahora mismo, estoy en “¡Prueba todas las cosas!” El camino y una de las razones por las que lo amo es la libertad de restaurar. Con el código desconocido, es difícil de restaurar, porque no sabe cuáles serán los efectos secundarios. Si bien escribir un código de prueba reduce los posibles efectos secundarios, el desarrollo basado en la prueba (TDD) lo ayuda a saber cuáles son los efectos de un cambio. La transición a TDD no es fácil, pero descubrí que se puede adoptar progresivamente en las bases de código existentes. Por lo tanto, este artículo comienza parte de esto en progreso centrado en las pruebas basadas en la prueba.
Al revisar el código antes de continuar cuando comencé esta serie, Tonya Mork de conocer el código contactado y ofreció una revisión del primer código del artículo. Ella escribió elementos de revisión de código, que espero que disfrutes tanto como yo. El Código de Código de este artículo realmente comienza en la solicitud de extracción que Tonya agregó para ir con su artículo “Diseñando implementaciones de solicitudes de búsqueda intercambiables”. Estuve de acuerdo con su revisión y acepté los cambios, luego discutí otros cambios. Los comentarios en la solicitud de extracción son esencialmente un bosquejo bruto de este artículo y el siguiente de esta serie. Puede leer nuestro proceso de hacer muchos cambios en el código y por qué. Para mí, creo que es increíblemente útil escribir todo sobre un problema y responder preguntas al respecto. Esa es la revisión del código. Lo recomiendo que lo presente en su empresa y/o entre sus amigos. ¿Cuál es la intención? Una cosa sobre el ejemplo del código con el que trabajamos es que ha comenzado de manera bastante artificial, al final es un ejemplo del código. Pero, lentamente, lo hacemos útil, porque es más divertido. Como resultado, la interfaz que Tonya definió para los objetos que actuarían como “nuestro contenido de contenido”, el sistema que realmente recibió contenido de la base de datos o API, no hizo las preguntas correctas al mundo exterior.
Tonya resumió nuestra conversación aquí, decidimos pasar por WP_QUEY y WP_REST_REQUEST, que estos objetos han expresado la intención de la solicitud HTTP para cumplir nuestro código; queremos consultas a rutas de tipo neto, como / wp / v2 / publicaciones para ser más útil para buscar en ciertos tipos de publicaciones. Por más útil, nos referimos a diferentes tipos de WP_Query o resultados generados con un sistema diferente. Planificación de las interfaces como pegamento Entré en este pensamiento, pensando que mi objetivo era tener una fábrica que conecta todo y demostrar cómo usar las pruebas para demostrar que no he roto nada. Esto implicó la creación de interfaces para todos mis objetos, para que pueda crear fábricas comprobables y luego actualizar la interfaz existente, para que todo pueda conectarse juntos. Tendré dos o tres sistemas que funcionan aislados y luego tendré problemas con su ensamblaje. Agregar nuevas interfaces para ModifysChema que cambia el esquema y el punto final de ModifyQueryargs que cambia el WP_Query Arg fue mi primer paso para pegar todo. A partir de ahí, me permitió definir la forma de la forma en que se conectarán más tarde. Ninguna de estas clases tenía una interfaz. Ambos tienen un método ShoulledFilter (), pero tienen diferentes firmas. FiltersPrewpQuery también tenía un ShoUlledFilter (), diferente firma y está estática. Me olió mal.

Dado que tuve que conectar un número arbitrario de implementaciones, supuse que tendría que descansar _ {$ post_type} _collection_params y REST _ {$ post_type} _Query para cada tipo de publicación. De hecho, recibí esta idea cuando estaba buscando esos ganchos en mi entorno local de WordPress. Estaba tratando de encontrar esos ganchos en la API REST y encontré dónde los usa Gutenberg en lugar de Gutenberg está cubierto en ambos filtros, necesitamos trabajar con REST _ {$ post_type} _Collection_Params y REST _ {$ post_type} _Query aquí. La mía fue hacer el filtrado lo más mágico posible, porque es repetitivo. De hecho, comencé con una interfaz que la necesitaba y luego eliminé este requisito mientras implementaba una fábrica para administrar más pegado.
Comencemos con la recuperación de la clase que da forma al esquema API. El primer paso es agregar una interfaz. Al hacer esto, estaremos preparados para transformar esta clase en la clase que modifica los esquemas de ruta API y lo convertirá en una implementación cambiante de una clase que cambia el esquema de ruta API. Diseñar una interfaz antes de una implementación concreta, si es posible, puede evitar la necesidad de hacer el tipo de restauración a través del cual estoy a punto de ir. Pero a menudo es más práctico construir la primera implementación sin las restricciones de una interfaz y luego, una vez que funciona, para diseñar la interfaz. A veces, cuando empiezo con una interfaz, me despertaré con dificultad para conformar mi implementación concreta a una interfaz y dedicaré demasiado tiempo tratando de que funcione antes de darme cuenta de que el contrato que establecí estaba mal.
A menudo nos referimos a las interfaces como “contratos”, porque definen cómo una clase debe actuar en relación con el resto del programa. Una vez que participamos en el contrato, seguimos atrapados con él. Inventar un contrato que nos haga fallar es malo en los negocios y la programación. Mi primer paso cuando creo una interfaz para una clase existente es agregar una interfaz vacía y poner la clase inicial para implementarla:
Después de eso, pueden copiar las firmas del método y los documentos en línea en la interfaz. Una idea que conoce las interfaces, uso PhpStorm ayuda mucho en este proceso, ya que resaltará los conflictos de firma del método a medida que parecen.
Aquí está ModifysChema antes de comenzar a restaurar:
Dije antes, mi objetivo era hacer que el método FiltersChema no fuera necesario. Aunque mi primer pensamiento fue hacer que la interfaz tenga FiltersChema () y debería Filter (), porque esto debe estar expuesto públicamente. Pero quería hacer FiltersChema para desaparecer, así que pensé en qué información debería comunicar esta clase:

Los argumentos adicionales del esquema

Si se deben agregar o no los argumentos adicionales del esquema o no.
Basado en esa lista, deberíafilter () tiene sentido, pero FiltersChema () No. También se dice que el primer paso es extraer el rango de argumentos para agregarlos y hacerlos accesibles al público. Aquí está el comienzo de la interfaz:
Este nuevo método getAdditionsChemarguses () es getAdditionalShecheMarguses () tipo para devolver una matriz.Podemos usarlo más tarde para obtener una serie de argumentos de esquema.La clase original no tiene un getAdditionschemarguses ().Tiene una serie de argumentos, pero actualmente se definen en FiltersChema (), que no es lo que FiltersChema () debería ser responsable, es una segunda responsabilidad.Eso huele mal.Resuelvamos esto, asegurándonos de que cada método haga una cosa: lo que dice el nombre del método. En esta nueva versión tenemos FiltersChema () pero todo lo que hace es lidiar con el filtrado del esquema.Los datos son proporcionados por el nuevo getAdditionalShechearGuments ().Los tres métodos fueron reemplazados por los documentos en línea con una anotación @inheritdoc.Eso es porque todos están presentes en la interfaz.
Al contar la historia ahora, es cuestionable si valió la pena agregar FiltersChema () a la interfaz, sabiendo que valdré la pena. Tuve que restaurar mi burla de la prueba para cumplir con esta interfaz. Una vez que se usa una interfaz en el mundo real, su cambio es un cambio en la compatibilidad inversa. Los cambios en la firma de la interfaz tienen lugar en las principales actualizaciones de la versión de Laravel. Debe cambiar sus implementaciones concretas para que coincidan o la actualización, causen errores fatales. En nuestro caso, ninguno de estos es un código de producción. No solo porque es un código educativo, sino porque aún no se hace. Tendremos que hacer algunos cambios en el camino y de todos modos hace una buena historia. Aquí está el compromiso en el que creé esta interfaz. También tenemos una clase ModifyQueryargs que es responsable de agregar argumentos WP_Query a la lista blanca de los argumentos de interrogación permitidos para el resto. Aquí se implementa para agregar un argumento “post_type” a la lista permitida: con esta clase, siento el mismo problema que el último, no se comunica con lo que cambiará la lista blanca. Antes de que podamos hacer desaparecer el método FilterQueryargs (), necesitamos un método para comunicar lo que se agrega al filtro. Esta vez, un método getAdditionQueryarguces () puede comunicar que:
Mi primer paso de restaurar la clase original fue hacer que coincida con esta interfaz, que sigue siendo FilterQueryargs ().
Esta es la segunda interfaz que necesitamos para comenzar a ajustar. Puede ver el compromiso para la nueva interfaz aquí. Hacer las piezas correctas que Tonya y yo usamos la metáfora “pegando juntos” para describir este proceso. Puede que haya visto que se ensamblan recientemente demasiados muebles porque me acabo de mover, pero este proceso se siente como modelar los extremos de un plato, de modo que encajen perfectamente. Acabo de pasar por el paso para que el plato coincida de la forma en que creo que tendrá que encajar. El siguiente paso es una fábrica con la que debe coincidir correctamente. Hice todo lo posible para imaginar lo que necesita, una vez que jugamos con las metáforas, vale la pena mencionar que una de las ventajas de Laravel es que su contenedor de servicio ofrece inyección automática de adicciones para transferir automáticamente las adicciones a las clases. Por ejemplo, en WordPress, si tengo una ruta REST API, que tiene que acceder a un usuario, uso get_user_by () o un nuevo wp_user, dentro del método de devolución de llamada. En Laravel, haría que el modelo de usuario sea un argumento de la llamada inversa del controlador y, según su tipo de indicación, Laravel se encargaría de un modelo de usuario en mi llamada. Al transferir esta responsabilidad de proporcionar adicción al contenedor de servicio, llamamos a esta inversión del control, hace que el intercambio de implementaciones concretas, por ejemplo, el uso de simuladores de prueba sea mucho más simple. Tonya tiene una muy buena serie sobre cómo burlar los objetos en WordPress.

Copyright statement: Unless otherwise noted, this article is Collected from the Internet, please keep the source of the article when reprinting.

Check Also

gkOVSBm5B8SgiXmo

Shopify vs WooCommerce – ¿Cuál es la mejor plataforma?(Comparación)

Shopify vs WooCommerce

Leave a Reply

Your email address will not be published. Required fields are marked *