Aikido

Perché dovresti usare gli argomenti con nome in Python e PHP

Leggibilità

Regola
Usa argomenti con nome per
maggiore chiarezza. Gli argomenti con nome rendono il codice autoesplicativo 
e prefono errori nell'ordine dei parametri. Usa argomenti
con nomequando le funzioni hanno più
di 2-3parametri o flag booleani.

Linguaggi supportati: Python, PHP

Introduzione

Le funzioni con parametri multipli diventano poco chiare quando si guarda al punto in cui vengono chiamate. La lettura di sendEmail('user@example.com', true, false, 30) richiede di consultare la firma della funzione per capire cosa true, false, e 30 significhino. Gli argomenti con nome risolvono questo problema rendendo esplicito lo scopo di ciascun parametro nel punto di chiamata. Prevengono inoltre bug dovuti alla riordinazione dei parametri quando le firme delle funzioni cambiano.

Perché è importante

Manutenibilità del codice: Gli argomenti con nome documentano l'intento nel punto di chiamata senza richiedere un continuo controllo di riferimento. Quando vedi sendEmail(to: $email, retry: true, async: false, timeout: 30), capisci esattamente cosa controlla ciascun valore. Questo elimina la confusione durante la code review e velocizza il debug, poiché non è necessario mappare mentalmente gli argomenti posizionali ai nomi dei parametri.

Implicazioni di sicurezza: Errori nell'ordine dei parametri in funzioni critiche per la sicurezza possono creare vulnerabilità. Invertire l' $username e $password parametri, o passare accidentalmente la password in chiaro laddove è richiesta la password sottoposta a hash, fallisce silenziosamente con gli argomenti posizionali. Gli argomenti con nome ti costringono a dichiarare esplicitamente quale valore va assegnato a ciascun parametro, prevenendo questi pericolosi errori.

Sicurezza del refactoring: L'aggiunta di parametri opzionali alle funzioni esistenti interrompe tutti i punti di chiamata che utilizzano argomenti posizionali, a meno che non vengano accodati alla fine. Gli argomenti con nome consentono di aggiungere, riordinare o modificare i parametri senza compromettere il codice esistente, a patto che i nomi dei parametri rimangano coerenti. Questo rende le API più stabili e l'evoluzione meno rischiosa.

Esempi di codice

❌ Non conforme:

function createUser($email, $password, $role, $verified, $sendEmail, $retryCount) {
    $hashedPassword = password_hash($password, PASSWORD_BCRYPT);

    $user = User::create([
        'email' => $email,
        'password' => $hashedPassword,
        'role' => $role,
        'verified' => $verified
    ]);

    if ($sendEmail) {
        sendWelcomeEmail($user->email, $retryCount);
    }

    return $user;
}

// Unclear what each parameter means
createUser('user@example.com', 'secret123', 'admin', true, false, 3);

Perché è errato: Il punto di chiamata non fornisce alcun contesto su cosa significhino true, falsee 3, richiedendo una consultazione costante della firma della funzione. L'inversione di $role e $password oppure $verified e $sendEmail fallirebbe silenziosamente, creando potenzialmente problemi di sicurezza.

✅ Conforme:

function createUser(
    string $email,
    string $password,
    string $role = 'user',
    bool $verified = false,
    bool $sendEmail = true,
    int $retryCount = 3
) {
    $hashedPassword = password_hash($password, PASSWORD_BCRYPT);

    $user = User::create([
        'email' => $email,
        'password' => $hashedPassword,
        'role' => $role,
        'verified' => $verified
    ]);

    if ($sendEmail) {
        sendWelcomeEmail($user->email, $retryCount);
    }

    return $user;
}

// Self-documenting call site
createUser(
    email: 'user@example.com',
    password: 'secret123',
    role: 'admin',
    verified: true,
    sendEmail: false,
    retryCount: 3
);

Perché questo è importante: Lo scopo di ogni parametro è esplicito nel punto di chiamata, rendendo il codice auto-documentante. Gli errori nell'ordine dei parametri diventano impossibili poiché si assegna un nome esplicito a ciascun argomento, e l'aggiunta di nuovi parametri opzionali non romperà il codice esistente.

Conclusione

Utilizza gli argomenti con nome per le funzioni con più di 2-3 parametri, flag booleani o tipi simili che compaiono consecutivamente. La leggera verbosità nel punto di chiamata viene ampiamente ripagata in termini di chiarezza, sicurezza e manutenibilità. Riserva gli argomenti posizionali a funzioni semplici in cui l'ordine dei parametri è ovvio e improbabile che cambi.

FAQ

Hai domande?

Quando dovrei richiedere argomenti con nome anziché renderli opzionali?

In Python, usa * per forzare gli argomenti con nome: def func(a, b, *, named_only). In PHP 8+, gli argomenti con nome sono sempre opzionali, ma puoi incoraggiarne l'uso tramite la documentazione. Richiedi argomenti con nome quando l'ordine dei parametri non è intuitivo o quando compaiono tipi simili in sequenza (più stringhe, booleani o interi).

Gli argomenti con nome influiscono sulle prestazioni?

Nessun impatto misurabile sulle prestazioni nel codice di produzione. L'interprete o il compilatore risolve gli argomenti con nome a runtime, ma questo sovraccarico è trascurabile rispetto al tempo di esecuzione effettivo della funzione. I vantaggi in termini di chiarezza e manutenibilità superano di gran lunga qualsiasi costo teorico di performance.

‍

Come gestisco gli argomenti con nome nei wrapper di funzioni o nei decorator?

In Python, usa **kwargs per inoltrare gli argomenti con nome: wrapper(*args, **kwargs). In PHP, utilizza parametri variadic e l' spacchettamento degli argomenti: function wrapper(...$args) seguito da originalFunc(...$args). Questo preserva gli argomenti con nome quando vengono passati attraverso funzioni intermediarie.

Posso combinare argomenti posizionali e con nome?

Sì, ma gli argomenti posizionali devono precedere gli altri. Sia in Python che in PHP, puoi chiamare func(posArg1, posArg2, namedArg: value). Tuttavia, una volta utilizzato un argomento con nome, tutti i successivi dovranno esserlo. Questo previene ambiguità nella mappatura dei parametri.

Che dire della retrocompatibilità con le versioni precedenti di PHP o Python?

Python supporta gli argomenti con nome sin dalla versione 2. PHP li ha introdotti in PHP 8.0. Per le versioni PHP meno recenti, utilizza array associativi come singolo parametro: function createUser(array $options) e accedi ai valori come $options['email']. In questo modo si ottiene una chiarezza simile mantenendo la compatibilità.

‍

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.