Dart Null Safety Nedir?
Merhaba bu yazımda null safety ve bunun Dart dilinde nasıl ele alındığını ve kodumuzda nasıl kullanabileceğimizi aktaracağım. Ancak önce konuya girmeden önce anlamamız gereken bazı noktalar var.
Nedir bu null?
Null konusunu anlamak için biraz daha derine yolucuk edelim. Şimdiki durağımız bellek yani bildiğimiz RAM. Bellek bloklar halinde çalışır, ilgili bloktan verilerimizi yazarız okuruz. Bu veriler bizim bir sınıfımızın referansı olabilir ya da bir değişkenimizin içindeki veri olabilir. Peki bizim elimizde bir sınıf var ancak biz buna henüz bir eşitleme yapmadık, bu durumda elimizde hiçbir yeri gösteren bir değişken var. Evet bu değişken bellekte bir yer kaplıyor, bu kapladığı alanda aslında sakladığımız verinin adresini tutacak ama öyle bir adres yok. Yani bellekte sadece temsilcimiz var ve temsil ettiği şey henüz yok. Null aslında bellekte sıfırıncı indisi temsil eder yani olmayan bir yeri.
Null boş demek mi? Bunu anlatmak için aşağıdaki görsel oldukça güzel. Biri boş, diğeri tamamen yok eşittir null.
Sanırım null’ı anladık, şimdi biz niye elimizde hiçbir şeyi göstermeyen bir şey tutalım ki? Bunun çeşitli cevapları olabilir, bir API’dan veri çekeriz ancak veri her zaman gelmek zorunda olmayabilir, değerini sonra ayarlamak üzere bir değişken oluşturmamız gerekebilir gibi arttırılabilir.
Şimdiki sorumuz ise “Bir değişken null olsa ne olmasa ne?” Bunun cevabı oldukça basit aslında biz elimizdeki değişkeni bir butona başlık olarak vermek istiyorsak buton bizden kesin olarak string şeklinde başlık bekleyecektir. Ona başka bir şey vermek istediğimizde ise kabul etmeyecektir. Bu sebeple elimizdeki verinin kesin şekilde doğru olduğundan emin olmamız lazım.
Şimdi Dart ile bunu nasıl kullanabiliriz nasıl yapabilir bakalım:
Bu yazı itibarıyla Dart için bu özellik henüz tam sürüme çıkmış durumda değil o yüzden sadece test uygulamalarınızda kullanmanızı öneririm. Aynı zamanda bu özellik henüz Flutter için de kullanılabilir değil. Bu yazıdakileri test etmek için https://nullsafety.dartpad.dev adlı test sitesini kullanacağım.
Nasıl Optional Değişkenler Oluşturulur?
Bir çok dilde olduğu gibi Dart içinde değişken tipinin belirttikten sonra “?” eklemeniz yeterlidir.
Şimdi sıradaki işlem ise bu null değişkeni bir nullable olmayan değişkene eşitlemeye çalışalım.
Anında hatayı aldık, aldığımız hata bize kısaca optional bir değişeni optional olmayan değişkene doğrudan veremezsin diyor. Peki hatayla karşılaşmadan çözmenin yolları neler hemen bakalım:
Burada görmüş olduğunuz üzere “?? 0” şekinde bir şey ekledik. Bu aslında önüne yazdığımız nullable değişkenin null olması durumunda onun yerine bir default değerdir. Çıktıyı incelediğimizde aNullableInt o esnada null olmasına rağmen value değişkenimiz 0 değerini aldı.
Bazı durumlarda default değer olması işimizi çözmeyecektir. Örneğin kullanıcı giriş yaparken null geldi diye servisimize default değer ile istek atmamamız gerekir. Bunu kontrol etmek için ise önce if ile null olup olmamasını kontrol etmeliyiz.
basit bir şekilde null olmadığını kontrol ettik ve içeride ! kullandık, aslında bu ünlem ile biz diyoruz ki “merak etme bu optional olsa bile sana geldiği zaman null olmayacak, ben sana garanti veriyorum”. Bu sayede 6 değerini okuyabiliyoruz. Peki if kullanmadan ! kullansak ve null gelse ne olur?
Pek hoş şeyler olmadı, işin sonunda uygulamamız crash ederek çalışmaz duruma geldi. O yüzden ! kullanırken çok dikkatli olmamız gerekiyor.
Şimdi sıra geldi nullable varsa not nullable olmaz mı elbette olur. Bunu kullanmak için ise değişken tipimizin ya da var keywordün önüne late yazıyoruz.
late ile belirttiğimiz değişkene null atayamayız bunu kullanırken de verinin kesin geldiği konusunda emin olmalıyız.
Nullable olayı dikkatli kullanıldığında bir çok yerde faydalı olabiliyor, ancak yeni öğrenme konusunda birtakım sorunlara yol açabiliyor. Şimdi ise bu konu hakkında bazı karşımıza çıkabilecek senaryolara bakalım.
Elimizde bir listemiz ve içerisinde string tipinde değerler olsun. Senaryolara bakalım:
List<String> => Bu durumda listemiz ve içerisinde null değer olamaz.
List<String> ? => Bu durumda ise listemiz null olabilir ancak içerisinde null değer(ler) olamaz.
List<String?> ? => Bu durumda ise hem listemiz null olabilir hem de içerisinde null değer(ler) tutabilir.
Senaryo farklı objelerle çeşitlendirilebilir. Bu yazımda genel mantığı ve kullanım şeklini umarım anlatabilmişimdir. Bana sorularınızı yorumlar kısmından iletebilirsiniz. Yazı için kullandığım kaynakları hemen altta bulabilirsiniz aynı zamanda çok daha detaylı yazıyı da hemen alta ekliyorum, keyifli kodlamalar :)