Aikido

Por que você deve usar argumentos nomeados em Python e PHP

Legibilidade

Regra
Utilização os argumentos argumentos para claridade
Argumentos nomeados argumentos tornam o código auto-documentado 
e evitar parâmetros ordem erros.
Use argumentos argumentos quando funções têm mais
do que 2-3 parâmetros ou booleanos sinalizadores.

Idiomas suportados: Python, PHP

Introdução

Funções com múltiplos parâmetros tornam-se pouco claras ao observar o local da chamada. Ler sendEmail('user@example.com', true, false, 30) exige consultar a assinatura da função para entender o que true, falso, e 30 significa. Argumentos nomeados resolvem isso tornando o propósito de cada parâmetro explícito no local da chamada. Eles também previnem bugs decorrentes da reordenação de parâmetros quando as assinaturas de função mudam.

Por que isso importa

Manutenibilidade do código: Argumentos nomeados documentam a intenção no local da chamada sem exigir verificação constante de referência. Quando você vê sendEmail(to: $email, retry: true, async: false, timeout: 30), você entende exatamente o que cada valor controla. Isso elimina a confusão durante a revisão de código e acelera a depuração, já que você não precisa mapear mentalmente argumentos posicionais para nomes de parâmetros.

Implicações de segurança: Erros na ordem dos parâmetros em funções críticas de segurança podem criar vulnerabilidades. Trocar os $username e $password parâmetros, ou passar acidentalmente a senha em texto simples onde a senha hash deveria estar, falha silenciosamente com argumentos posicionais. Argumentos nomeados forçam você a declarar explicitamente qual valor vai para onde, prevenindo esses erros perigosos.

Segurança na Refatoração: Adicionar parâmetros opcionais a funções existentes quebra todos os pontos de chamada com argumentos posicionais, a menos que você os anexe no final. Argumentos nomeados permitem adicionar, reordenar ou alterar parâmetros sem quebrar o código existente, desde que os nomes dos parâmetros permaneçam consistentes. Isso torna as APIs mais estáveis e a evolução menos arriscada.

Exemplos de código

❌ Não-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);

Por que está errado: O local da chamada não fornece contexto para o que é verdadeiro, falso, e 3 significam, exigindo referência constante à assinatura da função. Trocar $role e $password ou $verified e $sendEmail falharia silenciosamente, potencialmente criando problemas de segurança.

✅ Compatível:

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
);

Por que isso importa: O propósito de cada parâmetro é explícito no local da chamada, tornando o código autodocumentado. Erros na ordem dos parâmetros são impossíveis, pois você nomeia explicitamente cada argumento, e adicionar novos parâmetros opcionais não quebrará o código existente.

Conclusão

Use argumentos nomeados para funções com mais de 2-3 parâmetros, flags booleanas ou tipos semelhantes que apareçam consecutivamente. A ligeira verbosidade no local da chamada compensa em clareza, segurança e manutenibilidade. Reserve argumentos posicionais para funções simples onde a ordem dos parâmetros é óbvia e improvável de mudar.

FAQs

Dúvidas?

Quando devo exigir argumentos nomeados em vez de torná-los opcionais?

Em Python, use * para forçar argumentos nomeados: def func(a, b, *, named_only). No PHP 8+, argumentos nomeados são sempre opcionais, mas você pode incentivá-los através da documentação. Exija argumentos nomeados quando a ordem dos parâmetros for pouco intuitiva ou quando tipos semelhantes aparecerem consecutivamente (múltiplas strings, booleanos ou inteiros).

Argumentos nomeados impactam o desempenho?

Nenhum impacto mensurável no desempenho em código de produção. O interpretador ou compilador resolve argumentos nomeados em tempo de execução, mas essa sobrecarga é insignificante em comparação com o tempo real de execução da função. Os benefícios de clareza e manutenibilidade superam em muito qualquer custo teórico de desempenho.

Como lidar com argumentos nomeados em wrappers de função ou decorators?

Em Python, use **kwargs para encaminhar argumentos nomeados: wrapper(*args, **kwargs). Em PHP, use parâmetros variádicos e desempacotamento de argumentos: function wrapper(...$args) então originalFunc(...$args). Isso preserva os argumentos nomeados quando passados por funções intermediárias.

Posso misturar argumentos posicionais e nomeados?

Sim, mas os argumentos posicionais devem vir primeiro. Tanto em Python quanto em PHP, você pode chamar func(posArg1, posArg2, namedArg: value). No entanto, uma vez que você usa um argumento nomeado, todos os argumentos subsequentes devem ser nomeados. Isso evita ambiguidade no mapeamento de parâmetros.

E quanto à compatibilidade retroativa com versões mais antigas de PHP ou Python?

Python suporta argumentos nomeados desde o Python 2. PHP adicionou argumentos nomeados no PHP 8.0. Para versões mais antigas do PHP, use arrays associativos como um único parâmetro: function createUser(array $options) e acesse valores como $options['email']. Isso alcança clareza semelhante enquanto mantém a compatibilidade.

Fique seguro agora

Proteja seu código, Cloud e runtime em um único sistema centralizado.
Encontre e corrija vulnerabilidades rapidamente de forma automática.

Não é necessário cartão de crédito | Resultados da varredura em 32 segundos.