DEV Community

Cover image for Null Safety 💫 🌌 ✨
Gülsen Keskin
Gülsen Keskin

Posted on • Updated on

Null Safety 💫 🌌 ✨

İçindekiler:
Tip sistemlerinde null yapılabilirlik
Null yapılamayan ve null yapılabilen türler
Null yapılabilir türleri kullanma

Tip sisteminde null yapılabilirlik
Null safety, statik tip sistemde başlar çünkü diğer her şey buna dayanır. Dart programınızın içinde tam bir tür evreni vardır: int ve String gibi ilkel türler, Liste gibi koleksiyon türleri ve sizin ve kullandığınız paketlerin tanımladığı tüm sınıflar ve türler.

Tip teorisi lingo'da, Null tipi, tüm tiplerin bir alt tipi olarak ele alındı:
Image description

Bazı ifadelerde izin verilen işlemler kümesi (getters, setters, methods ve operatörler) türüne göre tanımlanır. Tür Liste ise, üzerinde .add() veya [] öğesini çağırabilirsiniz. Eğer int ise, + arayabilirsiniz. Ancak null value, bu methodlardan hiçbirini tanımlamaz. Null'un başka türden bir ifadeye akmasına izin vermek, bu işlemlerden herhangi birinin başarısız olabileceği anlamına gelir. Bu gerçekten null referans hatalarının en önemli noktasıdır - her başarısızlık null üzerinde sahip olmadığı bir method veya property aramaya çalışmaktan kaynaklanır.

Null yapılamayan ve null yapılabilen türler

Null safety, tür hiyerarşisini değiştirerek bu sorunu kökünden ortadan kaldırır. Null türü hala vardır, ancak artık tüm türlerin bir alt türü değildır. Bunun yerine, tür hiyerarşisi şöyle görünür:

Image description

Null artık bir alt tür olmadığından, özel Null sınıfı dışında hiçbir tür null değerine izin vermez. Bu tüm türlerin varsayılan olarak null yapılamaz hale geldiğini ifade eder.

// Using null safety:
makeCoffee(String coffee, [String? dairy]) {
  if (dairy != null) {
    print('$coffee with $dairy');
  } else {
    print('Black $coffee');
  }
}
Enter fullscreen mode Exit fullscreen mode

Null yapılabilir türleri kullanmak

// Varsayımsal sağlam olmayan boş güvenlik:
bad(String? maybeString) {
  print(maybeString.length);
}

main() {
  bad(null);
}
Enter fullscreen mode Exit fullscreen mode

Null yapılamayan bir türü, null yapılabilir bir tür bekleyen bir şeye geçirmek her zaman güvenlidir.
Null yapılabilir bir tür bekleyen bir şeye güvenle null iletebilirsiniz, bu nedenle Null ayrıca her null yapılabilir türün bir alt türüdür:

Image description

Ancak diğer yöne gitmek ve null yapılabilir bir türü, temeldeki null olmayan türü bekleyen bir şeye geçirmek güvenli değildir.

// Varsayımsal sağlam olmayan boş güvenlik:
requireStringNotNull(String definitelyString) {
  print(definitelyString.length);
}

main() {
  String? maybeString = null; // Or not!
  requireStringNotNull(maybeString);
}
Enter fullscreen mode Exit fullscreen mode

Bu program güvenli değildir. Bununla birlikte, Dart her zaman implicit downcasts (örtük düşüşler) denilen bir şeye sahiptir. Örneğin, String bekleyen bir fonksiyona Object türünde bir değer iletirseniz, tür denetleyicisi buna izin verir:

// null safety olmadan:
requireStringNotObject(String definitelyString) {
  print(definitelyString.length);
}

main() {
  Object maybeString = 'it is';
  requireStringNotObject(maybeString);
}
Enter fullscreen mode Exit fullscreen mode

Sağlamlığı korumak için derleyici, requireStringNotObject() argümanına sessizce bir as String dökümü ekler. Bu döküm, çalışma zamanında başarısız olabilir ve bir istisna oluşturabilir, ancak derleme zamanında Dart, bunun sorun olmadığını söyler. Null yapılamayan türler, null yapılabilir türlerin alt türleri olarak modellendiğinden, implicit downcasts String? bekleyen bir şeye bir String'i geçmenize izin verir.

// Using null safety:
requireStringNotObject(String definitelyString) {
  print(definitelyString.length);
}

main() {
  Object maybeString = 'it is';
  requireStringNotObject(maybeString as String);
}
Enter fullscreen mode Exit fullscreen mode
// null safety olmadan:
List<int> filterEvens(List<int> ints) {
  return ints.where((n) => n.isEven);
}
Enter fullscreen mode Exit fullscreen mode

Hatayı fark ettiniz mi? .where() yöntemi lazy'dir, bu nedenle bir Liste değil Iterable bir değer döndürür.

Image description

Bu resimde null yapılamayan türlerden oluşan bir bölge vardır. Bu türler, tüm ilginç yöntemlere erişmenize izin verir, ancak hiçbir zaman null içeremez. Ve sonra karşılık gelen tüm null yapılabilir türlerin paralel bir ailesi vardır. Bunlar null'a izin verir, ancak onlarla fazla bir şey yapamazsınız.

devamı bir sonraki yazıda ...😴

Resource

Top comments (0)