Bash:
Refactorización
Cómo hacerlo:
Consideremos un simple script de Bash que necesita ser refactorizado. Es torpe, con código repetido y es difícil de seguir:
#!/bin/bash
echo "Introduce un nombre de archivo:"
read filename
if [ -f "$filename" ]; then
echo "El archivo existe."
count=$(grep -c "foo" "$filename")
echo "La palabra foo aparece $count veces."
else
echo "El archivo no existe."
fi
La refactorización para claridad y reusabilidad podría involucrar la introducción de funciones y el manejo de errores de manera más elegante:
#!/bin/bash
function file_exists() {
[[ -f "$1" ]]
}
function count_occurrences() {
grep -c "$1" "$2"
}
function main() {
local filename word count
echo "Introduce un nombre de archivo:"
read -r filename
echo "Introduce la palabra a buscar:"
read -r word
if file_exists "$filename"; then
count=$(count_occurrences "$word" "$filename")
echo "La palabra $word aparece $count veces."
else
echo "El archivo no existe." >&2
exit 1
fi
}
main "$@"
La versión refactorizada utiliza funciones para mejorar la legibilidad y permite su posible reutilización.
Profundización:
La refactorización no es un concepto que se originó con Bash o incluso con lenguajes de programación de alto nivel; es tan antiguo como la programación misma. El término fue formalizado en el libro “Refactoring: Improving the Design of Existing Code” por Martin Fowler en 1999, centrado principalmente en lenguajes orientados a objetos.
En el contexto de la escritura de scripts en Bash, la refactorización a menudo significa descomponer scripts largos en funciones, reducir la repetición con bucles o condicionales y evitar trampas comunes como no manejar el espacio en blanco en nombres de archivos. Alternativas a Bash para scripts que han crecido demasiado en complejidad incluyen Python o Perl, que ofrecen mejores estructuras de datos y manejo de errores para tareas complejas.
La refactorización específica de Bash trata más sobre adherirse a las mejores prácticas, como citar variables, usar [[ ]]
para pruebas en lugar de [ ]
, y preferir printf
en lugar de echo
para una salida robusta. Los detalles de implementación a menudo giran en torno a seguir las guías de estilo y utilizar herramientas como shellcheck
para análisis estático y así detectar errores comunes.