↑↓ seç · Enter aç · Esc kapat

Mutlu Tekin
Mutlu Tekin
← Yazılar

Bölüm 2 — Konu 7: Tip Çıkarımı (Type Inference) ve Açık Tip Belirtme

3 dk okuma #dart
Dizi · 7/64 Dart Türkçe Tutorial
  1. Bölüm 1 — Konu 1: Dart Nedir, Nerede Kullanılır, Neden Flutter Bu Dili Seçti
  2. Bölüm 1 — Konu 2: Ortam Kurulumu (Dart SDK, DartPad, Terminal ile Çalıştırma)
  3. Bölüm 1 — Konu 3: İlk Program (`main()`, `print()`, Dosya Yapısı)
  4. Bölüm 1 — Konu 4: Yorum Satırları, Temel Sözdizimi Kuralları
  5. Bölüm 2 — Konu 5: Değişken Tanımlama — `var`, `final`, `const` Farkı
  6. Bölüm 2 — Konu 6: Temel Tipler — `int`, `double`, `String`, `bool`
  7. Bölüm 2 — Konu 7: Tip Çıkarımı (Type Inference) ve Açık Tip Belirtme
  8. Bölüm 2 — Konu 8: `dynamic` ve `Object` — Ne Zaman Kullanılır, Ne Zaman Kaçınılır
  9. Bölüm 2 — Konu 9: Null Safety Temelleri (`?`, `!`, `late`'e Giriş)
  10. Bölüm 3 — Konu 10: Aritmetik, Atama, Karşılaştırma, Mantıksal Operatörler
  11. Bölüm 3 — Konu 11: `if / else if / else`
  12. Bölüm 3 — Konu 12: `switch` / `switch expression` (Modern Dart)
  13. Bölüm 3 — Konu 13: Ternary Operatör, `??`, `??=`, `?.`
  14. Bölüm 3 — Konu 14: `for`, `while`, `do-while` Döngüleri
  15. Bölüm 4 — Konu 16: `List` — Oluşturma, Erişim, Temel Metodlar
  16. Bölüm 4 — Konu 17: `Set` — Benzersiz Eleman Mantığı
  17. Bölüm 4 — Konu 18: `Map` — Key-Value Yapılar
  18. Bölüm 4 — Konu 19: Koleksiyon Üzerinde `for-in`, `forEach`
  19. Bölüm 4 — Konu 20: Spread Operatörü (`...`, `...?`) ve Collection If/For
  20. Bölüm 5 — Konu 21: Fonksiyon Tanımlama, Parametreler (Positional, Named, Optional)
  21. Bölüm 5 — Konu 22: Varsayılan Parametre Değerleri (Derinlemesine)
  22. Bölüm 5 — Konu 23: Arrow Function (`=>`) Sözdizimi
  23. Bölüm 5 — Konu 24: Fonksiyonlar Birinci Sınıf Vatandaş — Değişkene Atama, Parametre Olarak Geçme
  24. Bölüm 5 — Konu 25: Anonim Fonksiyonlar ve Closure Kavramı (Derinlemesine)
  25. Bölüm 5 — Konu 26: Recursion (Özyineleme)
  26. Bölüm 6 — Konu 27: Class Tanımlama, Constructor (Varsayılan, Named, Factory)
  27. Bölüm 6 — Konu 28: Alanlar (Fields), Metodlar, `this` Kullanımı (Derinlemesine)
  28. Bölüm 6 — Konu 29: Initializer List, Constructor Kısayolları (Derinlemesine)
  29. Bölüm 6 — Konu 30: Getter / Setter
  30. Bölüm 6 — Konu 31: Statik Üyeler (`static`)
  31. Bölüm 7 — Konu 32: Kalıtım (`extends`), `super` Kullanımı
  32. Bölüm 7 — Konu 33: Metod Override Etme, `@override`
  33. Bölüm 7 — Konu 34: Soyut Sınıflar (`abstract class`)
  34. Bölüm 7 — Konu 35: Interface Mantığı (`implements`)
  35. Bölüm 7 — Konu 36: Mixin (`with`)
  36. Bölüm 7 — Konu 37: `enum` — Basit ve Gelişmiş (Metotlu Enum'lar)
  37. Bölüm 8 — Konu 38: `try / catch / finally`, `throw`
  38. Bölüm 8 — Konu 39: Özel Exception Sınıfları Yazma
  39. Bölüm 8 — Konu 40: Sound Null Safety Derinlemesine — `late`, `required`, Non-Nullable Varsayılan Davranış
  40. Bölüm 8 — Konu 41: `assert` ile Geliştirme Zamanı Kontrolleri
  41. Bölüm 9 — Konu 42: Generic Sınıflar ve Fonksiyonlar
  42. Bölüm 9 — Konu 43: Generic Sınırlamalar (`<T extends ...>`)
  43. Bölüm 9 — Konu 44: Dart'ın Built-in Generic Koleksiyonları Nasıl Çalışır
  44. Bölüm 10 — Konu 45: `Future` Kavramı, `async`/`await`
  45. Bölüm 10 — Konu 46: `Future.then`, Hata Yönetimi (`catchError`)
  46. Bölüm 10 — Konu 47: `Stream` Temelleri, `async*`, `yield`
  47. Bölüm 10 — Konu 48: `StreamController`, Broadcast Stream
  48. Bölüm 11 — Konu 49: `map`, `where`, `reduce`, `fold`
  49. Bölüm 11 — Konu 50: `sort`, Custom Comparator ile Sıralama
  50. Bölüm 11 — Konu 51: Iterable Kavramı Derinlemesine (Lazy Evaluation)
  51. Bölüm 11 — Konu 52: Cascade Notasyonu (`..`)
  52. Bölüm 12 — Konu 53: `pubspec.yaml`, pub.dev'den Paket Ekleme
  53. Bölüm 12 — Konu 54: Kütüphane Oluşturma, `import`/`export`, `part`/`part of`
  54. Bölüm 12 — Konu 55: Dart'ta Test Yazımı (`test` Paketi, Unit Test Mantığı)
  55. Bölüm 12 — Konu 56: Extension Methods
  56. Bölüm 12 — Konu 57: Dart'ın Derleme Modelleri (JIT vs AOT) ve Bunun Flutter'a Etkisi
  57. Bölüm 13 — Konu 59: Dart 3 Pattern Matching — Records, Destructuring, Sealed Classes, Exhaustive Switch
  58. Bölüm 13 — Konu 60: `Never` Tipi, `covariant` ve Generic Variance Detayları
  59. Bölüm 13 — Konu 61: Event Loop Derinlemesine — Microtask Queue vs Event Queue
  60. Bölüm 13 — Konu 62: Memory Model & Performans — Garbage Collection, `const` Nesnelerin Bellek Avantajı
  61. Bölüm 13 — Konu 63: Isolate'ler Arası Mesajlaşmanın Maliyeti ve `compute()`'un İç İşleyişi
  62. Bölüm 13 — Konu 64: FFI (Foreign Function Interface) — C Koduna Erişim
  63. Bölüm 13 — Konu 65: Sunucu Tarafında Dart — `dart:io`, `shelf` Paketiyle Basit Bir Backend/CLI Aracı Yazma
  64. Bölüm 13 — Konu 66: Derleyici & Analiz Araçları — `dart analyze`, Custom Lint Kuralları, `build_runner` Mimarisi
Dizinin sayfası →
İçindekiler 10 başlık
  1. Tip Çıkarımı Nedir?
  2. Açık (Explicit) Tip Belirtme
  3. Peki Hangisini Ne Zaman Kullanmalı?
  4. var ≠ dynamic — Kritik Bir Ayrım
  5. Tip Çıkarımı Fonksiyonlarda da Çalışır
  6. Koleksiyonlarda Tip Çıkarımı — Küçük Bir Önizleme
  7. Bir Kural Daha: Tutarlılık
  8. Küçük Bir Karşılaştırma Örneği
  9. 🎯 Bu Dersten Çıkarılması Gerekenler
  10. 📝 Ödevler

Tip Çıkarımı Nedir?

Önceki derslerde var kullaniciAdi = "Ahmet"; gibi örnekler yazdık ama hiç String yazmadık — buna rağmen Dart, kullaniciAdi'nin bir String olduğunu biliyor. Bu, tip çıkarımı (type inference) sayesinde oluyor: derleyici, verdiğin ilk değere bakarak tipi kendisi belirliyor.

dart
void main() {
  var isim = "Elif";     // Dart bunun String olduğunu anlar
  var yas = 30;           // Dart bunun int olduğunu anlar
  var boy = 1.65;         // Dart bunun double olduğunu anlar
  var aktif = true;       // Dart bunun bool olduğunu anlar
}

Bunu doğrulamak istersen, VS Code'da bir değişkenin üzerine fare ile gelirsen (hover), Dart eklentisi sana o değişkenin çıkarılmış tipini gösterir — kod içinde yazılı olmasa bile.

Açık (Explicit) Tip Belirtme

var yerine, tipi doğrudan sen de yazabilirsin:

dart
void main() {
  String isim = "Elif";
  int yas = 30;
  double boy = 1.65;
  bool aktif = true;
}

Bu iki yaklaşım (tip çıkarımı vs açık belirtme) fonksiyonel olarak tamamen aynı sonucu verir — ikisinde de değişken statik olarak tiplendirilmiştir, ikisinde de derleme zamanında tip kontrolü yapılır. Fark sadece sözdizimseldir (syntactic), yani nasıl yazdığınla ilgilidir.

Peki Hangisini Ne Zaman Kullanmalı?

Bu, Dart topluluğunda biraz tartışmalı bir stil konusudur, ama genel kabul gören pratikler şunlar:

var kullan, eğer:

  • Değişkenin tipi, atadığın değerden zaten apaçık belliyse:
    dart
    var kullaniciAdi = "mehmet123"; // String olduğu zaten çok açık

Açık tip belirt, eğer:

  • Tip, ilk bakışta belli değilse veya kodun okunabilirliğini artıracaksa:
    dart
    double hesaplaOrtalama(List<int> sayilar) {
    double toplam = 0; // burada "double" yazmak, "bu bir tam sayı değil" diye netlik katıyor
    for (var s in sayilar) {
      toplam += s;
    }
    return toplam / sayilar.length;
    }
  • Bir fonksiyonun parametrelerinde ve dönüş tipinde her zaman açık tip belirtilir (bu zorunludur, var fonksiyon imzasında kullanılmaz — bunu Bölüm 5'te fonksiyonlar konusunda detaylı göreceğiz).

var ≠ dynamic — Kritik Bir Ayrım

Yeni başlayanların en çok karıştırdığı nokta budur. var ile tanımlanan bir değişken statik olarak tiplendirilmiştir — tip, derleme zamanında sabitlenir ve bir daha değişmez:

dart
void main() {
  var mesaj = "Merhaba";
  mesaj = 42; // ❌ HATA! mesaj zaten String olarak sabitlendi
}

Bunu bir sonraki konuda (dynamic ve Object) çok daha net göreceğiz — orada gerçekten "tipi çalışma zamanında değişebilen" bir değişken türünü işleyeceğiz. Şimdilik şunu bil: var, "tipsiz değişken" demek değildir — "tipi otomatik belirlenen değişken" demektir.

Tip Çıkarımı Fonksiyonlarda da Çalışır

dart
selamVer(isim) {
  return "Merhaba, $isim!";
}

Yukarıdaki gibi bir fonksiyon yazarsan, Dart parametrenin ve dönüş değerinin tipini dynamic olarak kabul eder (bu iyi bir pratik değildir — bir sonraki derste neden kaçınılması gerektiğini göreceğiz). Doğrusu:

dart
String selamVer(String isim) {
  return "Merhaba, $isim!";
}

Fonksiyonlarda tip çıkarımı dönüş tipi için de kullanılabilir (=> ile yazılan arrow function'larda derleyici çıkarım yapabilir), ama en iyi pratik, fonksiyon imzalarında tipleri her zaman açıkça yazmaktır — çünkü bir fonksiyonu çağıran başka bir geliştirici (ya da gelecekteki sen), parametrenin ne beklediğini kod içine bakmadan, sadece imzayı okuyarak anlayabilmeli.

Koleksiyonlarda Tip Çıkarımı — Küçük Bir Önizleme

Bölüm 4'te koleksiyonları detaylı işleyeceğiz ama tip çıkarımının orada da çalıştığını görmen faydalı:

dart
void main() {
  var sayilar = [1, 2, 3]; // Dart bunun List<int> olduğunu anlar
  var isimler = ["Ali", "Veli"]; // List<String>
}

Yine burada var kullanmak yaygın bir pratiktir çünkü liste içeriğinden tip zaten belli oluyor.

Bir Kural Daha: Tutarlılık

Bir projede/takımda hangi yaklaşım seçilirse seçilsin (bazıları her yerde açık tip yazmayı, bazıları mümkün olduğunca var kullanmayı tercih eder), önemli olan tutarlı olmaktır. dart analyze aracı (Bölüm 13'te detaylandıracağız), projene özel lint kuralları tanımlayarak bu tutarlılığı zorunlu kılmana bile izin verir.

Küçük Bir Karşılaştırma Örneği

dart
// Yaklaşım 1: Tip çıkarımı (var)
void main() {
  var toplamPuan = 0;
  var ogrenciSayisi = 25;
  var ortalama = toplamPuan / ogrenciSayisi;
  print(ortalama);
}

// Yaklaşım 2: Açık tip belirtme
void main() {
  int toplamPuan = 0;
  int ogrenciSayisi = 25;
  double ortalama = toplamPuan / ogrenciSayisi;
  print(ortalama);
}

İki kod da tamamen aynı şekilde çalışır, aynı hataları yakalar (örneğin toplamPuan'a bir String atamaya çalışırsan ikisi de hata verir). Fark tamamen okunabilirlik tercihi.


🎯 Bu Dersten Çıkarılması Gerekenler

  • Tip çıkarımı, var ile tanımlanan değişkenin tipini ilk değerden otomatik belirler.
  • var ile açık tip belirtme fonksiyonel olarak aynıdır, sadece sözdizimsel bir tercih.
  • var, dynamic değildir — tip bir kere belirlenir ve sabitlenir.
  • Fonksiyon parametrelerinde ve dönüş tiplerinde açık tip belirtmek en iyi pratiktir.
  • Önemli olan, seçtiğin yaklaşımda tutarlı olmak.

📝 Ödevler

  • [ ] Aynı 4 değişkeni (isim, yaş, boy, öğrenci mi) bir kere var ile bir kere açık tip belirterek iki ayrı main() fonksiyonunda tanımla, ikisinin de aynı şekilde çalıştığını doğrula.
  • [ ] var ile tanımladığın bir değişkene, tanımlandığı tipten farklı bir değer atamayı dene (örn. var x = 5; x = "beş";), hatayı oku ve yorumla.
  • [ ] VS Code'da bir var değişkeninin üzerine fare ile gelip Dart eklentisinin gösterdiği çıkarılmış tipi kontrol et.
  • [ ] Parametre ve dönüş tipi açıkça belirtilmiş bir fonksiyon yaz (örn. iki sayının ortalamasını double olarak döndüren), fonksiyonları henüz detaylı işlemedik ama bu basit örneği dene.

Sıradaki konu: Bölüm 2 — Konu 8: dynamic ve Object — Ne Zaman Kullanılır, Ne Zaman Kaçınılır