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.

İçindekiler
Bu yazıyı dinle
Yapay zekâ sesiyle yaklaşık 2 dakikalık özet
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.

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.
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.
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.
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.
# 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.
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.
Bu konuda bir projeniz mi var?
İhtiyacınızı birkaç cümleyle anlatın; uygun yaklaşımı birlikte belirleyelim.
İ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.


