Mixin Nedir ve Neden Kullanılır?
Çalıştığım şirketteki Flutter ve Dart’a yeni başlayan arkadaşlara Dart dilinin özelliklerini anlattığım ufak eğitimler veriyorum. 2021 yılının ilk videosunu çekerken, anlattığım konunun aslında, çoğu kısmen tecrübeli arkadaşlar da dahil, kullanılmadığını farkettim ve sizleri Dart’ın mixin yapısına doğru bir yolculuğa çıkarmak istedim.
Mixinlere neden ihtiyacımız var?
Eğer Java, Swift ve Kotlin gibi farklı dillerden geliyorsanız, interface ya da protocol kavramları sizlere yabancı olmayan kavramlar olmalı. Interfaceleri, sınıflarınızın ne olduğunu anlatan, sahip olabilecekleri özellikleri belirten sanal kurallar olarak düşünülebiliriz.
Klasik Nesne Yönelimli Programlama’da(Object Oriented Programming/OOP) bir sınıf sadece başka bir sınıftan extend edilebilirken, bir sınıf pek çok interface’e sahip olabilir. Bu da sizin sınıfınıza ekstra özellik ve kural eklemenizde size yardımcı olan temel kurallardan biridir.
Lakin, Dart dilinde interface kavramı bulunmamaktadır. Interface ile özellik eklemeye en yakın kavram, abstract class kavramı. abstract class yardımı ile ortak özellik sahibi olan sınıflarınıza, sahip olmaları gereken sanal kuralları belirtebiliyoruz. Fakat Dart, OOP üzerindeki kuralları takip ettiği için, bir sınıf sadece başka bir sınıftan extend edilebilir. Bu da sınıf yapısı derinleştikçe bizleri sınırlamaktadır. İşte burada mixin kavramı devreye girmektedir.
Mixinler nedir?
Yukarıdaki senaryoyu düşünelim. Vehicle temel sınıfından extend edilmiş üç tane sınıfımız var. Car, Bicycle ve Motorcycle sınıfları, kendi içlerinde kategorilere ayrılmazken, abstract class bizim için fazlasıyla yeterli olacaktır. Ancak, sınıflar büyüdükçe birbirleri arasında paylaşabilecekleri özellikler artarken, her özellik her sınıf için geçerli olmayabiliyor. Dolayısı ile bazı özelliklerin kolayca eklenip çıkarılabilmesi gerekiyor. İşte burada mixin kavramı devreye giriyor.
mixinler sınıflarınıza extra özellikler ekleyebileceğiniz, içerisinde fonksiyonlar ve değerler tutabilen, birden fazla mixin ile bir araya getirilebilecek yapılardır.
Ben mixinleri Lego parçalarına benzetiyorum. İstediğiniz parçayı ekleyip, istediğiniz şekilde objenizi şekillendirmenize yardımcı olurlar.
Mixinler nasıl kullanılır?
mixinleri kullanmak için, yukarıda gördüğümüz örnek üzerinden geliştirmeye yapacağız.
Öncelikle, Vehicle abstract classını oluşturarak başlıyoruz.
Yukarıdaki sınıf, bir aracın sahip olabileceği hızlanma, yavaşlama, aracın kapasitesi ve o anki hızını tutan değerler ve fonksiyonları tutuyor. Bunu kullanmak için kullanacağınız sınıftan extend kelimesi ile sınıfı extend etmeniz yeterli.
Yukarıdaki örnekte Car sınıfı Vehicle extend edilerek oluşturuluyor. Oluşturulduğunda sizden, 3 tane fonksiyonu override ederek, kendi sınıfınızdaki isteğiniz/ihtiyacınız doğrultusunda doldurabilirsiniz. Siz de bu örneği düşünerek Bicycle ve Motorcycle sınıflarını oluşturabilirsiniz.
Yukarıdaki şekilde görüldüğü üzere, bir bisiklet ve araba/motorsiklet arasında, çalışma prensibi farkı var. Bir bisiklet manuel çalışırken, araba/motorsiklet motorla çalışmaktadır. Sınıflarımıza bu özellikleri eklemek için mixinler oluşturuyoruz.
Yukarıdaki örnekte gördüğümüz üzere, mixin
kelimesi ile başlayıp sonrasında mixinimize isim veriyoruz. mixin içerisinde, değerler ve fonksiyonlar bulunabilirler.
Yukarıdaki örnekte motoru çalıştırmak için bir fonksiyonumuz var ve motorun çalışıp çalışmadığını kontrol edebileceğimiz bir değer var. Şimdi gelin, bu mixini kullanmayı öğrenelim.
mixin kullanılırken with
kelimesi yardımı ile mixinimizi sınıfımıza ekliyoruz. Birden fazla eklemek istediğimiz takdirde, mixinler arasına virgül koyarak dilediğimiz kadar mixin ekleyebiliriz.
mixin eklendikten sonra, artık EngineMixin
içerisindeki her değer ve fonksiyon artık kullanımımıza hazır oluyor. Yukarıda, hızı arttırmadan ya da azaltmadan önce motorun çalışmadığını isEngineInitiated
değeri ile kontrol ederken, hızı arttırmaya çalışırken motor çalışmadıysa, motoru çalıştırıyoruz.
Aynı kontrolleri, Motorcycle sınıfı için de çok rahat yapabiliriz.
İki örneği karşılaştırdığınızda, benzerlikler dikkatinizi çekebilir. Ancak, bu operasyonlar Bicycle sınıfı için kullanabileceğimiz operasyonlar değiller. Bicycle için, farklı bir mixin oluşturacağız.
Yukarıdaki mixin, bisiklete bindiğinizde başlangıç aşamasında kendimizi ittiğimizi düşünürsek, bu olayın olmadığını kontrol etmemiz için bir değer sağlarken, bu itme operasyonunu başlatmak için bir fonksiyon tutuyor.
Bicycle sınıfı yukarıdaki mixini ilk kalkış hızını belirlerken farklı bir şekilde kullanıyor ve şimdiden bu ayrımın faydasını görmeye başladık.
Ancak, mixinler hala birbirinden çok farklı değiller ve çoklu kullanımı görmedik. Bunun için iki tane mixin ekleyelim.
Bu iki mixin farklı motor tiplerine göre yakıt kullanımına yardımcı olan 2 fonksiyon barındırmakta. Burada burada yeni bir kullanım şekli var. on
kelimesi burada yeni bir kullanıma yardımcı oluyor. on kelimesi, kullanacağınız mixinin kullanılabileceği mixinleri ya da sınıfları sınırlandırmanıza yardımcı olan özel bir kelimedir. Yani, yukarıdaki mixinler sadece ve sadece EngineMixin kullanan sınıflar içerisinde kullanılabilirler.
Çoğumuzun bildiği üzere, Tesla’lar full elektrikli motora sahipken, Toyota arabaları çoğunlukla hibrit (hem benzin hem de elektrik kullanabilen) motora sahiplerdir. Bu araç sınıflarını oluştururken, mixinlerin faydasını görebiliriz. Tesla sınıfına sadece elektrik kullanma özelliği eklenebilmişken, mixinler sayesinde Toyota üzerine hem elektrik hem de benzin kullanma özelliği eklenebildi.
Mixinler ne zaman kullanılılır?
mixin kullanmak istiyorsanız, genel olarak olabilecek 3 senaryo şunlar:
- Belirli bir fonksiyonu ya da davranışı farklı sınıflar arasında paylaşmak istiyorsanız
- Belirli bir sınıf hiyerarşisinde, bazı fonksiyonları paylaşmak mantıklı değilse
- freezed gibi paketlerde JSON operasyonları yaparken
mixinler çok kullanışlı ve Flutter içerisinde yoğun olarak kullanılan bir yapıdır (örneğin SingleTickerProviderStateMixin). Doğru kullanım ile işlerinizi rahatlatabilir ve kodunuzu daha test edilebilir ve kontrol edilebilir halde tutar.
Bugünlük bu kadar, herhangi bir sorunuz varsa buraya yazabilirsiniz. Beni Twitter üzerinden takip ederek yeni video ve makalelerden haberdar olabilirsiniz. Herkese mutlu yıllar!