Bash:
Refaktoryzacja

Jak to zrobić:

Rozważmy prosty skrypt Bash, który wymaga refaktoryzacji. Jest nieporęczny, z powtarzającym się kodem i trudny do śledzenia:

#!/bin/bash
echo "Wprowadź nazwę pliku:"
read filename
if [ -f "$filename" ]; then
    echo "Plik istnieje."
    count=$(grep -c "foo" "$filename")
    echo "Słowo foo pojawia się $count razy."
else
    echo "Plik nie istnieje."
fi

Refaktoryzacja pod kątem jasności i możliwości ponownego użycia może polegać na wprowadzeniu funkcji oraz bardziej eleganckim obsługiwaniu błędów:

#!/bin/bash

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

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

function main() {
    local filename word count
    echo "Wprowadź nazwę pliku:"
    read -r filename
    echo "Wprowadź szukane słowo:"
    read -r word

    if file_exists "$filename"; then
        count=$(count_occurrences "$word" "$filename")
        echo "Słowo $word pojawia się $count razy."
    else
        echo "Plik nie istnieje." >&2
        exit 1
    fi
}

main "$@"

Wersja po refaktoryzacji wykorzystuje funkcje do poprawy czytelności i umożliwia potencjalne ponowne użytkowanie.

Dogłębne zgłębienie:

Refaktoryzacja to nie pojęcie, które powstało wraz z Bashem czy nawet językami programowania wysokiego poziomu; jest tak stare jak programowanie samo w sobie. Termin został sformalizowany w książce “Refaktoryzacja: Ulepszanie projektu istniejącego kodu” autorstwa Martina Fowlera w 1999 roku, skupiając się głównie na językach zorientowanych obiektowo.

W kontekście skryptów Bash, refaktoryzacja często oznacza rozbijanie długich skryptów na funkcje, zmniejszanie powtórzeń za pomocą pętli lub instrukcji warunkowych oraz unikanie typowych błędów jak nieobsługiwanie białych znaków w nazwach plików. Alternatywami dla Bash, gdy skrypty stają się zbyt skomplikowane, są Python czy Perl, które oferują lepsze struktury danych i obsługę błędów do złożonych zadań.

Refaktoryzacja specyficzna dla Bash polega bardziej na przestrzeganiu najlepszych praktyk, takich jak używanie cudzysłowów wokół zmiennych, stosowanie [[ ]] do testów zamiast [ ], oraz preferowanie printf nad echo dla bardziej solidnego wyjścia. Szczegóły implementacji często obracają się wokół przestrzegania poradników stylu i korzystania z narzędzi takich jak shellcheck do statycznej analizy w celu wykrywania typowych błędów.

Zobacz także: