Photo by Luca Bravo on Unsplash

Dart Programlama Dilinde Yapıcı / Kurucu Metotlar | Constructor Kullanımı

Dart & Flutter ile Çapraz Platform Android iOS Mobil Uygulama Geliştirme Dersleri #15

OA Başaran
4 min readJan 21, 2021

--

Videolu anlatım kanalımda: https://www.youtube.com/watch?v=YvpnoTm5ey8&list=PLNRtC6HXL3EDnn4naNGqlQSFqGyMXXWow&index=30&t=3s

Bir sınıftan nesne oluşturduğumuz anda çalışmasını istediğimiz sınıf fonksiyonuna yapıcı/kurucu metot (constructor) diyoruz.

Her sınıfın varsayılan, içi boş bir yapıcı metodu vardır.

Örneğin ArabaTasarimi sınıfının varsayılan kurucu metodu

ArabaTasarimi(){}

ya da

ArabaTasarimi();

şeklinde ifade edilebilir.

Kullanabilmek için bu yazımlardan birini tercih ederek oluşturduğumuz sınıfın içinde yazmamız gerekir.

class ArabaTasarimi {
ArabaTasarimi();
}

Peki kurucu metot ne işimize yarıyor, onu nasıl kullanıyoruz.

Eğer bir nesnenin oluşturulurken bir değer verilerek oluşturulmasını ve oluşturulduğu anda bu değerle bir takım işler yapmasını istiyorsak kurucu metotları kullanırız.

Örneğin biz önceki dersimizde ArabaTasarimi sınıfına renk diye bir özellik vermiş ama değer atamamıştık.

class ArabaTasarimi {
String renk;
ArabaTasarimi();
}

Nesneyi oluşturduktan sonra renk değeri vermiştik.

ArabaTasarimi kirmiziAraba = ArabaTasarimi();
kirmiziAraba.renk = "Kırmızı";

Ama eğer sınıfı oluştururken kurucu metodu kullansaydık, nesneyi oluşturma aşamasında da kirmiziAraba’nın renk özelliğine “Kırmızı” değerini verebilirdik.

class ArabaTasarimi {
String renk;
ArabaTasarimi(this.renk);
}

Kurucu metodun parantezleri içinde yazdığımız this.renk ifadesi, bu sınıfın içinde yazdığımız String renk değişkenini temsil ediyor. Yani this diyerek ArabaTasarimi sınıfının içindeki renk değişkeni olduğunu belirttik. Bu belirtmeyle birlikte eğer bu sınıftan bir nesne oluşturulacaksa, nesne oluşturulduğu anda bir değer vermemiz gerektiğini ve bu değerin renk değişkenine atanacağını ifade etmiş olduk.

Şimdi nesneyi oluşturalım.

ArabaTasarimi kirmiziAraba = ArabaTasarimi("Kırmızı");print(kirmiziAraba.renk);

Konsol Çıktısı:

Kırmızı

Bu değişiklikler sadece bu nesne özelinde geçerlidir. Aynı sınıftan yeni bir nesne ürettiğimizde o sadece sınıfın varsayılan özelliklerini alacaktır. Kurucu metodu için vermemiz gereken değer de sadece o nesneye özel olacaktır.

Sınıfın birden fazla özelliği de olabilirdi. Bu durumda yapıcı metodun alacağı değerleri virgülle ayırarak hepsini yazabiliriz.

class ArabaTasarimi {
String renk;
int uretimYili;
String silecekDurumu;

ArabaTasarimi(this.renk, this.uretimYili, this.silecekDurumu);
}

Nesneleri oluştururken de yapıcı metodun parantezleri içindeki tüm değerleri aynı sıra ile yazmamız gerekir.

ArabaTasarimi kirmiziAraba = ArabaTasarimi("Kırmızı", 1972, "Çalışıyor");ArabaTasarimi beyazAraba = ArabaTasarimi("Beyaz", 1972, "Çalışmıyor");

Şimdi işin içine fonksiyonları da dâhil edelim.

class ArabaTasarimi {
String renk;
int uretimYili;
String silecekDurumu;

silecekleriCalistir(){
print("Silecekler $silecekDurumu");
}
ArabaTasarimi(this.renk, this.uretimYili, this.silecekDurumu);
}

Artık nesneyi oluşturduktan sonra sınıf fonksiyonunu çalıştırdığımızda bize sileceklerin durumunu belirten bir mesaj gösterecek.

ArabaTasarimi kirmiziAraba = ArabaTasarimi("Kırmızı", 1972, "Çalışıyor");ArabaTasarimi kirmiziAraba = ArabaTasarimi("Beyaz", 1972, "Çalışıyor");kirmiziAraba.silecekleriCalistir();beyazAraba.silecekleriCalistir();

Konsol Çıktısı:

Silecekler Çalışıyor

Silecekler Çalışmıyor

Eğer isteseydik constructor içeriğini aşağıdaki gibi yazarak fonksiyonların yaptığı işleri de yaptırabilirdik. Böylelikle nesne oluşturulduğu anda bu işler otomatik olarak yapılırdı. Bunun için constructor’ı normal fonksiyon yapısı gibi süslü parantezlerle birlikte yazmalıyız.

class ArabaTasarimi {
String renk;
int uretimYili;
String silecekDurumu;


ArabaTasarimi(this.renk, this.uretimYili, this.silecekDurumu){
print("$renk Arabanın Silecekleri $silecekDurumu");
}
}

Nesneler oluşturulduğu anda kurucu metot çalışacağı için, metodun süslü parantezleri arasına yazdığımız print fonksiyonu da otomatik olarak çalışacak ve içindekileri konsola yazdıracak.

ArabaTasarimi kirmiziAraba = ArabaTasarimi("Kırmızı", 1972, "Çalışıyor");ArabaTasarimi kirmiziAraba = ArabaTasarimi("Beyaz", 1972, "Çalışmıyor");

Konsol Çıktısı:

Kırmızı Arabanın silecekleri Çalışıyor

Beyaz Arabanın silecekleri Çalışmıyor

Şimdi kurucu metotların daha farklı şekillerde nasıl tanımlanabileceğine bakacağız ve bu sırada this anahtar kelimesini de daha iyi anlayabileceğimiz bir örneğimiz olacak.

Yukarıda yaptığımız örneklerde direkt kurucu metodun parantezi içine this.renk yazarak nesne oluştururken aldığımız değeri, sınıfın String renk değişkenine atayabilmiştik. Ama aslında kurucu metotların gerçek hâli aşağıda olduğu gibidir. Böylelikle farklı bir değişken ismi olan String boyaRengi (geçici bir değişken) ile nesne oluştururken verilen değeri (örneğin “Kırmızı” yı) alıyoruz, daha sonra da sınıfın renk değişkenine başka bir kod satırı ile atıyoruz.

class ArabaTasarimi {
String renk;

ArabaTasarimi(String boyaRengi){
renk = boyaRengi;
}
}

Yukarıdaki kodda bir sıkıntı yok. Onu kullanabilirsiniz. Ancak bu kodları aşağıdaki gibi yazmak istediğimizde this anahtar kelimesinin anlamı ortaya çıkıyor.

class ArabaTasarimi {
String renk;

ArabaTasarimi(String renk){
this.renk = renk;
}
}

Burada kurucu metodun parantezleri arasına yazdığımız geçici değişken ile, sınıfın varsayılan değişkeninin isimleri aynı: renk

Programın bu değişkenleri ayırt edebilmesi için this ifadesini kullandık. this.renk demek, sınıf özelliği olarak tanımladığımız String renk demek.

this.renk = renk

Bu kodun sağına sadece renk olarak yazdığımız değişken ise kurucu metodun parantezleri arasındaki geçici değişkeni ifade ediyor.

İşte this ifadesinin bu tip karışıklıkları önlemek ve değer atama işlemlerini ilk örneklerde gördüğümüz şekilde kısaltmak gibi işlevleri var.

İsimlendirilmiş Constructor

Eğer birden fazla kurucu metoda ihtiyaç duyarsak, isimlendirerek yeni kurucu metotlar oluşturabiliyoruz. Aşağıdaki satırda sınıf adından sonra sadece nokta koyup bir isim verdim. Artık toplam üç tane kurucu metodum olmuş oldu. Normal kurucular için geçerli olan her şey bunlar için de geçerli.

class ArabaTasarimi {
String renk;
int uretimYili;

ArabaTasarimi();
ArabaTasarimi.ikinciKurucu(this.renk);

ArabaTasarimi.ucuncuKurucu(int uretimYili){
this.uretimYili = uretimYili;
}
}

Kullanımları için de aynı şey geçerli. Tek fark, bir nokta koyup isimlendirilmiş kurucunun adını yazmak.

ArabaTasarimi kirmiziAraba = ArabaTasarimi.ikinciKurucu("Kırmızı");ArabaTasarimi beyazAraba = ArabaTasarimi.ucuncuKurucu(1972);

Değerleri Süslü Parantezle Almak

Eğer aşağıdaki gbi kurucu metotların normal parantezleri içerisinde ekstra süslü parantez kullanırsa ve alınmasını belirttiğimiz değerleri süslü parantezler içerisine yazarsak, nesne oluşturma sırasında bunların verilmesi zorunlu değil demiş oluruz.

class ArabaTasarimi {
double fiyat;
String renk;
int uretimYili;
ArabaTasarimi({this.fiyat}); ArabaTasarimi.ikinciKurucu({this.renk, this.uretimYili}); ArabaTasarimi.ucuncuKurucu({int uretimYili}) {
this.uretimYili = uretimYili;
}
}

Bu durumda, nesne oluştururken aşağıdaki şekilde sınıfın hangi özelliğine hangi değeri verdiğimizi belirtmemiz gerekir. Yani artık nesne oluştururken değer vermek zorunda değiliz.

var kirmiziAraba = ArabaTasarimi.ikinciKurucu();

Ama verirsek de aşağıdaki gibi değişken adını yazıp iki nokta koymamız gerekiyor.

renk: “Mavi”

uretimYili: 1973;

gibi.

var kirmiziAraba = ArabaTasarimi.ikinciKurucu(renk: "Mavi", uretimYili: 1973);print(kirmiziAraba.renk);print(kirmiziAraba.uretimYili);

Kaynak Udemy | Dart & Flutter & Firebase ile Web - Masaüstü ve Mobil için Kodlama Programlama Yazılım ve Uygulama Geliştirme Kursu: https://www.udemy.com/course/flutterdersleri

--

--