Conocer algunas técnicas de refactorización y saber cuando utilizarlas, puede ayudarte a escribir código más legible, fácil de entender y por supuesto mucho más fácil de mantener con el tiempo.
La refactorización es una técnica de la ingeniería de software para reestructurar un código fuente, alterando su estructura interna sin cambiar su comportamiento externo
Considera el siguiente ejemplo:
public function getPublishedPosts(array $params = []) : array
{
$query = ['query' => $params];
$data = ApiService::get($query);
$data = json_decode($data, true);
if (!empty($data)) {
$result = [];
foreach($data as $post) {
if (!empty($post['published'])) {
$result[] = $post;
}
}
} if (!empty($result)) {
return $result;
} else {
return [];
}
}
Eliminando variables temporales
Vamos a tratar de reducir el uso de variables temporales como $query
y $data
.
En primer lugar, la variable $query
se está utilizando en un solo lugar, por lo que podemos eliminarla utilizando en su lugar el array en línea, de la siguiente manera:
// $query = ['query' => $params];$data = ApiService::get(['query' => $params]);
Mejorando la legibilidad con el uso de funciones
En este ejemplo, el valor de $data
debe convertirse de JSON
a un Array
. Esta acción se puede extraer a una nueva función para mejorar la legibilidad y al mismo tiempo evitar sobrescribir el valor de $data
:
// $data = ApiService::get($data);
// $data = json_decode($data, true);$posts = $this->getPosts(['query' => $params]);
Ahora es más fácil observar que esta línea se usa para obtener todos los posts y además podríamos usar el método getPosts
en otras partes de nuestra aplicación.
pubic function getPosts(array $params = []) : array
{
return json_decode(ApiService::get($params), true);
}
Eliminando condicionales anidados y loops
$posts = $this->getPosts(['query' => $params]);if (!empty($posts)) {
$result = [];
foreach($posts as $post) {
if (!empty($post['published'])) {
$result[] = $post;
}
}
}if (!empty($result)) {
return $result;
} else {
return [];
}
Podemos utilizar array_filter y operadores ternarios para limpiar un poco el código de esta manera:
public function getPublishedPosts(array $params = []) : array
{ $posts = $this->getPosts(['query' => $params]);
$data = array_filter(
$posts,
function ($post) {
return !empty($post['is_published']);
});
); return $data;}
Llamando funciones en línea
Podemos eliminar la variable temporal $posts
public function getPublishedPosts(array $params = []) : array
{
$data = array_filter(
$this->getPosts(['query' => $params]),
function ($post) {
return !empty($post['is_published']);
});
); return $data;}
Usando “return” en línea
Finalmente se puede hacer un return
de este resultado eliminando la variable $data
:
public function getPublishedPosts(array $params = []) : array
{
return array_filter(
$this->getPosts(['query' => $params]),
function ($post) {
return !empty($post['is_published']);
});
);
}
Finalmente logramos eliminar todas las variables temporales 💪
Resultado final
Como puedes ver, en comparación con el bloque de código que teníamos al inicio, el resultado final es mucho más fácil de leer y de comprender.
public function getPublishedPosts(array $params = []) : array
{
return array_filter(
$this->getPosts(['query' => $params]),
function ($post) {
return !empty($post['is_published']);
});
);
}pubic function getPosts(array $params = []) : array
{
return json_decode(ApiService::get($params), true);
}
Aquí hemos nombrado solo algunas de las técnicas más sencillas sobre refactorización, pero hay muchas otras de las que puedes sacar provecho para mejorar tus aplicaciones en PHP.
Si quieres aprender más sobre refactorización en PHP, puedes seguir nuestro curso en Styde.net donde Duilio Palacios nos enseña en gran detalle y con muchos ejemplos, cómo mejorar nuestro código: