Sitemap

Dart Dilinde Nesne Tabanlı Programlama(OOP) — Constructor (Kurucu) Kavramı |2.Bölüm

5 min readJun 20, 2025

--

Dart dilinde Nesne Tabanlı Programlama makalemizin 2.bölümüyle sizlerleyim. Bir önceki yazıma buradan ulaşabilirsiniz.

ilk bölümü bitirirken son kısımda bunları yazmıştık;

Dikkat ettiyseniz nesnelere sürekli elle tek tek atıyoruz, Constructor kavramıyla bu nesnelere başlangıç değerleri vermeyi öğreneceğiz.

Peki neden nesnelere başlangıç değeri vermemiz gerekiyor hadi gelin bu sorunun cevabıyla 2. bölümü başlatalım

CONSTRUCTOR(KURUCULAR)

Bir önceki yazımızda, class kullanarak kendi veri tiplerimizi nasıl oluşturacağımızı ve bu sınıflardan nesneler üreterek onları nasıl kullanacağımızı öğrendik. Kullanici adında bir kalıp oluşturduk ve kullanici1 adında bir nesne yarattık. Ancak bir sorunumuz vardı:

var kullanici1 = Kullanici();
kullanici1.ad = 'Ali';
kullanici1.soyad = 'Veli';
kullanici1.eposta = 'ali.veli@email.com';
// ... ve diğer tüm özellikler

Bu yöntem çalışıyor, evet ama hem çok zahmetli hem de çok tehlikeli. Neden mi?

  1. Unutkanlık Riski: Ya bir kullanıcının eposta özelliğini atamayı unutursak? O zaman o özellik başlangıç değeriyle (‘’ veya null) kalır ve programın ilerleyen bir yerinde beklenmedik hatalara yol açabilir.
  2. Dağınıklık: Nesneyi oluşturmak bir satır, verilerini doldurmak beş satır. Bu, kodun okunabilirliğini düşürür. Bir nesnenin, oluşturulduğu anda “kullanıma hazır” ve tutarlı bir durumda olmasını isteriz.

İşte tam bu noktada, nesnelerin “doğum anını” yöneten çok özel bir mekanizma devreye giriyor: Constructor (Yapıcı Metot).

Constructor, bir sınıftan nesne oluşturulduğu anda otomatik olarak ve sadece bir kez çalışan özel bir metottur. Adı her zaman sınıfın adıyla aynıdır.

Ne işe yarar?

Temel amacı, bir nesneye “hayata merhaba” derken ona gerekli olan başlangıç değerlerini atamak ve onu tutarlı, kullanıma hazır bir hale getirmektir. Tıpkı bir araba fabrikadan çıkarken motorunun, tekerleklerinin ve direksiyonunun takılıp “sürülebilir” halde gelmesi gibi.

Constructorlar kendi içinde üçe ayrılır diyebiliriz. Default, Parametreli ve Named. Görevleri temelde aynıdır.

a) Default Constructor

Aslında farkında olmadan hep bir constructor kullandık. Eğer bir sınıfın içine hiçbir constructor yazmazsanız, Dart sizin için arka planda parametresiz, boş bir tane oluşturur. Buna Default Constructor denir.

class Kullanici {
String ad = '';
String soyad = '';

// Biz yazmasak da Dart arka planda bunu oluşturur:
// Kullanici() {}
}

// Bu yüzden bu kod çalışır:
var kullanici = Kullanici();

Bu yapıcı metot bir iş yapmaz, sadece nesnenin oluşturulmasına izin verir. Ama biz bunu daha akıllı hale getirebiliriz.

b) Parametreli Constructor

Bu yapıcı metot nesneleri oluştururken ihtiyacı olan verileri dışarıdan alır

class Kullanici {
String ad;
String soyad;
int takipciSayisi;

// İşte bizim Parametreli Constructor'ımız!
Kullanici(String gelenAd, String gelenSoyad, int gelenTakipciSayisi) {
ad = gelenAd;
soyad = gelenSoyad;
takipciSayisi = gelenTakipciSayisi;
}

void bilgileriGoster() {
print('Ad: $ad, Soyad: $soyad, Takipçi: $takipciSayisi');
}
}

Constructor tanımladık ve dışarıdan parametre almasını söyledik peki bunu nasıl kullanacağız.

void main() {
// Artık nesneyi oluştururken verileri parantez içinde gönderiyoruz.
var kullanici1 = Kullanici('Ali', 'Veli', 150);
var kullanici2 = Kullanici('Ayşe', 'Yılmaz', 1200);

kullanici1.bilgileriGoster(); // Çıktı: Ad: Ali, Soyad: Veli, Takipçi: 150
kullanici2.bilgileriGoster(); // Çıktı: Ad: Ayşe, Soyad: Yılmaz, Takipçi: 1200
}

ördünüz mü? Artık nesnelerimiz doğdukları anda dolu ve tutarlı bir halde geliyor. Bir özelliği atamayı unutma riskimiz ortadan kalktı! Çünkü constructor bizden bu değerleri zorunlu olarak istiyor.

Parametreli kurucu/yapıcı ile ilgili aktarmam gereken bir detay var;
Yukarıdaki constructor’da parametre isimlerini gelenAd, gelenSoyad gibi farklı isimlerle verdik. Peki ya sınıfın özelliğiyle (ad) parametrenin adını (ad) aynı yapmak isteseydik?
Yani şu şekilde yapsaydık

Kullanici(String ad, String soyad, int takipciSayisi) {
// HATA: Dart hangisinin parametre, hangisinin sınıf özelliği olduğunu bilemez.
// ad = ad; // Bu satır anlamsızdır. Parametreyi kendisine atar.
}

Dart hangisinin parametre, hangisinin sınıf özelliği olduğunu bilemez.İşte bu kafa karışıklığını çözmek için this anahtar kelimesi kullanılır. this, “içinde bulunduğum sınıfın kendisi” veya daha basitçe “benim olan” anlamına gelir. this.ad dediğimizde, “bu sınıfın ad özelliği” demiş oluruz.

class Kullanici {
String ad;
String soyad;

// 'this' ile doğru kullanım
Kullanici(String ad, String soyad) {
print('Constructor çalıştı!');
this.ad = ad; // Sınıfın 'ad' özelliğine, parametre olarak gelen 'ad'i ata.
this.soyad = soyad;
}
}

Dart geliştiricileri bu this.ad = ad; kalıbının çok sık kullanıldığını bildiği için harika bir kısayol sunar:

class Kullanici {
String ad;
String soyad;
int takipciSayisi;

// Sihirli kısayol: Parametreleri doğrudan 'this' ile tanımla.
// Bu, arka planda this.ad = ad; işlemini otomatik yapar.
Kullanici(this.ad, this.soyad, this.takipciSayisi);

void bilgileriGoster() {
print('Ad: $ad, Soyad: $soyad, Takipçi: $takipciSayisi');
}
}

Bu kullanım hem çok daha temiz hem de daha az kod demek. Dart’ta bu yapıyı çok sık göreceksiniz.

c) Named Constructor (İsimli Yapıcı)

eki ya bir kullanıcıyı farklı yollarla oluşturmak istersek? Örneğin:

  • Tüm bilgileriyle normal bir kullanıcı.
  • Sadece kullanıcı adı ve şifreyle giriş yapan bir kullanıcı.
  • Bir veritabanından (JSON formatında) gelen verilerle bir kullanıcı.

Bir sınıfta sadece bir tane isimsiz (Kullanici(…)) constructor olabilir. İşte bu gibi farklı senaryolar için Named Constructor’lar kullanılır. Bunlar, SinifAdi.istediginIsim() formatında yazılır.

class Kullanici {
String ad;
String eposta;
bool isAnonim;

// 1. Ana (isimsiz) Constructor'ımız
Kullanici(this.ad, this.eposta) : isAnonim = false;

// 2. İsimli Constructor: Anonim bir kullanıcı oluşturmak için.
// Burada 'this' ile başka bir constructor'ı da zincirleyebiliriz.
Kullanici.anonim()
: this('Misafir', ''); // Ana constructor'ı 'Misafir' ve '' ile çağır.

// 3. İsimli Constructor: JSON verisinden kullanıcı oluşturmak için.
Kullanici.fromJSON(Map<String, dynamic> json)
: ad = json['kullaniciAdi'],
eposta = json['email'],
isAnonim = false;

void bilgileriGoster() {
print('Ad: $ad, E-posta: $eposta, Anonim mi?: $isAnonim');
}
}

Bu yapıyı kullanalım ve görelim

void main() {
// Senaryo 1: Normal kullanıcı oluşturma
var kullanici1 = Kullanici('Ali Veli', 'ali@veli.com');
kullanici1.bilgileriGoster(); // Çıktı: Ad: Ali Veli, E-posta: ali@veli.com, Anonim mi?: false

// Senaryo 2: Anonim kullanıcı oluşturma
var misafir = Kullanici.anonim();
misafir.bilgileriGoster(); // Çıktı: Ad: Misafir, E-posta: , Anonim mi?: true

// Senaryo 3: JSON verisinden kullanıcı oluşturma
var apiVerisi = {'kullaniciAdi': 'Ayşe Yılmaz', 'email': 'ayse@yilmaz.com'};
var kullanici3 = Kullanici.fromJSON(apiVerisi);
kullanici3.bilgileriGoster(); // Çıktı: Ad: Ayşe Yılmaz, E-posta: ayse@yilmaz.com, Anonim mi?: false
}

İsimli yapıcılar, kodumuzu inanılmaz derecede esnek ve okunabilir hale getirir. Kullanici.fromJSON(data) ifadesi, ne yapıldığını anında anlatır.

Değerli arkadaşlar bazı kavramları görmemiş, aşina olmamış olabilirsiniz ancak OOP kavramı başlı başına zaman isteyen ve zamanla anlaşılabilecek bir kavramdır. Barındırdığı konu derinliğiyle bir oturuşta zihinde yer edinmesi çok mümkün diyemem ancak kodlaya kodlaya bu kavrama ve daha fazlasına aşina olup rahatlıkla kullanabileceksiniz. O yüzden bu yolda merakınızı ve hevesinizi asla yitirmeyin, pes etmeyin ve sonuna kadar gidin lütfen!

Evet 2. bölümün sonuna geldik. Buraya kadar okuyan ve destek olan herkese çok teşekkür ederim. Umarım ilgilisi ve meraklısı için faydalı olur.

Seri bir sonraki bölümle devam edecek takipte kalmaya devam edin

Github: www.github.com/abdullah017
Linkedin: www.linkedin.com/in/abdullahtas
Stackoverflow:
https://stackoverflow.com/users/13807726/abdullah-t

--

--

AbdullahTaş
AbdullahTaş

Written by AbdullahTaş

FLUTTER DEVELOPER AT IWWOMI | HASURA-GRAPHQL & FIREBASE |

No responses yet