Ahmet Balaman LogoAhmet Balaman

Dart'ta Enum ve Composition - Kod Düzenini Nasıl Sağlarız?

personAhmet Balaman
calendar_today
DartEnumCompositionOOPFlutter

Enum ve Composition ile Tanışmam

Dün Dart'ın temellerine giriş yapmıştım. Bugün biraz daha ileri seviye konulara baktım: Enum'lar ve Composition. İlk başta "bunlar ne işe yarıyor" diye düşündüm ama kullanım senaryolarını görünce kafamda oturdu.

Canlı Demo: Dart Enum ve Composition

Enum ve Composition kullanımlarını interaktif olarak deneyin:

Enum Nedir? Neden Kullanıyoruz?

Enum'ları düşünün ki bir menü gibi. Mesela bir pizza siparişi uygulaması yapıyorsunuz ve pizzanın boyutları var: Küçük, Orta, Büyük. Bunları her seferinde String olarak "kucuk", "orta", "buyuk" yazmak yerine bir enum tanımlayıp kullanabilirsiniz.

Pratik Bir Örnek: Renk Seçimi

Ben ilk olarak renk seçimi üzerinden denedim:

enum Renkler {
  kirmizi,
  mavi,
  beyaz
}

void main() {
  hangiRenk(Renkler.mavi);
}

void hangiRenk(Renkler renk) {
  switch (renk) {
    case Renkler.beyaz:
      print("Beyaz seçildi");
      break;
    case Renkler.kirmizi:
      print("Kırmızı seçildi");
      break;
    case Renkler.mavi:
      print("Mavi seçildi");
      break;
  }
}

Bu kodda Renkler.mavi gönderdiğimiz için ekrana "Mavi seçildi" yazacak.

Enum'un Güzel Yanları

  1. Hata yapma olasılığınız düşüyor: "mavii" veya "mvi" gibi yanlış yazmıyorsunuz
  2. Kod daha okunabilir: Renkler.mavi yazmak, "mavi" string'inden daha açıklayıcı
  3. IDE desteği: VS Code veya Android Studio size otomatik tamamlama sunuyor

Flutter'da Kullanım Örneği

Düşünün ki bir uygulamada durum yönetimi yapıyorsunuz:

enum UygulamaDurumu {
  yukleniyor,
  basarili,
  hata,
  bosIcerik
}

void durumKontrol(UygulamaDurumu durum) {
  switch (durum) {
    case UygulamaDurumu.yukleniyor:
      // Loading widget göster
      break;
    case UygulamaDurumu.basarili:
      // Veriyi göster
      break;
    case UygulamaDurumu.hata:
      // Hata mesajı göster
      break;
    case UygulamaDurumu.bosIcerik:
      // "İçerik bulunamadı" mesajı
      break;
  }
}

Çok temiz ve anlaşılır değil mi?

Composition (Birleştirme) - Has-A İlişkisi

Composition konusu başta biraz karışık geldi ama şöyle anladım: Bir sınıfın içinde başka bir sınıf kullanıyorsunuz. Yani "has-a" (sahip olma) ilişkisi.

Gerçek Hayat Örneği

Bir kişinin bilgileri var. Ayrıca bir arabasının bilgileri var. Ama arabayı tanımlarken kişinin tüm bilgilerini tekrar yazmak istemiyoruz:

class KisiBilgisi {
  late int id;
  late String isim;
  late int yas;
  
  KisiBilgisi({
    required this.id,
    required this.isim,
    required this.yas
  });
}

class ArabaBilgisi {
  KisiBilgisi kisi; // Burası önemli!
  late String aracIsim;
  late String plaka;
  
  ArabaBilgisi({
    required this.kisi,
    required this.aracIsim,
    required this.plaka
  });
}

void main() {
  var kisi1 = KisiBilgisi(
    yas: 25,
    isim: "Ahmet",
    id: 1233
  );
  
  var arac1 = ArabaBilgisi(
    kisi: kisi1,
    aracIsim: "Toyota Corolla",
    plaka: "34 ABC 123"
  );
  
  print("${arac1.kisi.isim} isimli kişinin aracı: ${arac1.aracIsim}");
  print("Plakası: ${arac1.plaka}");
}

Neden Bu Kadar Önemli?

Şöyle düşünün: Kişi bilgilerini hem araba için, hem ev için, hem de iş bilgileri için kullanabilirsiniz. Her seferinde id, isim, yaş yazmak yerine sadece KisiBilgisi sınıfını kullanırsınız.

Kod tekrarını önler, daha düzenli olur ve değişiklik yapmak kolaylaşır. Mesela kişiye telefon numarası eklemek isterseniz sadece KisiBilgisi sınıfını güncellemeniz yeterli.

Flutter'da Composition Örneği

Flutter'da widget'lar yazarken sürekli composition kullanıyoruz aslında:

class KullaniciKarti extends StatelessWidget {
  final Kullanici kullanici; // Composition
  
  KullaniciKarti({required this.kullanici});
  
  @override
  Widget build(BuildContext context) {
    return Card(
      child: ListTile(
        title: Text(kullanici.isim),
        subtitle: Text(kullanici.email),
        leading: CircleAvatar(
          child: Text(kullanici.isim[0]),
        ),
      ),
    );
  }
}

Gördüğünüz gibi Kullanici sınıfını direkt kullanıyoruz. Bu sayede kullanıcı bilgileri değiştiğinde sadece bir yerde güncelleme yapıyoruz.

Bugün Ne Öğrendim?

  • Enum'lar kod düzenini sağlıyor ve hata yapma olasılığını azaltıyor
  • Composition ile sınıfları birleştirebiliyoruz (has-a ilişkisi)
  • Her ikisi de Flutter'da çok sık kullanılan yapılar

Yarın kalıtım (inheritance) ve polymorphism konularına bakacağım. O konular daha da ilginç görünüyor!

Öğrenme Kaynakları

Enum ve Composition konularını anlamak için:

  • Dart'ın resmi dokümantasyonu
  • Kendi yazdığım deneme kodları
  • StackOverflow'daki örnekler

Umarım bu yazı sizin için faydalı olmuştur. Sorularınız varsa yorum yapabilirsiniz!


İletişim: