Elixir:
Rifattorizzazione

Come fare:

Mettiamo in ordine un pattern comune di Elixir. Rifattorizzeremo una funzione calculate_stats che fa più di quanto dovrebbe spezzandola in pezzi più piccoli e riutilizzabili.

defmodule Stats do
  # Codice originale, non rifattorizzato
  def calculate_stats(data) do
    total = Enum.sum(data)
    count = Enum.count(data)
    mean = total / count
    {mean, total}
  end
  
  # Codice rifattorizzato
  def calculate_mean(data), do: Enum.sum(data) / Enum.count(data)
  
  def calculate_total(data), do: Enum.sum(data)
  
  def calculate_stats_refactored(data) do
    mean = calculate_mean(data)
    total = calculate_total(data)
    {mean, total}
  end
end

# Output di esempio
# Prima del Refactoring
Stats.calculate_stats([1, 2, 3])
# => {2.0, 6}

# Dopo il Refactoring
Stats.calculate_stats_refactored([1, 2, 3])
# => {2.0, 6}

Come puoi vedere, l’output rimane lo stesso, ma ora abbiamo funzioni modulari che possono essere riutilizzate e testate indipendentemente.

Approfondimento

Il refactoring non è un concetto nuovo; è stato una parte cruciale della programmazione fin dai primi giorni dello sviluppo software. Opere importanti, come “Refactoring: Improving the Design of Existing Code” di Martin Fowler, forniscono pratiche fondamentali per il refactoring con intuizioni su quando e come applicarle.

Le alternative al refactoring manuale includono strumenti di analisi del codice automatizzati, che possono suggerire o addirittura eseguire il refactoring. Tuttavia, gli strumenti automatizzati potrebbero non comprendere sempre il contesto completo del codice e possono perdere sottigliezze che un revisore umano coglierebbe.

I dettagli implementativi in Elixir specificatamente includono la comprensione del paradigma funzionale e l’uso di pattern matching, clausole di guardia e l’operatore pipe per scrivere codice chiaro e conciso. Ad esempio, il refactoring spesso implica la conversione di funzioni complesse in stile imperativo in funzioni più piccole e componibili che seguono la preferenza di Elixir per l’immutabilità e le operazioni prive di effetti collaterali.

Vedi Anche

Per maggiori informazioni sulle tecniche di refactoring specifiche di Elixir: