İçeriğe geç
Çılgın Yazılım

Yazılım Geliştirme kod örnekli

Erken Dönüş (Early Return) ile İç İçe If Cehennemine Son Vermek

Beş kat iç içe geçmiş if bloğu okunmaz değil, sadece yanlış sıralanmıştır. Erken dönüş desenini adım adım uygulayalım.

Çılgın Yazılım 4 dk okuma

Erken Dönüş (Early Return) ile İç İçe If Cehennemine Son Vermek
İçindekiler
  1. Problem: mutlu yol en dipte
  2. Çözüm: önce ele, sonra çalış
  3. Aynı desen JavaScript tarafında
  4. Desenin sınırları
  5. Kaynak temizliği gerektiren kod
  6. Transaction içinde
  7. Anlamlı tek çıkış gerektiren ekip kuralları
  8. Ölçülebilir kazanç
  9. Sonuç

Erken dönüş deseni, bir fonksiyonun geçersiz durumları en başta eleyip geri dönmesi, asıl işi ise girintisiz biçimde en dışta yapmasıdır. İngilizce kaynaklarda early return ya da guard clause adıyla geçer. Yaptığı iş kulağa basit gelir, ama beş kat iç içe geçmiş bir if bloğunu tek bakışta anlaşılır hâle getiren şey çoğu zaman tam olarak budur.

Erken dönüş öncesi ve sonrası kod yapısı
Girinti derinliği, okunabilirliğin en ucuz ölçüsüdür.

Problem: mutlu yol en dipte

İç içe koşullarla yazılmış kodun ortak özelliği şudur: fonksiyonun asıl yaptığı iş, en derin girinti seviyesindedir. Okuyan kişi o satıra ulaşana kadar beş ayrı koşulu zihninde tutmak zorunda kalır.

PHP
function siparisiOnayla(?array $siparis, ?array $kullanici): string
{
    if ($siparis !== null) {
        if ($kullanici !== null) {
            if ($siparis['durum'] === 'bekliyor') {
                if ($siparis['tutar'] > 0) {
                    if ($kullanici['bakiye'] >= $siparis['tutar']) {
                        // Asıl iş burada — beşinci seviyede
                        return 'onaylandi';
                    } else {
                        return 'yetersiz_bakiye';
                    }
                } else {
                    return 'gecersiz_tutar';
                }
            } else {
                return 'gecersiz_durum';
            }
        } else {
            return 'kullanici_yok';
        }
    }

    return 'siparis_yok';
}

Bu kodun hatası mantıkta değil, sıralamada. Her else dalı bir hata durumu; her if dalı ise bir sonraki hata kontrolüne kapı açıyor. Yani gerçekte düz bir doğrulama listesi var, ama piramit gibi yazılmış.

Çözüm: önce ele, sonra çalış

Erken dönüş uygularken kural tek cümledir: fonksiyonun devam edemeyeceği her durumu en başta yakala ve hemen dön.

PHP
function siparisiOnayla(?array $siparis, ?array $kullanici): string
{
    if ($siparis === null)                       { return 'siparis_yok'; }
    if ($kullanici === null)                     { return 'kullanici_yok'; }
    if ($siparis['durum'] !== 'bekliyor')        { return 'gecersiz_durum'; }
    if ($siparis['tutar'] <= 0)                  { return 'gecersiz_tutar'; }
    if ($kullanici['bakiye'] < $siparis['tutar']) { return 'yetersiz_bakiye'; }

    // Mutlu yol: girintisiz, en görünür yerde
    return 'onaylandi';
}

Satır sayısı yarıya indi, girinti derinliği beşten bire düştü ve en önemlisi: fonksiyonun ne yaptığı son satırda, aramaya gerek kalmadan görünüyor. Bu, kod incelemesinde geri bildirimin hızlanmasını da sağlar — inceleyen kişi zihinsel yığın tutmak zorunda kalmaz.

Aynı desen JavaScript tarafında

Asenkron kodda erken dönüş daha da değerlidir, çünkü await zincirleri girintiyle birlikte hızla okunmaz hâle gelir.

JavaScript
async function kullaniciProfiliGetir(id) {
  if (!id) return { hata: 'id_gerekli' };

  const yanit = await fetch(`/api/v1/users/${id}`);
  if (!yanit.ok) return { hata: 'istek_basarisiz', kod: yanit.status };

  const veri = await yanit.json();
  if (!veri.aktif) return { hata: 'pasif_hesap' };

  return { profil: veri };
}

Pratik ölçüt: bir fonksiyonda üçüncü girinti seviyesini gördüğünüzde durup sorun — "bu koşullardan hangisi aslında bir doğrulama?" Cevap genellikle "hepsi"dir.

Desenin sınırları

Erken dönüş her yere uygun değildir. Üç durumda dikkatli olmak gerekir.

Kaynak temizliği gerektiren kod

Dosya tanıtıcısı, veritabanı bağlantısı veya kilit açtıysanız, ortadan dönmek temizliği atlatabilir. Bu durumda try/finally ya da dilin sunduğu kapsam-sonu mekanizmasını kullanın; erken dönüş yine mümkündür ama temizlik finally içinde olmalıdır.

Transaction içinde

Veritabanı işlemi açtıysanız ve ortadan dönerseniz, işlem askıda kalabilir. CodeIgniter'da $db->transException(true) veya açık rollback çağrısı bu riski kapatır. Bu konuya transaction izolasyon seviyeleri yazısında ayrıntılı değinmiştik.

Anlamlı tek çıkış gerektiren ekip kuralları

Bazı ekiplerde "tek giriş, tek çıkış" kuralı yerleşiktir. Bu kural eski C alışkanlıklarından gelir ve modern dillerde faydası tartışmalıdır; yine de ekip kuralıysa tartışmayı kod incelemesinde değil, teknik tasarım notu düzeyinde açmak daha verimlidir.

Aynı sadeleştirme mantığı veri yapılarında da geçerlidir; değişmez nesneler koşul sayısını baştan azaltır.

Ölçülebilir kazanç

Erken dönüşün faydası öznel bir "daha güzel duruyor" hissi değildir; ölçülebilir. Döngüsel karmaşıklık (cyclomatic complexity) aynı kalır — koşul sayısı değişmemiştir — ama bilişsel karmaşıklık (cognitive complexity) belirgin biçimde düşer, çünkü bu metrik iç içe geçmeyi ayrıca cezalandırır. PHPStan, SonarQube veya ESLint'in complexity kuralı bu farkı doğrudan raporlar.

Bash
# Bilişsel karmaşıklığı raporlayan hızlı bir kontrol
composer require --dev phpstan/phpstan
vendor/bin/phpstan analyse app --level=6

Ölçüm alışkanlığı önemlidir: refactoring öncesi ve sonrası aynı komutu çalıştırıp sayıyı kaydedin. Aksi hâlde "daha temiz oldu" iddiası kod incelemesinde tartışma konusu olmaya devam eder. Metodun kaynağı ve tanımı için SonarSource'un bilişsel karmaşıklık raporu iyi bir başvuru noktasıdır.

Sonuç

Erken dönüş deseni, kod yazmanın değil kod sıralamanın tekniğidir: geçersiz durumları başa alır, asıl işi en görünür yere taşır. Uygularken üç adımı izleyin — her else dalını bir doğrulama olarak yeniden yazın, doğrulamaları fonksiyonun başına toplayın, mutlu yolu girintisiz bırakın. Kaynak temizliği ve transaction sınırlarına dikkat ettiğiniz sürece bu değişiklik davranışı değiştirmez, yalnızca okunabilirliği artırır. Bir sonraki kod incelemesinde üç kat girintiden derin bir fonksiyon gördüğünüzde bu deseni önerin; çoğu zaman beş dakikalık bir değişiklik, aylarca sürecek bir okuma yükünü ortadan kaldırır.

Beğeniniz benzer içerikleri öne çıkarmamıza yardımcı olur.

Sık sorulan sorular

Erken dönüş "tek çıkış noktası" ilkesine aykırı değil mi?

Tek çıkış ilkesi, elle bellek yönetimi yapılan C gibi dillerde kaynak sızıntısını önlemek için doğmuştu. Çöp toplayıcısı veya kapsam-sonu temizliği olan modern dillerde bu gerekçe büyük ölçüde ortadan kalkar. Kaynak açan fonksiyonlarda ise erken dönüşü try/finally ile birlikte kullanmak hem güvenli hem okunur olur.

Kaç koşuldan sonra erken dönüşe geçmeliyim?

Sayıdan çok girinti derinliği iyi bir ölçüttür. Üçüncü seviyeye inen her fonksiyon adaydır. Tek bir if/else ikilisini erken dönüşe çevirmek genelde kazanç sağlamaz, hatta gereksiz gürültü yaratabilir.

Erken dönüş performansı etkiler mi?

Pratikte hayır. Koşul sayısı değişmediği için yürütülen karşılaştırma adedi aynı kalır; bazı durumlarda geçersiz girdi daha erken elendiği için birkaç işlem tasarrufu bile olur. Kazanç performansta değil, bakım maliyetindedir.

Bu deseni mevcut kod tabanına nasıl yayarım?

Toplu bir refactoring yerine "dokunduğunuz yerde uygulayın" kuralı işe yarar. Bir hata düzeltirken veya özellik eklerken o fonksiyonu erken dönüşe çevirin. Böylece değişiklikler küçük kalır, kod incelemesi kolaylaşır ve regresyon riski dağıtılmış olur.

Yazan

Çılgın Yazılım

Ben Evren Çılgın; yazılım geliştirme, web teknolojileri ve sistem tasarımı alanlarında uzmanlaşmış bir geliştiriciyim. Uzun yıllardır hem frontend hem de backend tarafında üretken, ölçeklenebilir ve kullanıcı dostu çözümler üretiyorum.

Hakkımızda Bize ulaşın

Bu konuda bir projeniz mi var?

İhtiyacınızı birkaç cümleyle anlatın; uygun yaklaşımı birlikte belirleyelim.

Projenizi Anlatın

İlgili yazılar

Yorumlar

Henüz yorum yok. Sorunuzu ya da deneyiminizi ilk siz yazın.

Yorum yazın

Yorumunuz onaylandıktan sonra yayınlanır. Ekibimiz gerekirse konuyla ilgili bir yanıt da paylaşır.

Yayınlanmaz; yalnızca gerektiğinde size ulaşmak için.

En az 10 karakter.

Tüm yazılar