Hardcode nello sviluppo: cos'è, rischi e come evitarlo

Autore: IT Sectr Pubblicato: 2026-07-31 Tempo di lettura: 7 min

“Inchiodare” e “hardcodare” sono termini gergali che indicano la fissazione rigida di valori direttamente nel codice del programma, invece di estrarli in impostazioni o configurazione. L'hardcode è uno degli antipattern più noti nello sviluppo, poiché riduce la flessibilità e la riusabilità del codice. Secondo Refactoring Guru, l'hardcode complica i test, la manutenzione e l'adattamento dell'applicazione a diversi ambienti. L'uso consapevole di costanti invece di hardcode è un segno di architettura matura.

Punti chiave

  • Hardcodare — scrivere un valore specifico direttamente nel codice sorgente
  • Hardcode è considerato un antipattern a causa della perdita di flessibilità e della difficoltà di manutenzione
  • Eccezioni: costanti matematiche, dimensioni di array, valori predefiniti
  • Alternative: file di configurazione, variabili d'ambiente, risorse
  • Il refactoring dell'hardcode migliora la testabilità e l'estendibilità del codice

Cosa significa “inchiodare” e “hardcodare”

Hardcodare (inchiodare) — incorporare un valore specifico nel codice del programma in modo tale che per modificarlo sia necessario editare il codice sorgente e ricompilare l'applicazione. La metafora “inchiodare” riflette esattamente l'essenza: il valore è fissato permanentemente e può essere staccato dal codice solo con sforzo.

Esempio di hardcode — un URL del server scritto come stringa direttamente nel corpo di una funzione. Se il server si sposta su un altro indirizzo, lo sviluppatore deve trovare la stringa nel codice, modificarla, ricostruire l'applicazione e distribuire una nuova release. In un'applicazione con architettura corretta, tale URL sarebbe stato estratto in un file di configurazione, una variabile d'ambiente o un servizio di configurazione.

Il termine “inchiodare” è più carico emotivamente: sottolinea che il valore è inserito permanentemente, senza possibilità di sostituzione rapida. Nell'ambiente russofono, entrambe le espressioni sono usate come sinonimi completi con connotazione negativa. A volte l'hardcode viene ironicamente chiamato “costante estratta in una costante separata da una costante”.

Perché l'hardcode è considerato un antipattern

Hardcode — un antipattern perché viola i principi di manutenibilità, testabilità ed estendibilità del codice. In codice dove i valori sono “inchiodati”, qualsiasi modifica di ambiente, design o logica richiede ricerca e sostituzione manuali nei sorgenti. Questo aumenta il rischio di errori e rallenta lo sviluppo.

Consideriamo le conseguenze specifiche dell'hardcode usando come esempio una tipica applicazione mobile. Se il margine di tutti i pulsanti è definito da un numero nel codice, non attraverso una risorsa — un cambio di design richiederà di trovare tutte le occorrenze e sostituirle. Se l'URL dell'endpoint è fissato rigidamente — il passaggio tra ambienti (dev, stage, prod) è impossibile senza una ricostruzione.

ConseguenzaDescrizioneLivello di criticità
Difficoltà di manutenzioneLa modifica richiede ricerca in tutto il codiceAlto
Errori durante la copiaNon tutte le occorrenze vengono trovate e sostituiteAlto
Impossibilità di testNon è possibile sostituire i dati di testMedio
Problemi di localizzazioneI testi nel codice non vengono tradottiMedio
Complessità della revisione del codiceIl revisore deve ricordare tutti i contestiBasso

Esempio di hardcode errato

Una funzione che utilizza numeri magici e stringhe fissate — l'esempio classico di hardcode. Dopo un mese, l'autore non ricorderà cosa significano 18, 0.07 e 2.5. Dopo un anno — nessuno nel team oserà modificare questi numeri, temendo di rompere la logica. Estrarre i valori in costanti nominate rende il codice autodocumentante.

kotlin
// Cattivo: numeri magici e stringhe
fun calculatePrice(base: Double): Double {
    val tax = base * 0.07
    val tip = base * 0.15
    val discount = if (base > 100) 10 else 0
    return base + tax + tip - discount
}

Impatto sui test

Un URL di database hardcodato non permetterà di eseguire test su un database locale in-memory. Lo sviluppatore dovrà avviare un server completo o modificare il codice prima dei test. Estrarre la configurazione dal codice risolve il problema: i test usano parametri di test, la produzione usa parametri reali, e il codice rimane invariato.

Quando l'hardcode è giustificato: eccezioni alle regole

L'hardcode è un antipattern, ma esistono eccezioni legittime in cui un valore fissato non solo è accettabile, ma anche preferibile. Il confine segue l'asse di mutabilità: se il valore non cambia mai o quasi mai nel ciclo di vita dell'applicazione, può essere hardcodato. Se può potenzialmente cambiare — estraetelo nella configurazione.

Costanti matematiche e fisiche — Pi greco, accelerazione di gravità, numero di millisecondi in un secondo — sono sicure per l'hardcode. Sono definite dalla natura o dagli standard e non cambieranno. Dimensioni di array costanti definite da specifica possono anch'esse essere fissate, ma con un commento sull'origine del numero.

Esempio di hardcode giustificato

Il numero di millisecondi in un secondo è una costante stabile definita dallo standard temporale. Non ha senso estrarla in un config, perché non cambierà mai. Tuttavia, anche queste costanti è meglio dichiararle con un nome chiaro, in modo che il codice non contenga “numeri magici”: invece di 1000, scrivete MILLISECONDS_IN_SECOND.

kotlin
// Hardcode giustificato: costanti stabili
private const val MILLIS_IN_SECOND = 1000
private const val LOGIN_TIMEOUT_SECONDS = 30

fun formatDuration(ms: Long): String {
    val seconds = ms / MILLIS_IN_SECOND
    return "${seconds} sec."
}

Alternative all'hardcode: configurazioni, ENV, DI

Esistono diversi modi comprovati per evitare l'hardcode, ciascuno adatto al proprio tipo di valore. La scelta dell'alternativa dipende dalla frequenza con cui il valore cambia e da chi lo modifica: sviluppatore, devops o utente finale.

File di configurazione

Per URL di server, chiavi API e feature flag, utilizzate file di configurazione in formato JSON, YAML o TOML. Su Android, è build.gradle con buildConfigField o res/values/config.xml. Su iOS — Info.plist o xcconfig. Le configurazioni vengono compilate insieme all'applicazione, ma possono essere diverse per diversi schemi di build.

Variabili d'ambiente

Per segreti (token, password) e parametri d'ambiente, utilizzate variabili d'ambiente. Non finiscono nel repository e possono differire sui server dev, stage e prod. Nello sviluppo mobile, le variabili d'ambiente sono spesso emulate attraverso schemi di build di Xcode o build flavors in Gradle.

Risorse dell'applicazione

Stringhe, colori, dimensioni, immagini dovrebbero essere estratti in file di risorse: strings.xml su Android, Localizable.strings su iOS, file ARB in Flutter. Questo facilita la localizzazione, l'adattamento a schermi diversi e il tema scuro. Modificare una stringa nelle risorse non richiede riscrittura del codice.

xml
<!-- Android: res/values/strings.xml -->
<resources>
    <string name="app_name">MyApp</string>
    <string name="api_base_url">https://api.example.com</string>
</resources>

Iniezione di dipendenze (DI)

Per servizi e provider, utilizzate Dependency Injection tramite Dagger, Hilt o Koin su Android, Swinject su iOS. I framework DI permettono di sostituire le implementazioni al volo — per test, per ambienti diversi, per utenti diversi. Questo è il più alto livello di astrazione, dove “l'inchiodatura” del valore viene sostituita dall'iniezione esterna.

Come rifattorizzare codice hardcodato

Il refactoring dell'hardcode è il processo di estrazione dei valori fissati nella configurazione o nelle risorse. È una delle operazioni di refactoring più sicure, se eseguita metodicamente. La sequenza descritta di seguito è adatta a qualsiasi linguaggio e piattaforma.

Passo 1: trova tutti i numeri magici e le stringhe

La ricerca può essere effettuata tramite IDE (Search in Project) o script. Cerca stringhe, URL, letterali numerici, dimensioni, timeout. Attenzione particolare — ai valori ripetuti: se lo stesso numero appare in cinque punti, è un candidato per diventare una costante. Usa grep o la ricerca integrata di IDEA / Xcode.

Passo 2: sostituisci con costanti nominate

Per ogni valore trovato, crea una costante con un nome significativo. Raggruppa le costanti per moduli o classi. Il nome deve spiegare cosa significa il valore, non come viene usato: API_TIMEOUT, non TIMEOUT_30. Dopo la sostituzione, nessun numero nel codice deve rimanere senza spiegazione.

swift
// Prima: numero magico 0.4
let cardHeight = screenHeight * 0.4

// Dopo: costante nominata
private let cardHeightRatio: CGFloat = 0.4
let cardHeight = screenHeight * cardHeightRatio

Passo 3: estrai nella configurazione o nelle risorse

Se il valore può variare tra build o ambienti — estraetelo in un file di configurazione o nelle risorse dell'applicazione. Per le stringhe, utilizzate file di localizzazione. Per gli URL — build config o xcconfig. Per le dimensioni — file di risorse (dimens.xml su Android). Verificate che l'applicazione si compili e funzioni correttamente dopo l'estrazione.

Passo 4: scrivi un test

Dopo il refactoring, scrivi un test che verifichi che la configurazione venga caricata correttamente e che i valori corrispondano a quelli attesi. Se in futuro qualcuno modificherà il config, il test segnalerà la discrepanza. Un test sulla configurazione è un modo rapido e affidabile per prevenire regressioni.

Passo 5: rimuovi i duplicati

Dopo l'estrazione nel config, verifica che tutti i punti che utilizzavano il vecchio valore facciano riferimento all'unica fonte. Rimuovi il codice commentato e le vecchie costanti che non sono più utilizzate. Finalizza il refactoring con un commit il cui messaggio descriva quali valori sono stati estratti e dove.

Domande frequenti

Cosa significa “hardcodare” in programmazione?

Hardcodare — scrivere un valore direttamente nel codice sorgente invece di estrarlo nella configurazione o nelle risorse. Questo rende il codice meno flessibile e più difficile da mantenere.

Perché l'hardcode è considerato una cattiva pratica?

Hardcode complica la modifica del comportamento dell'applicazione, ostacola i test, crea duplicazione e aumenta il rischio di errori durante la copia. Modificare un valore hardcodato richiede la ricompilazione e la ripubblicazione dell'applicazione.

Quando l'hardcode è accettabile?

Accettabile per costanti matematiche, valori stabili che non cambiano nel ciclo di vita dell'applicazione e per prototipi temporanei. In produzione, anche le costanti dovrebbero essere estratte in variabili nominate.

Come sostituire l'hardcode nel codice esistente?

Trova tutti i numeri magici tramite ricerca, sostituiscili con costanti nominate o estraili in un file di configurazione. Scrivi un test che verifichi il caricamento della configurazione. Rimuovi i duplicati e fai un commit con la descrizione delle modifiche.

Qual è la differenza tra costante e hardcode?

Costante — un valore nominato nel codice, modificabile in un unico punto. Hardcode — valori senza nome sparsi nel codice. Buona pratica: utilizzare sempre costanti nominate con nomi significativi.

Riepilogo

  • Hardcodare (inchiodare) — scrivere un valore nel codice senza possibilità di sostituzione rapida
  • Hardcode — un antipattern che compromette manutenzione, test ed estendibilità
  • Numeri magici e stringhe senza nome — la forma più comune di hardcode
  • Eccezioni: costanti matematiche e valori predefiniti stabili
  • Alternative: file di configurazione, risorse, ENV, contenitori DI
  • Il refactoring dell'hardcode inizia con la ricerca di duplicati e la sostituzione con costanti nominate
  • Dopo il refactoring, scrivi un test per il caricamento della configurazione

Svilupperemo un'applicazione mobile chiavi in mano

IT Sectr crea applicazioni iOS e Android per startup e aziende dal 2017. Ti consulteremo e ti proporremo la soluzione migliore.

Discuti il progetto

Leggi anche