Flutter’ın Mimarisi ve Dart’ın Flutter üzerindeki etkisi

Muhammed Salih Guler
Flutter Türkiye
Published in
5 min readJun 26, 2020
https://www.concettolabs.com/blog/how-flutter-app-development-influences-startups-and-enterprises/

Son zamanlarda Türkiye’den Flutter’a olan ilginin çok arttığını gördüm. Bir yılı aşkın bir süre önce Türkçe kaynak oluşturma ve Flutter’ı ileri götürme amacıyla kurduğumuz Flutter Türkiye’nin meyvelerinin vermeye başladığını görmek gerçekten sevindirici bir durum.

Flutter uygulama geliştirmek için gerçekten çok değerli bir SDK. Her yerde performans olarak muadillerinden daha ileri seviyede olduğunu, arka planda pek çok işlemin dönerek bize güzel bir geliştirici tecrübesi sağladığını duyuyoruz. Ama bu işlemler nasıl oluyor? İşte bunları bu yazı serisinde öğreneceğiz.

Flutter’ın Görünen Yüzü

Yaptığım bir sunum için aşağıdaki resmi oluşturmuştum. Bu resime baktığımızda Flutter’ın genel çalışma prensibini az çok anlayabiliyoruz. Gelin beraber daha detaylıca inceleyelim.

Flutter yazarken Dart dilini kullanıyoruz ancak, hepimizin aklındaki genel soru şu: Dart nasıl bulunduğu platform ile haberleşebiliyor?

Platform

Dart dili ile yazdığımız kodların genelde iki klasmanda platform ile haberleştiğini düşünebiliriz. Platform kısmıyla haberleşirken, Flutter bulunduğu platformdan bir canvas ve kullanıcı etkileşimini dinleyebileceği event listesini istiyor.

Canvas’ı yazılan dart kodunun görsel kısmını ekrana çizmek için kullandığımız boş bir tuval* olarak düşünebiliriz. Widget’ları çizerken platformdan bunun dışında extra bir bilgi istemiyoruz. Grafik motorumuz olan Skia cihazın GPU’su ile haberleşerek ekrana çizim işlemini gerçekleştiriyor.

Event’ler ise kullanıcının cihaz üzerinde yaptığı etkileşimler bütünü olarak düşünülebilir. Kullanıcı etkileşimlerine örnek olarak ekrana dokunmak, uzun tıklamak, çift tıklamak vs. gibi pek çok kullanıcı etkileşimi örnek olarak düşünülebilir.

Servisler

Hepimizin bildiği üzere her cihaz kendine özgü donanım ve özelliğe sahiptir. Bunlara erişirken cihaza ait, cihazın anlayacağı dilden onlara ulaşmamız gerekiyor.

Bunlara ulaşmak adına Dart Platform Channels (platform kanalları) adında bir konsept ile karşımıza çıkıyor. Platform channels’ı, Dart sanal makinası ve platform arasında sanal bir kanal açıp, byte yollayarak ve kabul ederek haberleşme imkanı sunan mantıksal kanallar açma konsepti olarak düşünebiliriz.

Platform channels sayesinde cihaza ait olan kamera, ses, Bluetooth, lokasyon işlemleri gibi servislere ve daha fazlasına ulaşım imkanımız oluyor.

Flutter’ın Mimarisi

Flutter’ın mimarisine baktığımız zaman, Flutter’ın ne kadar detaylı düşünüldüğünü ve bilgisayar bilimlerindeki pek çok veri yapısı ve algoritmanın ne kadar efektif bir şekilde kullanıldığını apaçık görmek mümkün.

Tree

Birinci ve belki de en belirgin olan performans kararı, Flutter’ın içerisinde sıkça rastlayacağımız Tree (Ağaç) veri yapısıdır. Bu yapının aktifçe kullanılmasında tabii ki pek çok sebep var ancak sebeplerin temeline indiğimizde iki tanesinin öne çıktığını görüyoruz. Birincisi, veri yapısı içerisinde hızlıca hareket edip gerekli veriye hızlıca ulaşabilmek. İkincisi, ise bu veri yapısı içerisinde gerekli değişikliklerin, Flutter’ın kendi içerisindeki Key yapısının da kullanılarak, çok hızlı bir şekilde yapılabilmesi.

Tree Shaking

Tree shaking konsepti, tree kategorisi ile aynı yerde olmalı gibi düşünebilirsiniz, ancak öyle değil. Tree shaking, bir uygulama çıktısı aldığımızda kullanılmayacak kodun, Dart ekosistemi tarafından ortadan kaldırıması anlamına geliyor. Bu sayede, herhangi istediğiniz kütüphaneyi ya da kodu dilediğiniz gibi projenize ekleyebilirsiniz (tabii ki eklememeniz ya da eklediğiniz kütüphaneleri takip etmeniz sizin yararınıza), son uygulama çıktısı aldığınızda, kullanılmayan kodlardan kurtulmuş olunacaktır.

Aggressive Layering

Yazılım geliştirmede, mimari düzenlerle ilgili biraz araştırma yaparsanız, layered architectural pattern (katmanlı mimari düzen) hakkında bir ya da iki şey mutlaka gözünüze çarpacaktır.

Layered architectural pattern özellikle mobil yazılım aleminde sıkça görülen bir mimari düzen şeklidir. Açık kaynak projelere bakarken eminim ui, data, domain gibi katmanların olduğu projeleri görmüşsünüzdür. Layered architectural pattern uygularken temel amaç, her bir katmanı kendine has bir iş yapacak şekilde ayırmaktır. Yukarıdaki örnekten devam edersek, ui kısmı sadece görüntü gösterecek, herhangi bir bağlantıdan bilgi çekmek gibi ek işlemleri kesinlikle yapmayacaktır.

Flutter’da aynı mimari kararı kendi platformu için kullanmakta ve katmanların sorumluluklarını birbirinden ayırarak geliştirme yapmaktadırlar. Onların katmanlarını aşağıdaki şemadan görebiliriz.

Bu katmanların sayesinde hem performans katkısı alırken, hem de kullanıcılara sadece kullandıkları veya kullanacakları katmanlara ulaşım imkanı sağlayarak, kalan kısımları karşı belirli bir soyutlama getirerek, işlerin fazla karmaşık bir hale gelmesi engellenmektedir.

Dart’ın Flutter üzerindeki etkisi

Flutter ortaya çıktığı ilk günden beri (buna alfa zamanları da dahildir), Dart dilinin neden kullanıldığı ile ilgili pek çok soru soruldu. Dart dilinin şimdiki olgunluğunda olmaması sebebi ile de pek çok eleştiri aldı. Ancak, yazılımcılar olarak çok şanslıyız, çünkü Dart ekibinin en iyi yaptığı işlerden birisi toplulukları dinlemekti. Dart dilini modernize etmek için topluluktan gelen her bilgiyi kullanarak daha modern bir dil oluşturdular. Ancak tabi ki Dart’ı kullanmalarında bundan daha da büyük teknik sebepler vardı.

JIT ve AOT

Dart dili kendisine ait sanal makinası olan bir dil. Bu bize pek çok özellik getiriyor.

JIT (Just in Time) derleme tipi Dart’ın sanal makinasında gerçekleşen ve bizim geliştirme hızımızı çok ileri seviyeye çıkarmamıza yarayan büyük bir getiri. iOS ve Android geliştirirken her bir değişiklik için uzun zamanlar beklediğimizi hepimiz biliyoruz. JIT, Dart sanal makinası, soketler yardımı ile her daim haberleşerek, kod üzerinde yaptığımız her değişikliği anında sanal makinada derleyerek, çalıştırma halinde direkt hedef platforma yüklemesini yapıyor. Bu sayede hepimizin sevdiği, Hot Reload ve Hot Restart özelliklerine sahip olmuş oluyoruz.

AOT (Ahead of Time) derleme tipinde ise Dart dilinin derlediği kodu önce Assembly diline sonrasında ise makina diline derlemeye yardımcı olan başka önemli bir özellik. AOT, uygulama derlendiğinde kodu native ARM ya da X64 makina koduna çeviriyor. Dolayısı ile yazdığımız dilden bağımsız, kodumuz direkt olarak işlemcinin ya da basit bir dille cihazımızın anlayacağı dile çeviriliyor.

Sonuç olarak, bu iki derleme tipi sayesinde Flutter ciddi performans getirisi elde ediyor. Ama Dart’ın getirisi bununla sınırlı değil.

Garbage Collection

Flutter’ın mimarisi sebebi ile obje oluşturulup, ortadan kaldırılması sıkça yaşanan bir operasyon olarak göz batıyor. Ortadan kaldırılan objelerin hafızamızda yer kaplayıp, bize yük olmasını istemediğimiz için, çoğu modern dilde karşımıza çıkan garbage collection (çöp toplama) yeteneğinin Dart dilinde de olması, Dart dilinin seçilmesindeki bir diğer sebep.

Dart dili GC (Garbage Collection) sistemini hızlıca kullanılmayan objeleri temizleyecek şekilde Flutter için şekillendirdiği için, genel olarak fazladan bir işlem yapmadan gerekli tüm performans kazanımlarını Dart dilinin sağladığını görebiliriz.

Sonuç olarak, yazı serisinin bu kısmında, Flutter’ın kendi içerisindeki mimarisi, nasıl çalıştığı ve Dart diliyle ilgili pek çok bilgiyi öğrendik. Herhangi bir sorunuz varsa buraya yorum olarak yazarak ya da bana aşağıdaki Twitter hesabımdan ulaşarak sorabilirsiniz. Görüşmek üzere 👋

https://twitter.com/salihgueler

* Canvas kelimesinin Türkçe karşılığı tuval demek.

dip not: Flutter öğrenmek istiyorsanız aşağıdaki kaynağa bakabilirsiniz.

--

--