ルール
可読性のために 名前付き 引数 を使用する
名前付き 引数 はコードを自己文書化し、 引数の順序間違いを防ぎます。
関数が 2~3個以上の 引数を持つ場合や、 真偽値 フラグを持つ場合は、 名前付き 引数 を使用してください。
対応言語: Python, PHPはじめに
複数のパラメーターを持つ関数は、呼び出し箇所を見ると不明瞭になります。例えば、 sendEmail('user@example.com', true, false, 30) 何を理解するために、関数シグネチャを調べる必要があります。 true, false、および 30 意味します。名前付き引数は、呼び出しサイトで各パラメータの目的を明示することでこれを解決します。また、関数シグネチャが変更されたときにパラメータの順序変更によるバグを防ぎます。
なぜ重要なのか
コードの保守性: 名前付き引数は、常に参照を確認することなく、呼び出しサイトでの意図を明確にします。これを見たときに sendEmail(to: $email, retry: true, async: false, timeout: 30)、各値が何を制御しているかを正確に理解できます。これにより、コードレビュー中の混乱が解消され、位置引数をパラメータ名に頭の中でマッピングする必要がないため、デバッグが高速化されます。
セキュリティへの影響: セキュリティ上重要な関数におけるパラメーターの順序ミスは、脆弱性を生み出す可能性があります。例えば、 $username そして $password パラメーター、またはハッシュ化されたパスワードが属する場所に誤ってプレーンテキストのパスワードを渡すと、位置引数ではサイレントに失敗します。名前付き引数を使用すると、どの値がどこに行くかを明示的に指定できるため、これらの危険な間違いを防ぐことができます。
リファクタリングの安全性: 既存の関数にオプションパラメータを追加する場合、末尾に追加しない限り、位置引数を持つすべての呼び出し元が壊れます。名前付き引数を使用すると、パラメータ名が一貫している限り、既存のコードを壊すことなくパラメータを追加、並べ替え、または変更できます。これにより、APIがより安定し、進化のリスクが低減されます。
コード例
❌ 非準拠:
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);
誤っている理由: 呼び出し元は、何が真実であるかについてのコンテキストを提供しません。 false, および3が何を意味するかを、関数シグネチャへの絶え間ない参照を必要とします。入れ替えることで $role そして $password または $verified そして $sendEmail サイレントに失敗し、セキュリティ問題を引き起こす可能性があります。
✅ 準拠済み:
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
);
これが重要な理由:各パラメータの目的は呼び出しサイトで明示されており、コードが自己文書化されます。各引数を明示的に指定するため、パラメータの順序間違いは発生しません。また、新しいオプションパラメータを追加しても既存のコードが壊れることはありません。
まとめ
パラメータが2〜3個を超える関数、ブール型フラグ、または連続して出現する類似の型を持つ関数には、名前付き引数を使用してください。呼び出しサイトでのわずかな冗長性は、明確さ、安全性、および保守性の向上によって補われます。パラメータの順序が明白で変更される可能性が低い単純な関数には、位置引数を予約してください。

