Bash:
Рефакторинг

Как это делать:

Рассмотрим простой Bash-скрипт, который нуждается в рефакторинге. Он громоздкий, с повторяющимся кодом и его сложно следить:

#!/bin/bash
echo "Введите имя файла:"
read filename
if [ -f "$filename" ]; then
    echo "Файл существует."
    count=$(grep -c "foo" "$filename")
    echo "Слово foo встречается $count раз."
else
    echo "Файл не существует."
fi

Рефакторинг для повышения ясности и возможности повторного использования может включать в себя введение функций и более изящную обработку ошибок:

#!/bin/bash

function file_exists() {
    [[ -f "$1" ]]
}

function count_occurrences() {
    grep -c "$1" "$2"
}

function main() {
    local filename word count
    echo "Введите имя файла:"
    read -r filename
    echo "Введите искомое слово:"
    read -r word

    if file_exists "$filename"; then
        count=$(count_occurrences "$word" "$filename")
        echo "Слово $word встречается $count раз."
    else
        echo "Файл не существует." >&2
        exit 1
    fi
}

main "$@"

Рефакторированная версия использует функции для повышения читаемости и обеспечивает потенциальное повторное использование.

Глубокое погружение:

Рефакторинг - это не концепция, которая появилась с Bash или даже с высокоуровневыми языками программирования; она стара, как само программирование. Термин был официально введен в книге “Refactoring: Improving the Design of Existing Code” Мартина Фаулера в 1999 году, сосредоточенной в основном на объектно-ориентированных языках.

В контексте Bash-скриптов рефакторинг часто означает разбиение длинных скриптов на функции, сокращение повторений с помощью циклов или условных операторов и избегание общих проблем, таких как неудачное обращение с пробелами в именах файлов. Альтернативы Bash для сценариев, которые стали слишком сложными, включают Python или Perl, которые предлагают лучшие структуры данных и обработку ошибок для сложных задач.

Рефакторинг, специфичный для Bash, больше связан с соблюдением лучших практик, таких как использование кавычек для переменных, использование [[ ]] для тестов вместо [ ], и предпочтение printf вместо echo для надежного вывода. Детали реализации часто связаны с соблюдением руководств по стилю и использованием инструментов вроде shellcheck для статического анализа, чтобы выявлять распространенные ошибки.

Смотрите также: