Jetpack Compose Neden Devrim Sayılıyor?
Android UI'ının Yeniden Doğuşu
"Devrim" kelimesi yazılım dünyasında çok sık kullanılır. Her yeni kütüphane, her yeni framework kendini devrimsel olarak tanıtır. Çoğu zaman bu iddia abartılıdır.
Jetpack Compose için bu iddia abartılı değildir. Compose, Android UI geliştirmenin temel paradigmasını değiştirdi. Bu değişim bir özellik eklemek ya da bir API'yi yenilemek değildir — düşünme biçiminin kendisini dönüştürmektir.
İmperatif'ten Deklaratif'e: Zihniyetin Değişimi
Android'in klasik UI yaklaşımı imperatif bir paradigmaya dayanıyordu. "Şunu yap, sonra bunu yap, sonra şunu değiştir" mantığı. Bir butonu gizlemek için button.visibility = View.GONE yazılıyordu. Bir metni güncellemek için textView.text = "Yeni metin" çağrılıyordu. UI'ı bir durumdan başka bir duruma taşımak, her adımın elle kodlandığı bir süreçti.
Bu yaklaşımın temel sorunu şuydu: UI'ın şu anki durumunu her zaman tutarlı tutmak geliştiricinin sorumluluğundaydı. Kullanıcı oturum açtıysa şu buton görünür, şu metin değişir, şu liste yüklenir. Bu koşulların tamamını doğru sırayla ve eksiksiz uygulamak karmaşıklaştı ve hata payı büyüdü.
Compose deklaratif bir yaklaşım getirir. "UI şöyle görünmeli" dersiniz, Compose bunu sağlar. State değiştiğinde ne yapılacağını tarif etmezsiniz — state değiştiğinde UI'ın nasıl görüneceğini tarif edersiniz. Compose gerekli değişiklikleri kendisi hesaplar ve uygular.
Bu fark küçük görünebilir. Ama pratikte her şeyi değiştirir.
Composable: Yeni Temel Yapı Taşı
Compose'da UI'ın temel birimi View değil, Composable fonksiyondur.
@Composable annotasyonu ile işaretlenmiş her fonksiyon bir UI bileşeni tanımlar. Bu fonksiyon state'i parametre olarak alır ve o state'e karşılık gelen UI'ı üretir. State değiştiğinde fonksiyon yeniden çağrılır ve UI güncellenir.
Bu yaklaşım birkaç derin sonuç doğurur.
UI bileşenleri artık sınıflar değil fonksiyonlardır. Fonksiyonlar birleştirilebilir, parametrize edilebilir, başka fonksiyonlara geçirilebilir. Bu esneklik View hiyerarşisinin hiç sunmadığı bir kompozisyon gücü sağlar.
Küçük, tek sorumlu Composable'lar büyük ve karmaşık UI'lar oluşturmak üzere birleştirilir. Her Composable bağımsız olarak test edilebilir, preview'da görüntülenebilir ve başka bağlamlarda yeniden kullanılabilir.
State ve Recomposition: Otomatik Güncelleme
Compose'un en güçlü özelliği recomposition mekanizmasıdır.
Compose, hangi Composable'ların hangi state'e bağımlı olduğunu takip eder. State değiştiğinde yalnızca o state'i kullanan Composable'lar yeniden çalıştırılır — tüm UI yeniden oluşturulmaz. Bu akıllı güncelleme mekanizması hem doğruluğu hem de performansı garanti altına alır.
remember ve mutableStateOf kombinasyonu bu sistemin temel araçlarıdır. Bir state değişkeni tanımlanır, bu değişken Composable içinde kullanılır ve değişken değiştiğinde Compose otomatik olarak ilgili bölümü günceller. Bir invalidate() çağrısı yoktur, bir notifyDataSetChanged() yoktur, elle tetiklenen hiçbir güncelleme yoktur.
XML'e Kıyasla Pratik Kazanımlar
Compose'un XML üzerindeki avantajları somut ve ölçülebilirdir.
Tek dil, tek dosya. UI mantığı ve UI yapısı artık aynı Kotlin dosyasında yaşar. XML ile Kotlin arasındaki zihinsel geçiş ortadan kalkar. Bir Composable'ı anlamak için tek bir dosyaya bakmak yeterlidir.
Derleme zamanı güvenliği. XML'in runtime inflation sorunu yoktur. Compose UI'ı derleme zamanında Kotlin kodu olarak işler. Tip hataları, null erişimleri — bunlar çalışma zamanına değil, derleme zamanına taşınır.
Preview desteği. @Preview annotasyonu ile Composable'lar Android Studio içinde canlı olarak görüntülenebilir. Birden fazla preview farklı state'ler, farklı tema'lar ya da farklı cihaz boyutları için aynı anda tanımlanabilir.
Animasyonların kolaylaşması. Compose'un animasyon API'leri, XML animatörlerine kıyasla hem daha güçlü hem de çok daha az kod gerektirir. Basit bir görünüm/kaybolma animasyonu AnimatedVisibility ile tek satıra iner.
Material Design 3 ve Tema Sistemi
Compose, Material Design 3 ile birlikte gelir ve tema sistemi temelden yeniden tasarlanmıştır.
Renk, tipografi ve şekil tanımları merkezi bir MaterialTheme nesnesinde toplanır. Her Composable bu temaya otomatik olarak erişir. Tema değiştiğinde — örneğin karanlık mod açıldığında — tüm UI tutarlı biçimde güncellenir. Özel renkler ve stiller oluşturmak, bunları her bileşene tekrar tekrar uygulamak yerine tek noktadan yönetmek mümkün hale gelir.
Compose'un Henüz Olgunlaşmadığı Noktalar
Devrim olduğunu söylemek, kusursuz olduğunu söylemek değildir.
Compose'un bazı özellikleri hâlâ olgunlaşma sürecindedir. Karmaşık liste senaryolarında LazyColumn performansı bazı durumlarda RecyclerView'ın gerisinde kalabilir. Mevcut bir XML projesiyle interop çalışmak ek dikkat gerektirir. Öğrenme eğrisi, özellikle state yönetimi konusunda dik başlayabilir.
Ve tüm ekosistem henüz Compose'a tam geçiş yapmamıştır. Bazı üçüncü parti kütüphaneler Compose desteği eklerken diğerleri hâlâ yolun ortasındadır.
Neden Devrim?
Compose'u devrimsel yapan şey tek bir özellik değildir. Geliştirici deneyiminin bütünündeki dönüşümdür.
XML döneminde Android UI geliştirmek; iki farklı dosya sistemi, iki farklı dil, çalışma zamanı hataları ve manuel state yönetimi anlamına geliyordu. Compose ile bunların hepsi tek bir tutarlı Kotlin deneyimine dönüştü.
Bu dönüşüm Android'i daha kolay öğrenilir kıldı, daha hızlı geliştirmeye olanak verdi ve çok daha test edilebilir UI'lar üretmeyi mümkün kıldı. Yeni başlayan geliştirici de deneyimli geliştirici de bu değişimin etkisini hissetti.
Android'in UI geliştirme tarihi Compose öncesi ve Compose sonrası olarak ikiye ayrılıyor — ve bu ayrım gelecekte daha da belirginleşecek.