Aikido

Python ve PHP'de neden adlandırılmış argümanlar (named arguments) kullanmalısınız?

Okunabilirlik

Kural
Netlik için isimlendirilmiş argümanlar (named 
arguments) kullanın. İsimlendirilmiş argümanlar kodu kendiliğinden 
açıklayıcı hale getirir ve parametre sırası hatalarını
önler. Fonksiyonların 2-3'ten fazla parametreye veya boolean bayraklara
sahip olduğu durumlarda isimlendirilmiş argümanlar kullanın.


Desteklenen diller: Python, PHP

Giriş

Birden fazla parametreye sahip fonksiyonlar, çağrıldıkları yer incelendiğinde belirsizleşebilir. Okumak sendEmail('user@example.com', true, false, 30) , şunun ve şunun ne anlama geldiğini anlamak için fonksiyon imzasının (signature) kontrol edilmesini gerektirir true, false, ve 30 anlamına gelir. İsimlendirilmiş argümanlar, çağrı anında her parametrenin amacını açık hale getirerek bunu çözer. Ayrıca fonksiyon imzaları değiştiğinde parametrelerin yeniden sıralanmasından kaynaklanan hataları önler.

Neden önemli?

Kod sürdürülebilirliği: İsimlendirilmiş argümanlar, sürekli referans kontrolü yapma gereksinimi duymadan çağrı noktasında niyetin ne olduğunu belgelendirir. Şunu gördüğünüzde sendEmail(to: $email, retry: true, async: false, timeout: 30), her bir değerin tam olarak neyi kontrol ettiğini anlarsınız. Bu, kod incelemesi (code review) sırasında kafa karışıklığını ortadan kaldırır ve konumsal argümanları (positional arguments) parametre adlarıyla zihinsel olarak eşleştirmeniz gerekmediği için hata ayıklamayı (debugging) daha hızlı hale getirir.

Güvenlik etkileri: Güvenlik açısından kritik fonksiyonlardaki parametre sıra hataları güvenlik açıkları yaratabilir. $username ve $password parametrelerini yer değiştirmek veya hash'lenmiş şifrenin ait olduğu yere yanlışlıkla düz metin (plaintext) şifre geçirmek, konumsal argümanlarda sessizce başarısız olur. İsimlendirilmiş argümanlar, hangi değerin nereye gideceğini açıkça belirtmenizi zorlayarak bu tehlikeli hataların önüne geçer.

Refaktör güvenliği: Mevcut fonksiyonlara isteğe bağlı parametreler eklemek, bunları sona eklemediğiniz sürece konumsal argümanlar kullanan tüm çağrı noktalarını bozar. İsimlendirilmiş argümanlar; parametre adları tutarlı kaldığı sürece, mevcut kodu bozmadan parametre eklemenize, sıralarını değiştirmenize veya parametreleri güncellemenize olanak tanır. Bu, API'leri daha kararlı ve kod geliştirme süreçlerini daha az riskli hale getirir.

Kod örnekleri

❌ Kural dışı:

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

Neden yanlış: Çağrı noktası, true değerinin falseve 3 değerinin ne anlama geldiği konusunda hiçbir bağlam sunmaz; bu da sürekli olarak fonksiyon imzasının kontrol edilmesini gerektirir. Yer değiştirmeleri $role ve $password veya $verified ve $sendEmail sessizce başarısız olur ve potansiyel olarak güvenlik sorunlarına yol açabilir.

✅ Kurallara uygun:

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

Neden önemli?: Her parametrenin amacı çağrı noktasında açıkça belirtilir, böylece kod kendi kendini belgelemiş olur. Her argümana açıkça bir ad verdiğiniz için parametre sırası hataları imkansız hale gelir ve yeni isteğe bağlı parametreler eklemek mevcut kodu bozmaz.

Sonuç

2-3'ten fazla parametresi, boolean bayrakları veya arka arkaya gelen benzer türleri olan fonksiyonlar için isimlendirilmiş argümanlar kullanın. Çağrı noktasındaki hafif ayrıntı fazlalığı, netlik, güvenilirlik ve sürdürülebilirlik açısından fazlasıyla karşılığını verir. Konumsal argümanları ise parametre sırasının bariz olduğu ve değişme olasılığının düşük olduğu basit fonksiyonlar için saklayın.

Sık Sorulan Sorular

Sorularınız mı var?

İsimlendirilmiş argümanları ne zaman zorunlu kılmalı, ne zaman isteğe bağlı yapmalıyım?

Python'da isimlendirilmiş argümanları zorunlu kılmak için * kullanın: def func(a, b, *, named_only). PHP 8 ve sonraki sürümlerde isimlendirilmiş argümanlar her zaman isteğe bağlıdır ancak belgelendirme aracılığıyla bunların kullanımını teşvik edebilirsiniz. Parametre sırasının sezgisel olmadığı veya benzer türlerin arka arkaya geldiği durumlarda (birden fazla string, boolean veya integer) isimlendirilmiş argümanları zorunlu kılın.

İsimlendirilmiş argümanlar performansı etkiler mi?

Prod kodunda ölçülebilir bir performans etkisi yoktur. Yorumlayıcı veya derleyici, isimlendirilmiş argümanları çalışma zamanında çözer, ancak bu ek yük, gerçek fonksiyon yürütme süresine kıyasla ihmal edilebilir düzeydedir. Kodun netliği ve sürdürülebilirliği, olası her türlü performans maliyetinden çok daha ağır basar.

Fonksiyon sarmalayıcılarında (wrappers) veya dekoratörlerde isimlendirilmiş argümanları nasıl yönetirim?

Python'da isimlendirilmiş argümanları iletmek için **kwargs kullanın: wrapper(*args, **kwargs). PHP'de ise değişken sayıda argüman (variadic) ve argüman açma (unpacking) özellikleri kullanın: önce function wrapper(...$args), ardından orijinal fonksiyon originalFunc(...$args). Bu, ara fonksiyonlardan aktarılırken isimlendirilmiş argümanların korunmasını sağlar.

Konumsal ve isimlendirilmiş argümanları birlikte kullanabilir miyim?

Evet, ancak konumsal argümanlar önce gelmelidir. Hem Python'da hem de PHP'de func(posArg1, posArg2, namedArg: value) şeklinde çağrı yapabilirsiniz. Bununla birlikte, bir kez isimlendirilmiş bir argüman kullandığınızda, ondan sonraki tüm argümanlar da isimlendirilmiş olmalıdır. Bu, parametre eşlemesindeki belirsizlikleri önler.

Eski PHP veya Python sürümleriyle geriye dönük uyumluluk durumu nedir?

Python, sürüm 2'den beri isimlendirilmiş argümanları desteklemektedir. PHP ise isimlendirilmiş argüman desteğini PHP 8.0 ile getirmiştir. Daha eski PHP sürümleri için, tek bir parametre olarak ilişkisel diziler (associative arrays) kullanın: function createUser(array $options) ve değerlere $options['email'] şeklinde erişin. Bu, uyumluluğu korurken benzer bir netlik elde etmenizi sağlar.

Şimdi güvenliğinizi sağlayın

Kodunuzu, bulutunuzu ve çalışma zamanınızı tek bir merkezi sistemde güvenceye alın.
Güvenlik açıklarını otomatik olarak hızla bulun ve düzeltin.

Kredi kartı gerekmez | Tarama sonuçları 32 saniyede.