Introducción a la refactorización en PHP

Jeff
Styde.net
Published in
3 min readJan 22, 2018
Photo by Luca Bravo on Unsplash

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 getPostsen 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 returnde 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:

--

--

Jeff
Styde.net

Web developer. Always learning... #fullstack #less #sass #php #laravel #javascript #VueJs