Kotlin’de Delegates.Observable Yapısı

Mustafa Dincay
Huawei Developers - Türkiye
3 min readAug 23, 2022
Kotlin

Giriş

Herkese merhaba, bu yazımda Kotlin’de olan Delegates.observable ve Delegates.vetoable yapılarını anlatmaya çalışıcam. Hazırsanız başlayalım.

Android’de LiveData, Flow yapıları gibi yapıların arkasındaki temel yapı işte bu observable yapısıdır. Observable harici bir patterndir. Kotlinde ise Delegates.observable ve Delegates.vetoable olmak üzere 2 adet yapı vardır. Bu yapılar Kotlinle birlikte observable yapıyı kolayca kullanabilelim diye olan yardımcı yapılardır. Peki bu yapılar ne için kullanılır? Temel kullanım amacı, bir değişkene yeni bir değer atandığında haberinizin olmasını istiyorsanız işte bu yapıyı kullanabilirsiniz. Mesela bir bankacılık uygulamasında çalışıyorsunuz ve kullanıcının balance değerini backendden çekmek için 10 dakikada bir istek atıyosunuz. Gelen değere göre UI da bu setleme işlemini yapıyosunuz. Bunu 10 dakikada bir kontrol etmek yerine observable bir yapı sayesinde bu değer değiştiğinde bu işlemin yapılmasını sağlamak çok daha mantıklı olacaktır. Genelde bu gibi durumlarda Livedata ve Flow kullanılır ama observable yapı daha küçük, kısıtlı özellikleri olan bir yapı olduğu için basit bir işlemde Livedata, Flow kullanmak istemeyebilirsiniz. İşte o zaman observable yapıyı kullanabilirsiniz.

Delegates.vetoable ın Delegates.observable dan farkı, vetoable ın geri dönüş tipi Boolean iken observable ın geri dönüş tipi Unit dir. Yani örnek vermek gerekirse mesela bir borsa uygulamasında paranın son değerinin yükseldiği zaman haber verilmesi, değerinin değişmesi isteniyorsa vetoable yapısı kullanılmalıdır. Eğer observable kullanılırsa o değer artsa da azalsa da her durumda haber verilecektir.

Aşağıdaki örnekte User adında bir class görüyorsunuz. name ve balance olmak üzere iki tane propertysi var. name Delegates.observable balance ise Delegates.vetoable olarak kullanılmıştır. name propertysinde başlangıç değeri olarak initial value değeri verilmiştir. name propertysine yeni bir değer atandığı zaman initial value old value olacak ve atanan yeni değer new value olacaktır. balance propertysinde ise Delegates.vetoable yapısı kullanıldığı için yeni değer eğer eski değerden büyükse değer değişikliği yapılacaktır. İlk başta initial value 0 olarak verilmiştir. Daha sonra ise10 değeri atanıyor. Bu değer yani new value, old value olan 0 dan büyük olduğu için atama yapılıyor. Fakat daha sonradan atanan 8 değeri 10 değerinden küçük olduğu için atama işlemi yapılmıyor.

Kotlin Observable Pattern

Yapı genel olarak bu şekilde. Ama Kotlin’de aslında boilerplate kod yazmayalım diye Delegates.observable ve Delegates.vetoable yapılarını hazır bir şekilde kullanabiliyoruz. Bu yapıları interface ya da higher order fonksiyonlar ile kendimiz de yazabiliriz.

Yukarıdaki örnekte görüldüğü gibi TestObservableInterface adında bir class var. Parametre olarak Notify Interface ini alıyor. Interface in ise onNotify adında bir fonksiyonu var. Parametre olarak oldValue ve newValue olmak üzere int tipinde 2 adet property alıyor. Görüldüğü gibi balance başlangış değeri 0 olarak verilmiş(yani initial value). Daha sonrasında set fonksiyonunda onNotify fonksiyonu çağırılıyor ve parametre olarak field ve value veriliyor. Burada field yani propertynin tuttuğu değer oldValue ya, value ise sonradan atanan newValue ya karşılık gelmektedir. field = value işleminde ise oldValue newValue oluyor ve bu sayede atama işlemi yapılmış oluyor. Aynı yapı TestObservableHigherOrder classında da mevcut. Parametre kısmında 2 adet Int tipinde değer alan ve geriye Unit döndüren bir higherorder fonksiyon görüyoruz. Aynı işlemler burda da yapılıyor.

Kotlin Observable Pattern with Interface and HigherOrder Function

Sonuç

Özetlemek gerekirse, LiveData ya da Flow kullanmak istemiyeceğiniz kadar küçük bir yerde observable bir yapıya ihtiyaç duyarsanız, Kotlin’de ihtiyacınıza göre Delegates.Observable ve Delegates.Vetoable yapılarını kullanabilirsiniz.

Referanslar

Observable Properties

--

--