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.

Ver También: