Il naming è una delle parti più importanti e sfidanti nella scrittura di codice pulito, manutenibile e scalabile. Un nome di variabile ben ponderato, ad esempio, può fungere da codice auto-documentante, risparmiando tempo ed sforzi nella comprensione della logica. Ma nomi scelti male, d’altra parte, possono portare a confusione e bug.
Questo articolo servirà come guida esaustiva su come trovare nomi significativi per nomi di classe, variabili e funzioni con esempi e migliori pratiche.
Perché è Importante il Naming?
-
Leggibilità: I buoni nomi rendono il tuo codice intuitivo e riducono la curva di apprendimento per gli altri.
-
Manutenibilità: È più facile rifattorizzare o fare debug di codice ben nominato.
-
Collaborazione: Nomi chiari migliorano la comunicazione e la produttività del team.
-
Scalabilità: I nomi significativi aiutano a mantenere gestibili i progetti di grandi dimensioni.
Stili Diversi di Convenzioni di Naming
Gli stili di convenzioni di naming diversi sono cruciali nel migliorare la leggibilità e la manutenibilità del codice attraverso vari linguaggi di programmazione.
Stili come camelCase, PascalCase, snake_case e kebab-case sono adattati a contesti e pratiche specifiche.
camelCase è ampiamente utilizzato per variabili e funzioni, mentre PascalCase è preferito per le classi. snake_case è un preferito in Python per la sua chiarezza, e kebab-case domina nel CSS per lo stile degli elementi HTML.
Ogni stile garantisce coerenza, rendendo il codice intuitivo per team e futuri sviluppatori. Ecco una tabella di riassunto rapido di alcune convenzioni di denominazione popolari insieme ai loro casi d’uso ed esempi:
Stile | Esempio | Utilizzo Comune |
camelCase | nomeUtente |
Variabili, funzioni, proprietà degli oggetti |
PascalCase | NomeUtente |
Classi, componenti, costruttori |
kebab-case | pulsante-primario |
Classi CSS, ID HTML, nomi file |
snake_case | nome_utente |
Variabili, nomi di funzioni in Python |
SCREAMING_SNAKE_CASE | CONNESIONI_MAXIME |
Costanti |
dot.case | percorso.file.config |
Configurazioni, chiavi |
Train-Case | Pulsante-Primario |
Titoli raramente usati |
Notazione ungherese | bIsActive |
Codice legacy |
MAIUSCOLE con spazi | USER ACCOUNT DETAILS |
Raro, principalmente per la documentazione vecchio stile |
Flatcase | username |
Minimalista, nomi file, identificatori |
Come Scegliere lo Stile Giusto
-
Specifico della Lingua: Seguire le convenzioni del linguaggio di programmazione o del framework. Ad esempio:
-
JavaScript:
camelCase
per variabili e funzioni,PascalCase
per componenti. -
Python:
snake_case
per variabili e funzioni. -
CSS/HTML:
kebab-case
per nomi di classi e ID.
-
-
Standard del Team o del Progetto: La coerenza è fondamentale. Utilizzare lo stile concordato per il team/progetto.
-
Specifica dello Scopo: Utilizza stili di denominazione che rappresentino al meglio l’entità che viene denominata (ad esempio, costanti in
SCREAMING_SNAKE_CASE
).
Linee Guida Generali sulla Denominazione
Prima di entrare nei dettagli delle convenzioni di denominazione specifiche per i nomi di classe, variabili e funzioni, esploriamo alcuni principi universali:
-
Sii descrittivo e conciso: I nomi dovrebbero trasmettere lo scopo o il ruolo della variabile/funzione/ecc:
// Male let x = 10; // Bene let maxUsersAllowed = 10;
-
Avoid abbreviazioni criptiche che potrebbero essere difficili da capire per altri sviluppatori (o anche per te stesso in futuro):
// Male let usrNm = "John"; // Bene let userName = "John";
-
Utilizza convenzioni di denominazione coerenti: Scegli uno stile di denominazione (camelCase, PascalCase, kebab-case, snake_case) e mantienilo per l’intero progetto.
-
Avoidare parole chiave riservate o nomi confusi:
// Male let let = 5; // Bene let variableName = 5;
Ok, ora che abbiamo coperto le basi, approfondiamo alcune utili convenzioni di denominazione.
Come Creare Buoni Nomi di Classe
I nomi di classe definiscono il comportamento visuale o strutturale degli elementi nella tua applicazione. Scrivere nomi di classe chiari garantisce che il tuo HTML e CSS siano facili da capire e mantenere.
1. Utilizzare Nomi Descrittivi
I nomi di classe dovrebbero descrivere lo scopo dell’elemento, non il suo aspetto.
<!-- Male -->
<div class="red-button"></div>
<!-- Bene -->
<div class="primary-button"></div>
2. Seguire la Metodologia BEM (Block-Element-Modifier)
BEM è una convenzione popolare per scrivere CSS scalabile e manutenibile. Separa i componenti in:
-
Blocco: Rappresenta il componente (ad esempio,
card
). -
Elemento: Rappresenta gli elementi figli del blocco (ad esempio,
card__title
). -
Modificatore: Rappresenta le variazioni del blocco o dell’elemento (ad esempio,
card__title--highlighted
).
Esempio:
<div class="card">
<h1 class="card__title card__title--highlighted">Welcome</h1>
<p class="card__description">This is a card component.</p>
</div>
3. Usa il kebab-case
I nomi delle classi CSS sono tradizionalmente scritti in kebab-case per una migliore leggibilità.
<!-- Cattivo -->
<div class="primaryButton"></div>
<!-- Buono -->
<div class="primary-button"></div>
Come creare buoni nomi per le variabili
Le variabili contengono dati e dovrebbero avere nomi significativi che descrivono ciò che rappresentano.
1. Usa sostantivi per le variabili
Le variabili sono tipicamente sostantivi perché rappresentano entità o dati.
// Cattivo
let a = "John";
// Buono
let userName = "John";
2. Usa prefissi per aggiungere contesto
Aggiungere prefissi aiuta a chiarire il tipo o lo scopo di una variabile:
-
Boolean:
è
,ha
,può
-
Numeri:
massimo
,minimo
,totale
-
Array: Utilizzare forme al plurale (ad esempio,
utenti
,elementi
).
Esempio:
let isUserLoggedIn = true;
const maxUploadLimit = 5; // MB
const usersList = ["John", "Jane"];
3. Evitare Nomi Generici
Evitare nomi come dati
, valore
, o elemento
a meno che non siano necessari.
// Cattivo
let data = 42;
// Buono
let userAge = 42;
Come Creare Buoni Nomi di Funzioni
Le funzioni eseguono azioni, quindi i loro nomi dovrebbero riflettere l’operazione o il processo che eseguono.
1. Utilizzare Verbi per le Funzioni
Le funzioni sono orientate all’azione, quindi i loro nomi dovrebbero iniziare con un verbo:
// Cattivo
function userData() {
// ...
}
// Buono
function fetchUserData() {
// ...
}
2. Essere Specifici Riguardo alla Funzionalità
I nomi delle funzioni dovrebbero indicare cosa fanno.
// Cattivo
function handle() {
// ...
}
// Buono
function handleFormSubmit() {
// ...
}
3. Usa Prefissi per l’Intento
-
Per i gestori di eventi:
handle
,on
-
Per le utility:
calculate
,convert
,format
-
Per le operazioni di fetch:
fetch
,get
,load
-
Per i setter e getter:
set
,get
Esempio:
function handleButtonClick() {
console.log("Button clicked!");
}
function calculateDiscount(price, discountPercentage) {
return price * (discountPercentage / 100);
}
Come sapere se un Nome è Buono per una Variabile, Funzione o Classe
Per capire se un nome è buono per una variabile, funzione o classe, è importante valutarlo utilizzando diversi principi chiave. Ecco una guida per aiutarti a decidere se un nome è appropriato e significativo nel tuo contesto di programmazione:
1. Rappresenta lo Scopo?
I nomi orientati allo scopo sono la caratteristica più importante di una buona denominazione. Un nome dovrebbe immediatamente farti capire cosa rappresenta o fa la variabile, la funzione o la classe senza bisogno di leggere commenti o documentazione aggiuntiva.
Come valutare:
Chiediti: “Quando leggo questo nome, posso comprendere immediatamente il suo scopo?”
Esempio:
userAge
è migliore dia
perchéuserAge
ti dice cosa rappresenta la variabile, mentrea
è troppo ambiguo.
2. È abbastanza specifico?
Il nome dovrebbe essere abbastanza specifico da riflettere il ruolo esatto dell’entità nel tuo codice. Nomi eccessivamente generici come data
o temp
possono essere confusi perché non forniscono un contesto sufficiente.
Come valutare:
Chiediti: “Questo nome è specifico rispetto a ciò che questa variabile, funzione o classe rappresenta nella mia applicazione?”
Esempio:
calculateTaxAmount()
è migliore dicalculate()
perché è chiaro cosa sta calcolando la funzione.
3. Segue una convenzione di denominazione coerente?
La coerenza nelle convenzioni di denominazione è fondamentale. Quando tutti i membri del team seguono le stesse convenzioni, il codice è più facile da comprendere e navigare.
Come valutare:
Chiedere: “Questo nome è coerente con le convenzioni di denominazione utilizzate nel resto del progetto?” Seguire le linee guida del progetto come:
-
camelCase
per variabili e funzioni (ad es.,userAge
) -
PascalCase
per classi (ad es.,UserProfile
) -
UPPERCASE_SNAKE_CASE
per costanti (ad es.,MAX_USERS
)
Esempio:
- Se il tuo team segue
camelCase
,userData
è migliore diUserData
.
4. Avoid Ambiguità?
Un buon nome elimina l’ambiguità. Non dovrebbe essere aperto a interpretazioni multiple. Se può significare cose diverse in contesti diversi, porterà a confusione.
Come valutare:
Chiedere: “Qualcuno non familiare con il codice potrebbe interpretare erroneamente a cosa si riferisce questo nome?”
Esempio:
- Invece di chiamare un booleano
isValid
, utilizzareisUserLoggedIn
oisEmailVerified
per rendere più chiaro ciò che viene controllato.
5. È Facile da Leggere e Pronunciare?
Sebbene non sia strettamente necessario, la facilità di lettura e pronuncia può migliorare la leggibilità e la manutenibilità complessiva del tuo codice.
Come valutare:
Chiedi: “Questo nome è facile da leggere ad alta voce e posso capirlo a colpo d’occhio?”
Evita nomi lunghi e usa abbreviazioni comuni solo quando sono ampiamente accettate.
Esempio:
maxRetries
è migliore dimaximumNumberOfAttemptsToReconnect
.
6. Evita la ridondanza?
Evita la ridondanza nei nomi. Non ripetere informazioni che sono già implicite o descritte dal contesto.
Come valutare:
Chiedi: “Sto ripetendo informazioni che sono già chiare dal contesto circostante?”
Esempio:
- Se hai una classe chiamata
User
, nominare un metodouserGetData()
è ridondante. Invece, usagetData()
.
7. È auto-documentante?
I migliori nomi documentano se stessi. Nomi buoni riducono la necessità di commenti o spiegazioni aggiuntive.
Come valutare:
Chiedi: “Questo nome descrive completamente la variabile, la funzione o la classe senza richiedere un commento per spiegare cosa fa?”
Esempio:
- La funzione
calculateTotalPrice
è autoesplicativa, quindi non c’è bisogno di un commento aggiuntivo come “Questa funzione calcola il prezzo totale dopo lo sconto.”
8. È Contestuale e Pertinente al Dominio?
Il nome dovrebbe adattarsi al contesto del tuo progetto e al suo dominio. Ad esempio, le convenzioni di denominazione per un’applicazione web possono differire da quelle per un’applicazione mobile o un modello di machine learning.
Come Valutare:
Chiediti: “Questo nome è allineato con il dominio e il contesto del mio progetto?”
Se stai lavorando in un dominio specifico (ad esempio, finanza, salute, giochi), utilizza termini specifici del settore facilmente riconoscibili.
Esempio:
- In un’applicazione di gioco,
healthPoints
è più appropriato dihp
, poiché riflette il suo significato.
9. È a Prova di Futuro?
Pensa a come il tuo codice evolverà. I nomi dovrebbero essere sufficientemente flessibili da poter accomodare futuri cambiamenti senza richiedere refactoring.
Come Valutare:
Chiediti: “Questo nome avrà ancora senso se la funzionalità cambia o il progetto cresce?”
Esempio:
userInfo
potrebbe diventare obsoleto se la struttura dei dati cambia. È meglio utilizzareuserProfile
se ti aspetti che vengano aggiunti più campi.
10. Evita Numeri Magici e Valori Codificati Duramente?
Numeri magici (numeri con significato non chiaro) dovrebbero essere evitati a favore di costanti nominate.
Come valutare:
Chiedi: “Questo nome rappresenta una costante significativa, o è solo un numero grezzo?”
Esempio:
- Piuttosto che utilizzare
1000
, utilizza una costante comeMAX_FILE_SIZE
per spiegare il significato dietro al numero.
Esempi pratici
Esempio CSS
L’esempio CSS seguente dimostra come applicare le convenzioni di denominazione BEM (Block-Element-Modifier) per mantenere una gerarchia di classi strutturata e scalabile nel tuo foglio di stile:
<!-- HTML -->
<div class="navbar">
<ul class="navbar__list">
<li class="navbar__item navbar__item--active">Home</li>
<li class="navbar__item">About</li>
<li class="navbar__item">Contact</li>
</ul>
</div>
/* CSS */
.navbar {
background-color: #333;
padding: 10px;
}
.navbar__list {
list-style: none;
}
.navbar__item {
display: inline-block;
padding: 10px;
}
.navbar__item--active {
color: orange;
}
Ecco cosa succede in questo codice:
-
Denominazione BEM:
navbar
è il Blocco, che rappresenta il componente di navigazione principale. -
navbar__list
è l’Elemento, un figlio del blocco, che rappresenta l’elenco degli elementi di navigazione. -
navbar__item
è un altro Elemento che rappresenta singoli elementi dell’elenco. -
navbar__item--active
è un Modificatore utilizzato per evidenziare la voce di menu attiva.
Questo approccio rende semplice comprendere le relazioni e i ruoli all’interno di HTML e CSS, supportando stili modulari e riutilizzabili.
Esempio JavaScript
Questo esempio JavaScript mostra come utilizzare convenzioni di denominazione significative e coerenti per variabili e funzioni per rendere il codice autoesplicativo:
// Variabili
let isUserLoggedIn = false;
const maxAllowedItems = 10;
// Funzioni
function fetchUserDetails(userId) {
// Recupera i dati dell'utente dall'API
}
function calculateTotalPrice(cartItems) {
return cartItems.reduce((total, item) => total + item.price, 0);
}
Ecco cosa succede nel codice:
-
Variabili:
-
isUserLoggedIn
: Una variabile booleana denominata in modo chiaro per indicarne lo scopo. Aggiungere il prefissois
aiuta a identificarla come booleana. -
maxAllowedItems
: Una costante con un prefisso di maiuscolemax
mostra che è un limite, rendendo chiaro il suo intento.
-
-
Funzioni:
-
fetchUserDetails(userId)
: Il nome riflette lo scopo della funzione, ovvero recuperare i dettagli dell’utente. Il parametrouserId
è descrittivo e evita ambiguità. -
calculateTotalPrice(cartItems)
: Il nome della funzione indica esplicitamente l’azione svolta. Il parametrocartItems
è rilevante nel contesto del settore dell’e-commerce.
-
Perché è Buono: Queste convenzioni garantiscono che il codice sia leggibile e intuitivo, riducendo il carico cognitivo per altri sviluppatori che lavorano sullo stesso progetto.
Conclusione
Il dare nomi significativi è sia una convenzione importante che una forma d’arte che influisce significativamente sulla leggibilità e manutenibilità del tuo codice.
Cerca di seguire questi principi di base:
-
Usa nomi descrittivi e concisi.
-
Segui convenzioni coerenti come BEM per i nomi delle classi e camelCase per variabili e funzioni.
-
Usa prefissi per aggiungere contesto e chiarezza.
Questi e gli altri suggerimenti che abbiamo discusso qui renderanno il tuo codice un piacere da utilizzare, che tu lo riveda mesi dopo o collabori con un team. Inizia ad applicare questi suggerimenti oggi e osserva la qualità del tuo codice decollare.
Source:
https://www.freecodecamp.org/news/how-to-write-better-variable-names/