Dallar (Branches)

Bu sayfa, Dart kodunuzun akışını şu şekillerde kontrol edebileceğinizi gösterir:

  • if ifadeleri ve öğeleri

  • if-case ifadeleri ve öğeleri

  • switch ifadeleri ve ifadeleri

Ayrıca Dart'ta kontrol akışını şu şekillerde manipüle edebilirsiniz:

  • Döngüler, örneğin for ve while

  • İstisnalar, örneğin try, catch ve throw

If İfadeleri

Dart, isteğe bağlı else şartlarını içeren if ifadelerini destekler. Parantez içindeki koşul, bir boolean değerine değerlendirilebilen bir ifade olmalıdır:

if (yagmurYagiyorMu()) {
  senMantariGetir();
} else if (karYagiyorMu()) {
  ceketiGiy();
} else {
  aracinUstunuAc();
}

if ifadesini bir ifade bağlamında nasıl kullanacağınızı öğrenmek için Koşullu İfadeler belgesine göz atabilirsiniz.

if-case İfadeleri

Dart if ifadeleri, desenlere sahip case ifadelerini destekler:

if (cift case [int x, int y]) return Nokta(x, y);

Eğer desen değeriyle eşleşirse, o zaman desenin tanımladığı değişkenlerle birlikte şube çalışır.

Önceki örnekte, liste deseni [int x, int y], cift değeri ile eşleşir, bu nedenle desenin tanımladığı x ve y değişkenleriyle birlikte return Nokta(x, y) şubesi çalışır.

Aksi takdirde, kontrol akışı else şubesine geçer:

if (cift case [int x, int y]) {
  print('Koordinat dizisiydi $x,$y');
} else {
  throw FormatException('Geçersiz koordinatlar.');
}

if-case ifadesi, tek bir desene karşı eşleşme ve yapıyı parçalama imkanı sağlar. Birden fazla desene karşı bir değeri test etmek için switch kullanabilirsiniz.

Versiyon Notu: if ifadelerinde case ifadeleri, en az 3.0 dil sürümünü gerektirir.

Switch

Switch ifadesi, bir değer ifadesini bir dizi durumla karşılaştırır. Her durum ifadesi, değerin eşleşmesi için bir desen içerir. Bir durumun deseni eşleştiğinde, durum gövdesi çalışır. Dolu durum ifadeleri, tamamlandıktan sonra anahtarı sona erdirir ve break ifadesi gerektirmez. Boş durum ifadeleri eğer kullanılmak istenirse, gövde içinde bir break ifadesi kullanılmalıdır.

Belirli bir durumun eşleşmediği durumda kodun çalışmasını sağlamak için default veya _ kullanabilirsiniz:

var komut = 'AC';
switch (komut) {
  case 'KAPALI':
    kapaliDurumuYurut();
  case 'BEKLEMEDE':
    beklemeDurumuYurut();
  case 'ONAYLANDI':
    onaylandiDurumuYurut();
  case 'REDDEDILDI':
    reddedildiDurumuYurut();
  case 'AC':
    acikDurumuYurut();
  default:
    bilinmeyenDurumuYurut();
}

Boş durumlar, bir sonraki duruma geçer, böylece durumlar bir gövdeyi paylaşabilir. Boş bir durumun geçmemesi için gövde içinde bir break ifadesi kullanılabilir. Non-sequential geçişler için continue ifadesi ve bir etiket kullanılabilir:

switch (komut) {
  case 'AC':
    acikDurumuYurut();
    continue yeniDurum; // yeniDurum etiketi üzerinde devam etmeye devam eder.

  case 'REDDEDILDI': // Boş durum geçer.
  case 'KAPALI':
    kapaliDurumuYurut(); // REDDEDILDI ve KAPALI için çalışır.

  yeniDurum:
  case 'BEKLEMEDE':
    simdiKapaliDurumuYurut(); // AC ve BEKLEMEDE için çalışır.
}

Durumların bir gövdeyi veya bir koruyucu kullanmasına izin vermek için mantıksal veya desenlerini kullanabilirsiniz. Desenler ve durum ifadeleri hakkında daha fazla bilgi için Switch İfadeleri ve İfadeleri belgesine göz atabilirsiniz.

Versiyon Notu: Switch ifadeleri, en az 3.0 dil sürümünü gerektirir.

Switch İfadeleri

Switch ifadesi, eşleşen durumun ifade gövdesine dayalı olarak bir değer üretir. Bir switch ifadesini, Dart'ın ifadeleri izin verilen her yerde kullanabilirsiniz, ancak bir ifade ifadesinin başlangıcında kullanmak istiyorsanız, bir switch ifadesi kullanmalısınız.

Örneğin:

var x = switch (y) { ... };

print(switch (x) { ... });

return switch (x) { ... };

Bir switch ifadesini, aşağıdaki gibi bir switch ifadesine yeniden yazabilirsiniz:

// Slash, star, comma, semicolon vb. sabit değişkenler...
switch (charCode) {
  case slash || star || plus || minus: // Mantıksal veya deseni
    token = operator(charCode);
  case comma || semicolon: // Mantıksal veya deseni
    token = punctuation(charCode);
  case >= digit0 && <= digit9: // İlişkisel ve mantıksal ve desenleri
    token = number();
  default:
    throw FormatException('Geçersiz');
}

Şu şekilde bir ifadeye dönüştürebilirsiniz:

token = switch (charCode) {
  slash || star || plus || minus => operator(charCode),
  comma || semicolon => punctuation(charCode),
  >= digit0 && <= digit9 => number(),
  _ => throw FormatException('Geçersiz')
};

Switch ifadesinin sözdizimi, switch ifadesi sözdiziminden farklıdır:

  • Durumlar case anahtar kelimesi ile başlamaz.

  • Bir durum gövdesi bir dizi ifade yerine tek bir ifade olmalıdır.

  • Her durumun bir gövdesi olmalıdır; boş durumlar için dolaylı geçiş yoktur.

  • Durum desenleri, : yerine => ile gövdelerinden ayrılır.

  • Durumlar , ile ayrılır (isteğe bağlı bir sondan virgül izin verilir).

  • Varsayılan durumlar sadece _, default ve _ ikisi yerine yalnızca kullanılabilir.

Versiyon Notu: Switch ifadeleri, en az 3.0 dil sürümünü gerektirir.

Tamamlanmışlık Kontrolü (Exhaustiveness checking)

Tamamlanmışlık kontrolü, bir değerin bir switch'e girebilecek ancak hiçbir durumun eşleşmemesi durumunda bir derleme hatası bildirmesi özelliğidir.

// Nullabilite olasılığını eşleştirmeyen bool türünde tamamlanmamış switch:
switch (nullDegerliBool) {
  case true:
    print('evet');
  case false:
    print('hayır');
}

Varsayılan bir durum (default veya _) bir switch üzerinden geçebilecek tüm değerleri kapsar. Bu, bir switch üzerinde tamamlanmışlık kontrolünü sağlar.

Enum'lar ve mühürlü tipler, özellikle switch'ler için kullanışlıdır çünkü varsayılan durum olmadan bile, mümkün olan değerleri bilir ve tamamen sayılabilir. Bir sınıfın alt türleri üzerinde switch yaparken tamamlanmışlık kontrolünü etkinleştirmek için bir sınıfın üzerine mühür ekleyin:

sealed class Sekil {}

class Kare implements Sekil {
  final double kenarUzunlugu;
  Kare(this.kenarUzunlugu);
}

class Daire implements Sekil {
  final double yaricap;
  Daire(this.yaricap);
}

double hesaplaAlan(Sekil sekil) => switch (sekil) {
      Kare(kenarUzunlugu: var k) => k * k,
      Daire(yaricap: var r) => math.pi * r * r
    };

Eğer biri Sekil sınıfına yeni bir alt sınıf eklerse, bu switch ifadesi eksik olurdu ve tamamlanmamışlık kontrolü eksik alt türü size bildirir. Bu, Dart'ı biraz fonksiyonel algebratik veri tipi tarzında kullanmanıza olanak tanır.

Muhafız Kümeleri (Guard clause)

Bir durum ifadesinden sonra isteğe bağlı bir muhafız kümesi eklemek için when anahtar kelimesini kullanın. Bir muhafız kümesi, ifade eşleştiğinde takip eden bir şartı değerlendirir. Bir muhafız şartı false olarak değerlendirildiğinde, yürütme tüm durumdan çıkarak bir sonraki duruma geçer:

// Switch ifadesi:
var deger = switch (birSey) {
  case birDesen when bir || boolean || ifade,
  //            ^^^^^^^^^^^^^^^^^^^ Muhafız kümesi.
  govde;
}

// Switch ifadesi:
var deger = switch (birSey) {
  birDesen when bir || boolean || ifade => govde,
  //       ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Muhafız kümesi.
}

// if-case ifadesi:
if (birSey case birDesen when bir || boolean || ifade) {
  //                     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Muhafız kümesi.
  govde;
}

Muhafızlar, eşleşen durumdan sonraki herhangi bir kodun çalışmasını ek bir kısıtlama eklemek için kullanılır. Muhafız kümesi false olarak değerlendirildiğinde, yürütme tüm durumdan çıkarak bir sonraki duruma geçer.

Dart dilinde kontrol akışını yönetmek için if, switch ifadeleri ve döngüler kullanılır. Bu yapılar, kodunuzu esnek ve okunabilir kılmak için kullanılabilir. İster basit şartlar, ister karmaşık desenlerle eşleştirmeler yapmak isteseniz, Dart'ın kontrol akışı yapıları size ihtiyacınız olan araçları sunar.

Last updated