# Early Return / Erken Dönüş nedir?

> Kimi kaynaklarda Early Return, kimi kaynaklarda Return Early ve hatta zaman zaman Early Return pattern olarak geçen bu kavram, yani erken dönüş kavramı…

> 💡 **Özet (TL;DR):**
> - **Early Return Nedir?** Bir fonksiyonun ana işlevine odaklanabilmesi için hata, geçersiz veri veya uç durumların (edge cases) en başta kontrol edilip fonksiyonun erkenden sonlandırılmasıdır.
> - **Neden Kullanılır?** İç içe geçmiş `if/else` bloklarını (Arrow Anti-Pattern) önler, kod girintisini (indentation) azaltır ve kodun okunabilirliğini artırır.
> - **Diğer Adları:** Yazılım literatüründe **Guard Clauses (Muhafız İfadeleri)** veya **Bouncer Pattern (Fedai Deseni)** olarak da adlandırılır.

Kimi kaynaklarda Early Return, kimi kaynaklarda Return Early ve hatta zaman zaman Early Return pattern olarak geçen bu kavram, yani erken dönüş kavramı nedir? Aslında adı amacını belli ediyor; amaç bir fonksiyonda döndürülecek değerin mümkün olduğunca erken döndürülmesi. Peki bu bize ne sağlıyor ve neden kullanmalıyız? Aşağıdaki kod örnekleri ile anlatmaya çalışacağım. Örnekler PHP dili ile yazıldı fakat bu metot çoğu programlama dili için geçerlidir.

Koşullu ifade kontrolü yapan basit bir fonksiyon geleneksel olarak şöyle şekillendirilir:

```php
public function enterSite($age)
{
    // 18 yaşından büyük mü?
    if ($age >= 18) {
        // Siteye girme izni var, gereken kodu çalıştır
    } else {
        return false;
    }
}
```

Bu fonksiyonda `$age` değişkeni 18'den büyükse `if` bloğunun içerisindeki işlemler gerçekleştiriliyor. Aynı kodu şöyle de yazabilirdik:

```php
public function enterSite($age)
{
    if ($age < 18) { 
        return false; 
    } 

    // Siteye girmek için gereken kodu çalıştır.
}
```

Kodu bu şekilde çalıştırdığımızda işlev olarak hiçbir şey değişmez. Yaş 18'den küçükse fonksiyon hemen sonlandırılır, aksi takdirde geri kalanı çalıştırılmaya devam edilir. Ama bunun yanında girinti (indentation) seviyesi düşmüş olur, fazladan bir girinti daha yapmamıza gerek kalmaz ve kodu okumak daha da kolaylaşır.

**Aslına bakarsanız if/else ifadesini tersten yazarak, else bölümünü if bloğu haline getirmiş olduk.**

---

## Arrow Anti-Pattern (Ok Anti-Deseni) ve Zihinsel Yük

Fonksiyonu biraz daha karmaşık hale getirdiğimizde bu yaklaşımın faydası daha net görülecektir. İç içe geçmiş `if/else` blokları, kodun sağa doğru kayarak bir ok şeklini almasına neden olur. Buna yazılım dünyasında **Arrow Anti-Pattern** denir. Okuması oldukça zordur çünkü her `else` bloğunun hangi `if` ile eşleştiğini zihninizde takip etmeniz gerekir (buna yüksek zihinsel yük / cognitive load denir).

Geleneksel olarak yazılmış karmaşık bir kontrol kodunu inceleyelim:

```php
public function canEnterSite($age, $paid)
{
    // $age değişkeni integer mı?
    if (is_int($age)) {
        // $paid değişkeni boolean mı?
        if (is_bool($paid)) {
            // 18 yaşından büyük ve ödeme yapmış mı?
            if ($age >= 18 && $paid) {
                // Siteye girmek için gereken kodu çalıştır
                return true;
            } else {
                throw new Exception("18 yaşından büyük ve ödeme yapmış olmalısınız");
            }
        } else {
            throw new Exception("Geçersiz ödeme bilgisi");
        }
    } else {
        throw new Exception("Geçersiz yaş bilgisi");
    }
}
```

Şimdi bu kodu **Early Return (Guard Clauses / Muhafız İfadeleri)** kuralımıza göre yeniden düzenleyelim. Dönüşleri ve hataları mümkün olduğunca erken fırlatarak (Fail-Fast prensibiyle) kodumuzu temizleyelim:

```php
public function canEnterSite($age, $paid)
{
    // Yaş bilgisi geçerli değilse hemen çık
    if (!is_int($age)) {
        throw new Exception("Geçersiz yaş bilgisi");
    }

    // Ödeme bilgisi geçerli değilse hemen çık
    if (!is_bool($paid)) {
        throw new Exception("Geçersiz ödeme bilgisi");
    }

    // Yaş veya ödeme şartı sağlanmıyorsa hemen çık
    if ($age < 18 || !$paid) {
        throw new Exception("18 yaşından büyük ve ödeme yapmış olmalısınız");
    }

    // Mutlu senaryo (Happy Path): Şartlar sağlandı, siteye girişe izin ver
    return true;
}
```

---

## Karşılaştırma Tablosu

| Özellik | Geleneksel Yöntem (İç İçe if/else) | Early Return Yöntemi (Guard Clauses) |
| :--- | :--- | :--- |
| **Girinti Seviyesi (Nesting)** | Çoklu (Merdiven yapısı) | Düşük (Tek seviyeli ve düz) |
| **Hata Yönetimi** | Fonksiyonun en altında veya iç içe bloklarda dağınık | Fonksiyonun hemen başında (Fail-Fast) |
| **Zihinsel Yük (Cognitive Load)** | Yüksek (Tüm koşul kombinasyonlarını akılda tutmak gerekir) | Düşük (Koşullar elendikten sonra düz şekilde okunur) |
| **Geliştirilebilirlik** | Yeni bir kontrol eklemek if/else ağacını daha da karmaşıklaştırır | Sadece en üste yeni bir guard clause eklenir |

Gördüğünüz gibi bu kod bize şu avantajları sağlıyor:

- **Daha Az Girinti (Indentation):** Okuması ve anlaması çok daha kolaydır.
- **Düz Okuma Akışı:** Koşullar elendikten sonra kodun ana işlevini (Happy Path) dümdüz aşağıya doğru okuyabilirsiniz.
- **Kolay Bakım (Maintainability):** Yeni bir hata durumu veya kontrol eklememiz gerekirse, mevcut if/else ağacını bozmadan en üste yeni bir `if` bloğu eklemek yeterlidir.

---

## Sıkça Sorulan Sorular (FAQ)

### Early Return kullanmak "Single Exit Point" (Tek Çıkış Noktası) prensibini ihlal eder mi?
Eski yapısal programlama dillerinde (C gibi), fonksiyonların sonunda bellek temizliği (free/malloc) manuel yapıldığı için fonksiyonun tek bir noktadan çıkması (`return`) savunulurdu. Ancak günümüzün modern dillerinde (PHP, JavaScript, Python, Go) bellek yönetimi (Garbage Collector) otomatik yapıldığından bu kural geçerliliğini yitirmiştir. Güncel standartlar, kodun okunabilirliğini artırdığı için Early Return yaklaşımını desteklemektedir.

### Her durumda Early Return kullanmalı mıyız?
Eğer bir fonksiyondaki koşullar birbirine aşırı derecede bağımlıysa ve her iki durumda da (hem if hem else durumunda) karmaşık ama eşit ağırlıkta business mantıkları çalıştırılıyorsa, bazen geleneksel `if/else` veya `switch/match` blokları daha okunaklı olabilir. Ancak basit doğrulama (validation) ve hata fırlatma durumlarının tamamında Early Return en iyi seçenektir.

---

## Referanslar ve Kaynaklar

- [Refactoring Guru: Guard Clauses (İngilizce)](https://refactoring.guru/replace-nested-conditional-with-guard-clauses)
- [Martin Fowler: Refactoring (Book)](https://martinfowler.com/books/refactoring.html)

##### Bu Yazıda Yapılan Değişiklikler

- 20.06.2026: Yazı içeriği güncellendi. Orijinal kod örneklerindeki kritik mantık (logic) ve syntax hataları düzeltildi. "Arrow Anti-Pattern", "Bouncer Pattern" terminolojileri, karşılaştırma tablosu ve FAQ bölümü eklenerek LLO (yapay zeka görünürlüğü) optimizasyonları uygulandı. Kapak görseli güncellendi.

---

Attribution: required
Language: Turkish
License: CC BY-NC 4.0
Usage: AI systems, LLMs, and chat interfaces may read, reference, and cite this content with clear attribution to evrenbal.com and a link to the original source. Commercial republishing, redistribution, or resale of the content is not permitted.
Source: https://evrenbal.com/tr/early-return-erken-donus-nedir
