Dart Dilinde Asenkron (Asynchronous) Programlama Nedir?
Dart dilini keşfetme yolunda devam ederken bazı kavramların öneminden, ne iş yaradığından da bahsetmeden geçmek olmaz. Bu yazımda sizlere Asenkron(Asynchronous) programlama nedir?, dart dilinde ne işe yarıyor? gibi sorduğum sorulara bulduğum cevapları paylaşmayı düşünüyorum. O zaman hazırsanız başlayalım.
Dart nesneye yönelik ve senkron şekilde çalışan bir programlama dilidir. Kodlar yukarıdan aşağıya doğru sırayla işlenir ve bir satırdaki işlem bitmeden diğer satıra geçilmez. Buna senkron yapı denilebilir. Asenkron bir yapıda ise uzun zaman alan veya farklı görevdeki işlemler aynı anda gerçekleştirilir.
Asenkron Programlama Nedir?
Asenkron programlama, işin parçalara ayrılıp tüm işlemlerin aynı anda sürdürülmesini sağlar. Yani asenkron programlama ile programımız içerisinde yazdığımız bir kodu işletebilirken, aynı program içerisinde diğer kodları da işletebiliriz. Bu sayede kullanıcı programımızın bir bölümünü kullanırken, başka bir bölümü ile de işlem yapabilir.
Asenkron kod neden önemlidir?
Asenkron(eş zamansız) işlemler, başka bir işlemin bitmesini beklerken programınızın çalışmasına izin verir. Bazı yaygın asenkron işlemler şunlardır:
- Bir ağ üzerinden veri alınması
- Bir dosyadan veri okumak
Peki bunu Dart dilinde nasıl gerçekleştiriyoruz?
Dart dilinde yer alan Future classını kullanıyorz.Async ve await sözcükleri ile bu işlemi yapabiliyoruz.
Burada ayrıca incelememiz gereken iki anahtar kelime var: async ve await. Asenkron olarak çalıştırmak istediğimiz herhangi bir işte, ona asenkron modifierın eklenmiş olması gerekir. Bu modifierı şu şekilde basit bir örnekle açıklayabiliriz;
Önce await kavramına gelelim. Await bölümü temelde bu fonksiyonu asenkron olarak çalıştırın ve bittiği zaman bir sonrakine devam edin diyor;
Bu kod bloğunu inceleyecek olursa, önemli 2 nokta vardır. Öncelikle hello() fonksiyonunu asenkron olarak çalıştıracağımız için ana metot üzerinde async modifierı kullanıyoruz. İkinci olarak await modifierını asenkron fonksiyonumuzun hemen önüne yerleştiriyoruz. Bu nedenle buna genelde async/await pattern denir.
Peki Dart tüm bunları arka planda nasıl çalıştırıyor?
Asenkron bir işlevi beklediğinizde, asenkron işlem yürütülürken kodun içinde yürütülmesi askıya alınır. İşlem tamamlandığında, await değeri bir future nesnesi içinde yer alır.
Aşağıdaki örneği inceleyelim. Burada 3 tane fonksiyon tanımlanmıştır ve sırası ile fonksiyonlar çağrılmıştır. 2. fonksiyonda for döngüsü yardımı ile biraz zaman alan bir işlem gerçekleştirilmiştir. Normal senkron programlamada 2. fonksiyonun çağrıldığı satıra geldiğinde program o fonksiyonun bitmesini bekler. Fakat asenkron yapıda ise 2. fonksiyonun sonucunu beklemeden sıradaki kod çalıştırılır. Yani fonksiyon 3 e atlanır. İşlem bu şekilde devam eder ve ardından sonlanır.
Yukarıda görmüş olduğumuz gibi işlemler asenkron gitti. Burada dikkat etmeniz gereken nokta Dart 2 ile gelen güncellemedir. Asenkron fonksiyonlarda işleme sonuçları bazen bekletilmek istenebilir. Bunun için await ifadesi kullanılır. Dart dilinin önceki sürümlerinde asenkron fonksiyonlarda sadece async ifadesinin kullanılması yeterli iken Dart 2’den sonra, asenkron bir fonksiyon tanımlarsanız bu fonksiyonun await ifadesi yok ise onu null yapmalısınız. (await null;)
Future kavramı nedir?
Asenkron fonksiyonlar Future sınıfını geriye döndürür. Bu sınıf jenerik bir değer alan sınıftır. Yani bir değer döndürmek istiyorsanız, o değerin türünü Future sınıfına bildirmelisiniz. Future sınıfı size bir callback işlevi sunar. Böylece işleminiz bittiğinde ne olacağına karar verebilirsiniz. Örneğin kullanıcı internet üzerinden bir dosya indirecek fakat dosyanın boyutu çok büyük. Siz bu fonksiyonu asenkron bir biçimde tanımladınız. Daha sonra Future sınıfının then metodu ile işlem bittiğinde ne yapılacağını kodlayabiliyoruz.
Son olarak senkron ve asenkron programlamaya birer örnek vererek yazıya son verelim;
Asenkron örnek senkron örnekten şu şekilde ayrılmaktadır;
- CreateOrderMessage() için dönüş türü String’den Future <String> olarak değişir.
- Async anahtar sözcüğü createOrderMessage() ve main() işlev gövdelerinden önce görünür.
- Await anahtar sözcüğü, zaman uyumsuz fetchUserOrder() ve createOrderMessage() işlevlerini çağırmadan önce görünür.
Yazıyı okumaya zaman ayırdığınız için teşekkürler. Eskik bir nokta mevcutsa lütfen düzeltmekten çekinmeyiniz. Bir sonraki yazıda görüşmek üzere. :)
Daha fazlası ve sorularınız için bana sosyal medya hesaplarım üzerinden ulaşabilirsiniz. Linkedin |Instagram |Twitter