Builder deseni hangi problemi çözer? Telescoping constructor nedir?

Cevap

Builder, çok sayıda (özellikle opsiyonel) parametresi olan karmaşık nesneleri adım adım ve okunaklı şekilde oluşturmayı sağlayan yaratımsal (creational) bir desendir. Nesne en sonda build() ile, gerekirse doğrulanarak oluşturulur.

Telescoping constructor problemi

new Pizza("large", true, false, true, false, "thin");  // hangi true neydi?

Her opsiyonel parametre kombinasyonu için ayrı constructor yazmaya veya uzun, anlamsız boolean listelerine telescoping constructor denir. Okunması ve bakımı zordur, parametre sırası kolayca karışır.

Builder ile

public final class HttpRequest {
    private final String url;
    private final String method;
    private final Map<String, String> headers;
    private final int timeoutMs;

    private HttpRequest(Builder b) {
        this.url = b.url;
        this.method = b.method;
        this.headers = Map.copyOf(b.headers);
        this.timeoutMs = b.timeoutMs;
    }

    public static Builder builder(String url) { return new Builder(url); }

    public static final class Builder {
        private final String url;
        private String method = "GET";
        private final Map<String, String> headers = new HashMap<>();
        private int timeoutMs = 5000;

        private Builder(String url) { this.url = url; }
        public Builder method(String m) { this.method = m; return this; }
        public Builder header(String k, String v) { headers.put(k, v); return this; }
        public Builder timeout(int ms) { this.timeoutMs = ms; return this; }

        public HttpRequest build() {
            if (timeoutMs <= 0) throw new IllegalStateException("timeout > 0 olmalı");
            return new HttpRequest(this);
        }
    }
}

HttpRequest req = HttpRequest.builder("https://api.example.com")
        .method("POST")
        .header("Content-Type", "application/json")
        .timeout(3000)
        .build();

Avantajları

  • Okunabilir, kendini belgeleyen kod (fluent API).
  • Sonuç nesnesi immutable olabilir; tüm alanlar final.
  • Doğrulama tek bir yerde (build()) yapılır.

Ne zaman gereksiz?

2-3 parametreli basit nesnelerde fazladan koddur. Python/Kotlin/C# gibi isimli ve varsayılan parametreleri olan dillerde çoğu zaman gerek kalmaz; Java'da Lombok @Builder veya record kullanılabilir.

  1. Clean code nedir? Yaygın code smell'ler nelerdir?OrtaOOP & Tasarım DesenleriYazılım Müh.
  2. Dependency Injection nedir? IoC container ne işe yarar?ZorOOP & Tasarım DesenleriYazılım Müh.
  3. Strategy deseni nedir? if/else zincirlerini nasıl ortadan kaldırır?OrtaOOP & Tasarım DesenleriYazılım Müh.
  4. Observer deseni nedir? Gerçek hayatta nerelerde karşımıza çıkar?OrtaOOP & Tasarım DesenleriYazılım Müh.
  5. Factory deseni nedir? Ne zaman kullanılır?OrtaOOP & Tasarım DesenleriYazılım Müh.
  6. Singleton deseni nedir? Neden bazen anti-pattern olarak görülür?ZorOOP & Tasarım DesenleriYazılım Müh.

Bu konuda başka bir soru biliyor musun?

Mülakatta karşılaştığın soruları ekle, onaylandıktan sonra yayına alınsın.

Soru ekle