Aikido

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

Okunabilirlik

Kural
Kullanım adlandırılmış argümanları açıklık anlaşılırlık
Adlandırılmış argümanlar kullanımı kodun kendini açıklayıcı 
ve önler parametre sırasını hatalarını önlemek.
Kullan adlandırılmış argümanları kullanın fonksiyonlar içinde daha
funktiyonlar 2-3'ten parametre veya boolean bayrakları.

Desteklenen diller: Python, PHP

Giriş

Birden fazla parametreye sahip fonksiyonlar, çağrıldıkları yerlere bakıldığında anlaşılması zor hale gelir. Okuma sendEmail('user@example.com', true, false, 30) ne olduğunu anlamak için fonksiyon imzasını araştırmak gerekir doğru, falseve 30 anlamına gelir. Adlandırılmış argümanlar, her bir parametrenin amacını çağrı noktasında açıkça belirtmek suretiyle bu sorunu çözer. Ayrıca, fonksiyon imzaları değiştiğinde parametrelerin sırasının değişmesinden kaynaklanan hataları da önler.

Neden önemli?

Kodun bakım kolaylığı: Adlı argümanlar, sabit referans kontrolü gerektirmeden çağrı noktasında amacın ne olduğunu açıklar. Şunu gördüğünüzde sendEmail(to: $email, retry: true, async: false, timeout: 30), her bir değerin neyi kontrol ettiğini tam olarak anlarsınız. Bu, kod incelemesi sırasında karışıklığı ortadan kaldırır ve konumsal argümanları zihninizde parametre adlarıyla eşleştirmek zorunda kalmadığınız için hata ayıklamayı hızlandırır.

Güvenlikle ilgili hususlar: Güvenlik açısından kritik işlevlerdeki parametre sırası hataları, güvenlik açıklarına yol açabilir. Şunların yerlerinin değiştirilmesi: $kullanıcıadı ve $password Parametreler ya da karma şifrenin girilmesi gereken yere yanlışlıkla düz metin şifrenin girilmesi gibi durumlar, konumsal argümanlar kullanıldığında herhangi bir hata mesajı vermeden başarısızlıkla sonuçlanır. Adlandırılmış argümanlar ise hangi değerin nereye ait olduğunu açıkça belirtmenizi zorunlu kılar ve bu tür tehlikeli hataları önler.

Yeniden yapılandırma güvenliği: Mevcut işlevlere isteğe bağlı parametreler eklemek, bunları sonuna eklemediğiniz sürece konumsal argüman içeren tüm çağrı noktalarını bozar. Adlandırılmış argümanlar, parametre adları tutarlı kaldığı sürece mevcut kodu bozmadan parametre eklemenize, sıralarını değiştirmenize veya parametreleri değiştirmenize olanak tanır. Bu, API’leri daha istikrarlı hale getirir ve geliştirme sürecini daha az riskli kılar.

Kod örnekleri

❌ Uygun değil:

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ı kaynağı, neyin doğru olduğuna dair hiçbir bağlam sunmamaktadır, false, ve 3. seçenek ise fonksiyon imzasına sürekli başvurmayı gerektirir. Değiştirme $role ve $password veya $doğrulanmış ve $sendEmail sessizce hata verecek ve bu da potansiyel olarak güvenlik sorunlarına yol açabilecektir.

✅ Uygunluk:

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

Bunun önemi: Her parametrenin amacı çağrı noktasında açıkça belirtilir, bu da kodun kendi kendini açıklamasını sağlar. Her argümanı açıkça adlandırdığınız için parametre sırası hataları ortaya çıkmaz ve yeni isteğe bağlı parametreler eklemek mevcut kodu bozmaz.

Sonuç

2-3'ten fazla parametreye sahip işlevler, boole bayrakları veya arka arkaya gelen benzer türler için adlandırılmış argümanlar kullanın. Çağırma noktasında ortaya çıkan bu hafif ayrıntı, netlik, güvenlik ve bakım kolaylığı açısından kendini amorti eder. Konumsal argümanları, parametre sırasının açık olduğu ve değişme olasılığının düşük olduğu basit işlevler için saklayın.

Sık Sorulan Sorular

Sorularınız mı var?

Adlandırılmış argümanları ne zaman zorunlu kılmalıyım, ne zaman ise isteğe bağlı bırakmalıyım?

Python'da, adlandırılmış argümanları zorunlu kılmak için * kullanın: def func(a, b, *, named_only). PHP 8 ve üzeri sürümlerde, adlandırılmış argümanlar her zaman isteğe bağlıdır; ancak belgeler aracılığıyla bunların kullanılmasını teşvik edebilirsiniz. Parametre sırası sezgisel olmadığında veya benzer türler arka arkaya geldiğinde (birden fazla dize, boole değeri veya tamsayı) adlandırılmış argümanların kullanılmasını zorunlu kılın.

Adlandırılmış argümanlar performansı etkiler mi?

Üretim kodunda ölçülebilir bir performans etkisi yoktur. Yorumlayıcı veya derleyici, adlandırılmış argümanları çalışma zamanında çözümler; ancak bu ek yük, fonksiyonun gerçek yürütme süresiyle karşılaştırıldığında ihmal edilebilir düzeydedir. Anlaşılırlık ve bakım kolaylığı açısından sağlanan faydalar, teorik performans maliyetini çok daha fazla telafi eder.

Fonksiyon sarmalayıcılarında veya dekoratörlerde adlandırılmış argümanları nasıl ele almalıyım?

Python'da, adlandırılmış argümanları iletmek için **kwargs kullanın: wrapper(*args, **kwargs). PHP'de ise değişken sayıda parametre ve argüman açma özelliğini kullanın: function wrapper(...$args), ardından originalFunc(...$args). Bu yöntem, ara fonksiyonlar aracılığıyla aktarıldığında adlandırılmış argümanların korunmasını sağlar.

Konumsal ve adlı argümanları birbirine karıştırabilir miyim?

Evet, ancak konum argümanları önce gelmelidir. Hem Python’da hem de PHP’de func(posArg1, posArg2, namedArg: value) şeklinde çağrı yapabilirsiniz. Ancak, bir kez adlı argüman kullandığınızda, ondan sonraki tüm argümanlar adlı olmalıdır. Bu, parametre eşlemede belirsizliği önler.

Peki ya eski PHP veya Python sürümleriyle geriye dönük uyumluluk ne durumda?

Python, Python 2'den beri adlandırılmış argümanları desteklemektedir. PHP ise adlandırılmış argümanları PHP 8.0 sürümünde eklemiştir. Daha eski PHP sürümlerinde, tek bir parametre olarak ilişkilendirmeli diziler kullanın: function createUser(array $options) ve değerlere $options['email'] gibi erişin. Bu, uyumluluğu korurken benzer bir netlik 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.