Dart Temel Sözdizimi | Değişkenler #2

MÜŞERREF SELÇUK ÖZDEMIR
4 min readNov 30, 2023

--

Variables

Variables- Değişkenler

İşte bir değişken oluşturma ve onu başlatma örneği:

var name = 'Muhammet Ali Şimşek';

Değişkenler referansları depolar. name adlı değişken, “Muhammet Ali Şimşek” değerine sahip bir String nesnesine referans içerir.

name değişkeninin türü String olarak çıkarılır, ancak bu türü belirterek değiştirebilirsiniz. Bir nesne tek bir türle sınırlandırılmamışsa, Object türünü (veya gerekirse dynamic) belirtin.

Object name = 'Ezel Bayraktar';

Başka bir seçenek de çıkarılacak türü açıkça bildirmektir:

String name = 'Polat';

Null safety — Null güvenliği

Dart dili, sağlam null güvenliğini zorunlu kılar.

Null güvenliği, null olarak ayarlanmış değişkenlere istem dışı erişimden kaynaklanan bir hatayı önler. Bu hataya “null dereference” hatası denir. Bir özelliğe eriştiğinizde veya null olarak değerlendirilen bir ifade üzerinde bir yöntem çağırdığınızda null dereference hatası oluşur. Bu kuralın bir istisnası, toString() veya hashCode gibi null özelliği veya yöntemi desteklediği durumlardır. Null güvenliği sayesinde, Dart derleyicisi bu olası hataları derleme zamanında algılar.

Örneğin, bir int olan i değişkenin’in mutlak değerini bulmak istediğinizi varsayalım. i değişkeni null ise, i.abs() çağrısı “null dereference” hatasına neden olur. Diğer dillerde, bunu denemek bir çalışma zamanı hatasına yol açabilir, ancak Dart’ın derleyicisi bu eylemleri yasaklar. Bu nedenle, Dart uygulamaları çalışma zamanı hatalarına neden olamaz.

Null safety üç önemli değişiklik getirmektedir:

  1. Bir değişken, parametre veya ilgili başka bir bileşen için bir tür belirttiğinizde, türün null olmasına izin verip vermediğini kontrol edebilirsiniz. Null özelliğini etkinleştirmek için, tür bildiriminin sonuna bir ? eklersiniz
  2. Değişkenleri kullanmadan önce ilklendirmeniz gerekir. Nullable değişkenler varsayılan olarak null değerini alırlar, yani varsayılan olarak ilklendirilirler. Dart, nullable olmayan türlere ilk değer atamaz. Sizi bir başlangıç değeri ayarlamaya zorlar. Dart, başlatılmamış bir değişkeni gözlemlemenize izin vermez. Bu, alıcının türünün null olabileceği ancak null’un kullanılan yöntemi veya özelliği desteklemediği durumlarda özelliklere erişmenizi veya yöntemleri çağırmanızı engeller.
  3. Nullable türe sahip bir ifadede özelliklere erişemez veya yöntemleri çağıramazsınız. Aynı istisna, hashCode veya toString() gibi null’un desteklediği bir özellik veya yöntem olduğunda da geçerlidir.

Sağlam null güvenliği, olası çalışma zamanı hatalarını düzenleme zamanı analiz hatalarına dönüştürür. Null güvenliği, null olmayan bir değişkeni :

  • Null olmayan bir değerle başlatıldığında,
  • Null bir değer atandığında,

işaretler.

Default Value — Varsayılan değer

Nullable tipe sahip başlatılmamış değişkenlerin başlangıç değeri null idir. Dart’taki diğer her şey gibi sayılar da nesne olduğundan, sayısal türdeki değişkenler bile başlangıçta null idir.

int? lineCount;
assert(lineCount == null);

Not : Dart programlama dilinde assert ifadesi, bir şartın doğru olup olmadığını kontrol etmek ve şartın yanlış olduğu durumda bir hata fırlatmak için kullanılır. assert ifadesi sadece geliştirme sırasında kullanılır ve kod üretim ortamına (release mode) geçildiğinde devre dışı bırakılır.

Null güvenliği ile, kullanmadan önce null olmayan değişkenlerin değerlerini başlatmanız gerekir:

int lineCount = 0;

Bir yerel değişkeni bildirildiği yerde başlatmak zorunda değilsiniz, ancak kullanılmadan önce ona bir değer atamanız gerekir. Örneğin, aşağıdaki kod geçerlidir çünkü Dart, print() işlevine aktarıldığında lineCount değişkeninin null olmadığını algılayabilir:

int lineCount;

if (weLikeToCount) {
lineCount = countLines();
} else {
lineCount = 0;
}

print(lineCount);

Üst düzey ve sınıf değişkenleri tembelce başlatılır; başlatma kodu değişken ilk kez kullanıldığında çalışır.

Late Variables — Late Değişkenleri

late belirtecinin iki kullanım durumu vardır:

  • Bildiriminden sonra ilklendirilen ve sıfırlanamayan bir değişkeni bildirmek.
  • Bir değişkeni tembelce başlatma.

Genellikle Dart’ın kontrol akışı analizi, null olmayan bir değişkenin kullanılmadan önce null olmayan bir değere ayarlandığını tespit edebilir, ancak bazen analiz başarısız olur. İki yaygın durum üst düzey değişkenler ve örnek değişkenlerdir: Dart genellikle bunların ayarlanıp ayarlanmadığını belirleyemez, bu yüzden denemez.

Bir değişkenin kullanılmadan önce ayarlandığından eminseniz, ancak Dart bunu kabul etmiyorsa, değişkeni late olarak işaretleyerek hatayı düzeltebilirsiniz:

late String description;

void main() {
description = 'Kaç kere kırılır ulan bir kalp!';
print(description);
}

Uyarı: late bir değişkeni başlatmazsanız, değişken kullanıldığında bir çalışma zamanı hatası oluşur.

Bir değişkeni late olarak işaretlediğinizde ancak bildiriminde ilklendirdiğinizde, değişken ilk kez kullanıldığında ilklendirici çalışır. Bu tembel ilklendirme birkaç durumda kullanışlıdır:

  • Değişkene ihtiyaç duyulmayabilir ve onu başlatmak maliyetlidir.
  • Bir örnek değişkeni başlatıyorsunuz ve başlatıcının buna erişmesi gerekiyor.

Aşağıdaki örnekte, temperature değişkeni hiçbir zaman kullanılmazsa, pahalı readThermometer() işlevi hiçbir zaman çağrılmaz:

// Bu, programın readThermometer() işlevine yaptığı tek çağrıdır.
late String temperature = readThermometer(); // Tembelce başlatıldı.

Final and const

Bir değişkeni asla değiştirmeyi düşünmüyorsanız, var veya bir türe atamanın yanı sıra ek olarak final veya const kullanın. Bir final değişkeni yalnızca bir kez ayarlanabilir; bir const değişkeni derleme zamanı sabitidir. (Const değişkenler dolaylı olarak finaldir.)

Not: Örnek değişkenler(Instance Variables) final olabilir ancak const olamaz.

İşte bir final değişken oluşturma ve ayarlama örneği:

final name = 'Bob'; // Tip açıklaması olmadan
final String nickname = 'Bobby';

final bir değişkenin değerini değiştiremezsiniz:

name = 'Alice'; // Error: bir final değişken yalnızca bir kez ayarlanabilir.

Derleme zamanı sabitleri olmasını istediğiniz değişkenler için const kullanın. Eğer const değişkeni sınıf seviyesindeyse, static const olarak işaretleyin. Değişkeni bildirdiğiniz yerde, değeri bir sayı veya dize değişmezi, bir const değişken veya sabit sayılar üzerinde bir aritmetik işlemin sonucu gibi bir derleme zamanı sabitine ayarlayın:

const bar = 1000000; // Basınç birimi (dynes/cm2)
const double atm = 1.01325 * bar; // Standart atmosfer

const anahtar sözcüğü yalnızca sabit değişkenler bildirmek için kullanılmaz. Aynı zamanda sabit değerler oluşturmak ve sabit değerler oluşturan kurucuları bildirmek için de kullanabilirsiniz. Herhangi bir değişken sabit bir değere sahip olabilir.

var foo = const [];
final bar = const [];
const baz = []; // const []` ile eşdeğerdir`

Yukarıdaki baz ifadesinde olduğu gibi, const bildiriminin başlatma ifadesinden const ifadesini çıkarabilirsiniz.

Eskiden const bir değere sahip olsa bile, final olmayan, const olmayan bir değişkenin değerini değiştirebilirsiniz:

foo = [1, 2, 3]; // const idi []

const bir değişkenin değerini değiştiremezsiniz:

baz = [42]; // Error: Sabit değişkenlere bir değer atanamaz.

Tür kontrolleri ve dökümleri (is ve as), koleksiyon if ve yayma operatörlerini (… ve …?) kullanan sabitler tanımlayabilirsiniz:

const Object i = 3; //  Burada i, int değerine sahip bir const Nesnedir...
const list = [i as int]; // Bir tipleme kullanın.
const map = {if (i is int) i: 'int'}; // Use is and collection if.
const set = {if (list is List<int>) ...list}; // ...and a spread.

Not: Bir final nesnesi değiştirilemese de, alanları değiştirilebilir. Buna karşılık, bir const nesnesi ve alanları değiştirilemez: bunlar değişmezdir.

--

--