Post Top Ad

Your Ad Spot

domingo, 4 de octubre de 2020

El mayor problema con los accesos elocuentes "mágicos"

 Lo confieso: durante cinco años de trabajo con Laravel, me ha fascinado su "magia" y lo poco que se necesita código para que las cosas funcionen. Pero recientemente, a medida que mis proyectos crecieron en tamaño, esa "magia" comenzó a convertirse en un problema. Uno de los ejemplos típicos es el de los accesores elocuentes , por lo que en este artículo presentaré un argumento en contra de su uso y qué hacer en su lugar.


Cómo funcionan los accesorios y por qué son geniales

Recordemos cómo funcionan los accesos. Imagine que en la tabla de la base de datos de usuarios tiene columnas con nombre y apellido , pero en su tabla desea verlas como una, como nombre completo . Pero no desea hacer esa concatenación de cadenas cada vez, ¡por lo que los descriptores de acceso son una gran solución!

Simplemente defina esto en app / User.php :

public function getFullNameAttribute()
{
    return $this->name . ' ' . $this->surname;
}

Y luego, siempre que tenga el objeto $ user , puede escribir esto, por ejemplo, en Blade:

{{ $user->full_name }}

Eloquent se encargará de llamar a este método, convirtiendo también full_name snake case en getFullNameAttribute camel case. Magia, ¿no?


Problema 1: ¿Qué es este campo?

Los problemas comienzan generalmente en proyectos y equipos más grandes, cuando otra persona se hace cargo del código.

Por ejemplo, cuando tiene muchos campos enumerados en la tabla, o en otro lugar, y obviamente no ve que cierto campo es un descriptor de acceso. Por ejemplo, si ve $ user-> full_name y $ user-> home_address cerca, alguien probablemente esperaría que ambas sean columnas de base de datos, ¿verdad?

Por lo tanto, los accesores perjudican la legibilidad del código. Se pone aún peor si un desarrollador junior (o alguien menos familiarizado con Laravel) trabaja en esta parte del código; puede llevarle mucho tiempo entender por qué este campo no existe en la base de datos, y es posible que dedique minutos / horas investigando las migraciones pasadas, buscando la columna full_name .

Además, estos campos no son "seleccionables" en su IDE, por lo que no es fácil encontrar lo que realmente esconde ese método. Debe buscar en todo el proyecto (o archivo de modelo) "getFullName" en su IDE como PhpStorm.


Problema 2: Los accesos más grandes pueden "ocultar" errores

Aquí tenemos un ejemplo simple de concatenación de cadenas. Pero con bastante frecuencia veo a los descriptores de acceso como métodos de cálculo completos con más de 20 líneas de lógica de código.

Imagínese que este nombre_completo tendría una lógica más grande de nombres internacionales - en algunos países hay tres partes de nombres, también puede incluir “Sr. / Sra. / Ms”, iniciales, letras minúsculas / mayúsculas y mucho más. Si bien todavía funciona, existe una buena posibilidad de errores en esa gran lógica.

Y es bastante raro que alguien escriba pruebas automáticas para los accesores . Si observa desde el punto de vista de la estructura del código , cálculos tan grandes deberían ser algún tipo de clase de servicio , que sería más fácil de probar mediante pruebas unitarias.


Solución: simplemente use métodos "Getter"

Entonces, ¿qué hacer para evitar demasiada "magia"? Simple: simplemente use métodos como métodos, sin convertirlos a nada.

Entonces, en lugar de {{$ user-> full_name}} en Blade, ¿no sería más legible tener esto? {{$ usuario-> getFullName ()}} .

Primero, se entiende de inmediato que no es una columna de base de datos; con () al final, está claro que es un método . Además, su IDE le permitirá hacer clic en él y aterrizar dentro de ese método en su modelo. Navegación más fácil, ¿eh?

En el modelo, simplemente cambie el nombre de getFullNameAttribute () a getFullName () :

public function getFullName()
{
    return $this->name . ' ' . $this->surname;
}

¿Estás de acuerdo? ¿Alguna vez te has encontrado con el problema de "demasiada magia" en Laravel, con accesos u otros métodos mágicos?

No hay comentarios.:

Publicar un comentario

Dejanos tu comentario para seguir mejorando!

outbrain

Páginas