Elm:
Rifattorizzazione
Come fare:
Supponiamo di avere una funzione Elm che sta facendo troppo, come mescolare la logica dell’UI con gli aggiornamenti dello stato. È un candidato perfetto per il refactoring. Originariamente:
updateAndFormat : String -> Model -> (Model, Cmd Msg)
updateAndFormat input model =
let
updatedModel = { model | userInput = input }
in
if String.length input > 5 then
( updatedModel, Cmd.none )
else
( model, Cmd.none )
Dopo il refactoring, separamo le preoccupazioni estraendo la logica in funzioni diverse:
-- La logica di aggiornamento è separata
updateUserInput : String -> Model -> Model
updateUserInput input model =
{ model | userInput = input }
-- Anche la logica della formattazione (visualizzazione) è separata
formatUserInput : Model -> (Model, Cmd Msg)
formatUserInput model =
if String.length model.userInput > 5 then
( model, Cmd.none )
else
( { model | userInput = "" }, Cmd.none ) -- Pulisci l'input se è troppo corto, come regola di esempio.
-- La funzione di aggiornamento ora utilizza le funzioni di supporto
updateAndFormat : String -> Model -> (Model, Cmd Msg)
updateAndFormat input model =
model
|> updateUserInput input
|> formatUserInput
Con questi cambiamenti, hai una chiara separazione, e ogni funzione è più facile da comprendere e testare.
Approfondimento
Il refactoring come pratica formale può essere fatto risalire ai primi giorni della programmazione, quando il costo del cambiamento del codice veniva già riconosciuto come un aspetto critico del processo di sviluppo. Notabilmente, il libro di Martin Fowler “Refactoring: Improving the Design of Existing Code”, pubblicato alla fine degli anni ‘90, ha davvero preparato il terreno per il refactoring con un approccio strutturato e un catalogo di “odori del codice” per identificare le opportunità di refactoring.
Nel contesto di Elm, il refactoring sfrutta i punti di forza del linguaggio, come il suo forte sistema di tipi, che promuove la fiducia durante il processo. Le alternative al refactoring manuale possono includere strumenti automatizzati di trasformazione del codice, ma gli strumenti di Elm in questo ambito stanno ancora maturando rispetto ad alcuni linguaggi più vecchi. I dettagli implementativi spesso ruotano attorno a refactoring comuni come l’estrazione di funzioni, la ridenominazione e la semplificazione delle condizioni. Il compilatore di Elm è un alleato chiave nel refactoring, poiché non ti permette di trascurare molto—grida ogni volta che qualcosa non va, assicurando che il tuo codice rifatto funzioni ancora.