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.
İlgili OOP & Tasarım Desenleri soruları
- Clean code nedir? Yaygın code smell'ler nelerdir?
- Dependency Injection nedir? IoC container ne işe yarar?
- Strategy deseni nedir? if/else zincirlerini nasıl ortadan kaldırır?
- Observer deseni nedir? Gerçek hayatta nerelerde karşımıza çıkar?
- Factory deseni nedir? Ne zaman kullanılır?
- Singleton deseni nedir? Neden bazen anti-pattern olarak görülür?
Bu konuda başka bir soru biliyor musun?
Mülakatta karşılaştığın soruları ekle, onaylandıktan sonra yayına alınsın.