Aikido

Perché dovresti rimuovere il codice commentato dalla tua codebase

Leggibilità

Regola
Rimuovi i blocchi di codice commentati

Il codice commentato genera rumore, diventa obsoleto 
e appartiene alla cronologia del control version, non al codebase.

Introduzione

Il codice commentato si accumula quando gli sviluppatori non sono sicuri di aver bisogno della vecchia logica in futuro. Qualcuno commenta una funzione "per sicurezza" invece di eliminarla, e quella rimane lì per sempre. Nessuno sa se questo codice funzioni ancora, perché sia stato disattivato o se sia sicuro rimuoverlo. Il codebase si riempie di fantasmi di implementazioni passate che distraggono dalla comprensione di ciò che è realmente in esecuzione in produzione.

Perché è importante

Manutenibilità del codice: Il codice commentato costringe chi legge a filtrare mentalmente ciò che è reale da ciò che è dormiente. Durante la code review, è impossibile capire se questi blocchi siano esperimenti temporanei, opzioni di rollback importanti o residui dimenticati di anni fa. Questo rumore rende più difficile comprendere la logica effettiva, trovare sezioni di codice rilevanti e revisionare le modifiche in modo significativo.

Implicazioni sulla sicurezza: Controlli di autenticazione, logica di validazione o funzionalità di sicurezza commentate rivelano che queste protezioni esistevano ma sono state disattivate deliberatamente. Se il codice commentato contiene credenziali, chiavi API o URL interni, stai distribuendo dati sensibili in chiaro. Gli attaccanti che esaminano il codebase vedono esattamente quali misure di sicurezza hai preso in considerazione e poi rimosso.

Confusione nel controllo di versione: I diff di Git si riempiono di blocchi commentati che non subiscono reali modifiche. Quando devi rintracciare quando è cambiata la logica o perché una funzionalità funziona in un certo modo, le alternative commentate oscurano la cronologia reale. La ricerca nel codebase restituisce corrispondenze in codice morto, sprecando tempo a investigare percorsi che non vengono eseguiti.

Esempi di codice

❌ Non conforme:

async function createUser(userData) {
    // const hashedPassword = await bcrypt.hash(userData.password, 10);

    const user = await db.users.create({
        email: userData.email,
        password: userData.password,
        // password: hashedPassword,
        role: userData.role || 'user'
    });

    // await sendWelcomeEmail(user.email);
    // await notifyAdmins(user);

    // Old validation approach
    // if (!isValidEmail(user.email)) {
    //     throw new Error('Invalid email');
    // }

    return user;
}

Perché è errato: L'hashing delle password commentato rivela che le password vengono memorizzate in chiaro, una vulnerabilità di sicurezza critica. Nessuno sa se l'email di benvenuto e la notifica dell'amministratore debbano essere abilitate, e la vecchia validazione suggerisce che la convalida dell'email potrebbe mancare.

✅ Conforme:

async function createUser(userData) {
    if (!isValidEmail(userData.email)) {
        throw new Error('Invalid email');
    }

    const hashedPassword = await bcrypt.hash(userData.password, 10);

    const user = await db.users.create({
        email: userData.email,
        password: hashedPassword,
        role: userData.role || 'user'
    });

    await sendWelcomeEmail(user.email);
    await notifyAdmins(user);

    return user;
}

Perché questo è importante: La funzione è chiara e completa e mostra esattamente cosa viene eseguito in produzione. La validazione delle email viene eseguita per prima, le password vengono sottoposte a hashing correttamente e tutte le notifiche vengono inviate senza ambiguità su ciò che è abilitato.

Conclusione

Elimina il codice invece di commentarlo. Il tuo sistema di controllo di versione preserva ogni riga scritta, accessibile tramite git log e git blame quando ne hai bisogno. Mantenere il codice commentato nel repository crea solo rumore che oscura la logica effettiva e rende la navigazione nel codebase più difficile.

FAQ

Hai domande?

E se ho bisogno della vecchia implementazione per il rollback?

Usa feature flag o rami di controllo di versione, non i commenti. Se potresti dover ripristinare la vecchia logica, implementala dietro una feature flag che puoi attivare o disattivare. Per le modifiche permanenti, elimina il vecchio codice e affidati alla cronologia di Git. Puoi sempre recuperare il codice eliminato con git log -p o git show quando necessario.

Come gestisco il codice sperimentale durante lo sviluppo?

Mantieni gli esperimenti in branch separati o gestiscili tramite feature flag. Se stai testando due approcci, crea un branch per ciascuno o usa un flag di configurazione per passare dall'uno all'altro. Del codice commentato nei branch principali suggerisce che non sei sicuro di cosa debba andare in produzione, il che è un problema di pianificazione, non di controllo di versione.

Che dire della disattivazione temporanea del codice durante il debugging?

Va bene per le sessioni di debug locali, ma non effettuare mai il commit di tale codice. Usa git add -p per esaminare ed escludere il codice di debug commentato prima di procedere al commit. Se hai bisogno di disattivare del codice temporaneamente a livello di team, usa feature flag o la configurazione anziché i commenti.

Dovrei rimuovere anche le note esplicative commentate?

No, questa regola riguarda i blocchi di codice commentati, non i commenti di documentazione. I commenti esplicativi che descrivono il perché o il come di qualcosa sono preziosi. Il problema sono i blocchi di codice eseguibile commentato che potrebbero non essere più pertinenti.

‍

E se il codice commentato documentasse vecchi approcci di implementazione?

Documenta l'approccio in un commento descrittivo, anziché preservare codice morto. Scrivi "precedentemente utilizzato l'approccio X, passato a Y a causa di Z" invece di mantenere entrambe le implementazioni commentate. Il contesto storico appartiene ai messaggi di commit e ai documenti di design, non ai blocchi di codice dormienti.

Metti in sicurezza ora

Metti in sicurezza il tuo codice, il cloud e il runtime in un unico sistema centralizzato.
Trova e risolvi le vulnerabilità rapidamente e automaticamente.

Nessuna carta di credito richiesta | Risultati della scansione in 32 secondi.