Aikido

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

Leggibilità

Regola
Utilizzo argomenti argomenti per chiarezza
Argomenti argomenti rendono il codice autodocumentante 
e impediscono parametro ordine errori.
Utilizzare argomenti argomenti quando le funzioni hanno più
di 2-3 parametri o booleani .

Linguaggi supportati: Python, PHP

Introduzione

Le funzioni con più parametri risultano poco chiare quando si osserva il punto di chiamata. Leggere sendEmail('user@example.com', true, false, 30) richiede di consultare la firma della funzione per capire cosa vero, false, e 30 significa. Gli argomenti denominati risolvono questo problema rendendo esplicito lo scopo di ciascun parametro nel punto di chiamata. Inoltre, impediscono che si verifichino bug dovuti al riordino dei parametri quando cambiano le firme delle funzioni.

Perché è importante

Manutenibilità del codice: Gli argomenti denominati chiariscono l'intento nel punto di chiamata senza richiedere una verifica costante dei riferimenti. Quando si vede sendEmail(to: $email, retry: true, async: false, timeout: 30), si capisce esattamente a cosa corrisponde ciascun valore. Ciò elimina ogni confusione durante la revisione del codice e velocizza il debug, poiché non è necessario associare mentalmente gli argomenti posizionali ai nomi dei parametri.

Implicazioni in materia di sicurezza: Errori nell'ordine dei parametri nelle funzioni critiche per la sicurezza possono creare vulnerabilità. Lo scambio di $username e $password I parametri, o l'inserimento accidentale della password in chiaro al posto di quella con hash, causano un errore silenzioso con gli argomenti posizionali. Gli argomenti denominati obbligano a specificare esplicitamente quale valore va in quale posizione, evitando così questi pericolosi errori.

Sicurezza nella rifattorizzazione: l'aggiunta di parametri opzionali alle funzioni esistenti compromette il funzionamento di tutti i punti di chiamata con argomenti posizionali, a meno che non vengano inseriti alla fine. Gli argomenti denominati consentono di aggiungere, riordinare o modificare i parametri senza compromettere il codice esistente, purché i nomi dei parametri rimangano coerenti. Ciò 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é è sbagliato: Il sito da cui proviene la chiamata non fornisce alcun contesto su cosa sia vero, false, e 3 significano che è necessario fare costante riferimento alla firma della funzione. Scambiando $ruolo e $password oppure $verificato e $sendEmail si arresterebbe in modo silenzioso, 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é è importante: lo scopo di ogni parametro è esplicito nel punto di chiamata, rendendo il codice autodocumentante. È impossibile commettere errori nell'ordine dei parametri, poiché ogni argomento viene denominato esplicitamente, e l'aggiunta di nuovi parametri opzionali non comprometterà il funzionamento del codice esistente.

Conclusione

Utilizza argomenti con nome per le funzioni con più di 2-3 parametri, flag booleani o tipi simili che compaiono in successione. La leggera verbosità nel punto di chiamata si ripaga in termini di chiarezza, sicurezza e manutenibilità. Riserva gli argomenti posizionali alle funzioni semplici in cui l'ordine dei parametri è ovvio e difficilmente soggetto a modifiche.

Domande frequenti

Hai delle domande?

Quando è opportuno utilizzare argomenti con nome e quando invece renderli opzionali?

In Python, usa * per rendere obbligatori gli argomenti con nome: def func(a, b, *, named_only). In PHP 8 e versioni successive, gli argomenti con nome sono sempre facoltativi, ma è possibile incoraggiarne l'uso tramite la documentazione. Richiedi l'uso di argomenti con nome quando l'ordine dei parametri non è intuitivo o quando tipi simili compaiono consecutivamente (più stringhe, valori booleani o interi).

Gli argomenti con nome influiscono sulle prestazioni?

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

Come si gestiscono gli argomenti con nome nei wrapper di funzioni o nei decoratori?

In Python, usa **kwargs per inoltrare gli argomenti con nome: wrapper(*args, **kwargs). In PHP, usa i parametri variadici e l'unpacking degli argomenti: function wrapper(...$args) e poi originalFunc(...$args). In questo modo si mantengono gli argomenti con nome quando vengono passati attraverso funzioni intermedie.

Posso combinare argomenti posizionali e argomenti con nome?

Sì, ma gli argomenti posizionali devono essere indicati per primi. Sia in Python che in PHP è possibile chiamare la funzione con la sintassi func(posArg1, posArg2, namedArg: value). Tuttavia, una volta utilizzato un argomento con nome, tutti gli argomenti successivi devono essere specificati con un nome. Ciò evita ambiguità nell'assegnazione dei parametri.

E per quanto riguarda la retrocompatibilità con le versioni precedenti di PHP o Python?

Python supporta gli argomenti denominati a partire dalla versione 2. PHP ha introdotto gli argomenti denominati nella versione 8.0. Per le versioni precedenti di PHP, è possibile utilizzare gli array associativi come parametro unico: function createUser(array $options) e accedere ai valori tramite $options['email']. In questo modo si ottiene una chiarezza simile, mantenendo al contempo 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.