Proje boyunca öğrendiğim ve kullanmaya çalıştığım teknolojiler, mimariler, kütüphaneler vs.
MVVM, yazılım geliştirmede kullanılan bir mimari tasarım desenidir.
Amaç, uygulamanın farklı katmanlarını birbirinden ayırarak daha düzenli, okunabilir ve sürdürülebilir bir kod yapısı oluşturmaktır.
Özellikle Android uygulama geliştirmede yaygın olarak kullanılır.
-
Model
- Uygulamanın veri katmanıdır.
- Veri sınıfları (örneğin:
User,Product) ve veri kaynaklarını temsil eder. - API, veritabanı veya cache’den gelen bilgileri içerir.
- İş mantığı burada değil, sadece veriyi temsil eder.
-
View
- Kullanıcıya gösterilen arayüzdür (Activity, Fragment, XML layout dosyaları).
- Kullanıcıdan input alır ve çıktıları ekranda gösterir.
- Kendi içinde iş mantığı barındırmaz, sadece görüntüleme işini yapar.
-
ViewModel
- Model ve View arasındaki köprü görevi görür.
- Veriyi View’e hazırlar, iş mantığını burada uygular.
- Lifecycle-aware (yaşam döngüsünden haberdar) olduğu için ekran döndüğünde (rotate) veriler kaybolmaz.
- View’den bağımsızdır → test edilebilirliği kolaydır.
-
Repository (Ekstra Katman)
- Genellikle MVVM projelerinde kullanılan ek bir katmandır.
- Veri kaynağıyla ilgili tüm işleri üstlenir (API, veritabanı, cache).
- ViewModel, Repository’den veri ister ama Repository’nin nasıl çalıştığını bilmez.
- Böylece bağımlılıklar azalır.
- Katmanlar arası bağımsızlık → Model, View, ViewModel birbirinden ayrı çalışır.
- Data Binding desteği vardır → ViewModel’deki değişiklikler otomatik olarak UI’ya yansır.
- Lifecycle yönetimi → ViewModel, ekran döndürme gibi durumlarda verileri korur.
- Test edilebilirlik → İş mantığı View’den ayrıldığı için test yazmak kolaydır.
- Temiz kod → Kodlar daha düzenli, okunabilir ve sürdürülebilir olur.
- Kullanıcı uygulamada "Kullanıcıları Listele" butonuna tıklar (View).
- ViewModel, bu isteği Repository’ye iletir (ViewModel).
- Repository, API’den kullanıcı listesini alır (Model/Repository).
- Gelen liste ViewModel’e döner, ViewModel bunu işler.
- ViewModel veriyi View’e gönderir ve arayüz otomatik güncellenir (Data Binding).
- Temiz mimari sağlar, kodun okunabilirliği artar.
- Veri kaybolmaz → Ekran rotate edilse bile ViewModel veriyi korur.
- Kolay test edilebilir → ViewModel ayrı olduğu için iş mantığı bağımsız test edilebilir.
- Geliştirici verimliliği → UI ile iş mantığı ayrıldığı için takım çalışması kolaylaşır.
- Memory leak riski azalır → Lifecycle-aware yapısı sayesinde gereksiz nesneler bellekte tutulmaz.
- MVC: Controller, hem iş mantığı hem de UI ile ilgilenir → zamanla karmaşık hale gelir.
- MVVM: View sadece arayüzle ilgilenir, ViewModel iş mantığını üstlenir → daha düzenli ve sürdürülebilir yapı sağlar.
Hilt, Android’de Dependency Injection (Bağımlılık Enjeksiyonu) işlemini kolaylaştıran bir kütüphanedir.
Google tarafından geliştirilmiş olup Dagger üzerine inşa edilmiştir.
- Nesnelerin (örneğin
Repository,Retrofit,Room) yönetimini otomatik yapar. - Kod tekrarını azaltır, modülerlik sağlar.
- Test yazmayı kolaylaştırır.
- Büyük projelerde bağımlılıkların yönetimini basitleştirir.
- @Inject → Bir sınıfın bağımlılıklarını Hilt’in sağlamasını sağlar.
- @Module & @Provides → Hilt’e hangi nesneyi nasıl oluşturacağını söyler.
- @Singleton → Nesnenin tek bir örneğini (instance) oluşturur.
- @HiltViewModel → ViewModel bağımlılıklarını otomatik olarak enjekte eder.
- @AndroidEntryPoint → Hilt’in dependency injection yapacağı sınıfları işaretler (Activity, Fragment).
- MVVM: ViewModel içinde Repository veya UseCase bağımlılıklarını Hilt otomatik olarak sağlar.
- REST API: Retrofit, OkHttp gibi ağ nesneleri Hilt modüllerinde tanımlanır ve kolayca enjekte edilir.
- Kod tekrarını azaltır.
- Daha temiz ve okunabilir mimari sağlar.
- Test edilebilirliği artırır (Mock nesneler kolay eklenir).
- MVVM ve REST API yapısıyla uyumlu çalışır.
- Coroutines, Kotlin'de asenkron (aynı anda birden fazla iş) ve eşzamanlı programlamayı kolaylaştıran yapıdır.
- Normalde asenkron işlemler (ör. ağ istekleri, veritabanı işlemleri) çok karmaşık olabilir, ancak Coroutines bunları basit fonksiyonlar gibi yazmamızı sağlar.
- Hafiftir: Binlerce coroutine aynı anda çalışabilir, sistemin performansını zorlamaz.
- Arka planda işlem yapma: Ağ çağrıları, veritabanı sorguları gibi zaman alan işler ana thread’i (UI) bloke etmeden çalışır.
- Kolay okunur kod: Callback cehennemi yerine düz, sıralı kod gibi görünür.
- Hafiflik: Thread’lerden çok daha az kaynak tüketir.
- Suspend Fonksiyon: Bekleme yapabilen fonksiyon. Örn:
suspend fun getData(). - Scope (CoroutineScope): Coroutine’lerin hangi yaşam döngüsünde çalışacağını belirler.
GlobalScope→ Uygulama süresince yaşar.viewModelScope→ ViewModel ile yaşar.lifecycleScope→ Activity/Fragment ile yaşar.
- Dispatcher: Coroutine’in hangi thread’de çalışacağını belirler.
Dispatchers.Main→ UI işlemleriDispatchers.IO→ Ağ / Veritabanı işlemleriDispatchers.Default→ Yoğun CPU işlemleri
- Coroutines, Kotlin’in modern asenkron çözümüdür.
- Okunabilir, hafif ve verimli kod yazmayı sağlar.
- UI’yi dondurmadan arka planda işlem yapmaya imkan tanır.
- StateFlow, Kotlin Coroutines kütüphanesinde bulunan, her zaman bir değer tutan hot Flow türüdür.
- ViewModel → UI arasında güncel durumu (state) paylaşmak için kullanılır.
- Yeni kolektörler (observer) her zaman en son değeri hemen alır.
- Hot Flow → Kolektör olmasa bile değer saklar.
- Her zaman bir başlangıç değeri gerekir.
- Thread-safe →
valueveyaupdate {}ile güvenli güncelleme yapılır. - UI ile uyumlu → Compose’da
collectAsState(), Activity/Fragment’talifecycleScopeile kolayca kullanılabilir.
- ViewModel’deki veriyi tek kaynak (single source of truth) olarak yönetir.
- State değişimlerini otomatik olarak UI’ye yansıtır.
- Test edilebilir ve coroutine tabanlı çalışır.
- UI state yönetimi (örneğin: yükleniyor, hata, veri listesi).
- MVVM + Compose projelerinde ViewModel’den gelen veriyi UI’ye aktarmak.
- Cold Flow’ları
stateInile StateFlow’a çevirerek en son değeri saklamak.
REST (Representational State Transfer) API, istemci (client) ile sunucu (server) arasındaki iletişimi sağlayan bir web servisidir. HTTP protokolünü kullanır. Modern yazılım geliştirmede en yaygın kullanılan servis iletişim yöntemlerinden biridir.
- Farklı uygulamalar arasında veri alışverişini sağlar.
- Örneğin: Mobil uygulama → Sunucudan kullanıcı bilgilerini almak için REST API kullanır.
- Platform bağımsızdır: Android, iOS, web uygulamaları aynı API üzerinden iletişim kurabilir.
-
HTTP metodları ile çalışır:
GET→ Veri getirir (Read)POST→ Yeni veri ekler (Create)PUT→ Var olan veriyi günceller (Update)DELETE→ Veriyi siler (Delete)
-
JSON en yaygın kullanılan veri formatıdır (XML, plain text de olabilir).
-
Stateless (durumsuz): Her istek bağımsızdır, sunucu istemcinin önceki isteklerini hatırlamaz.
-
Endpoint mantığı:
/users→ Tüm kullanıcıları getirir/users/5→ ID’si 5 olan kullanıcıyı getirir
REST API, her isteğe bir HTTP status code ile yanıt verir. Bu kodlar isteğin sonucunu belirtir:
- 200 OK → İstek başarılı
- 201 Created → Yeni kaynak oluşturuldu
- 204 No Content → İşlem başarılı, fakat içerik yok
- 400 Bad Request → Hatalı istek
- 401 Unauthorized → Yetkisiz erişim
- 403 Forbidden → Yetki yok
- 404 Not Found → Kaynak bulunamadı
- 500 Internal Server Error → Sunucu hatası
- Basit ve anlaşılırdır.
- Hafiftir ve hızlıdır.
- Yaygın desteklenir, öğrenmesi ve kullanması kolaydır.
- Platformdan bağımsızdır, her dil ve ortamda kullanılabilir.
Retrofit, Android için geliştirilmiş bir HTTP istemci kütüphanesidir.
REST API’lerle haberleşmeyi kolaylaştırır.
Normalde ağ (network) işlemleri karmaşıktır, Retrofit bu süreci basitleştirir.
- API isteklerini kolayca yapmanı sağlar.
- JSON verilerini otomatik olarak Java/Kotlin objelerine dönüştürür.
- Ağ işlemlerinde hata yönetimi ve asenkron (eşzamansız) çalışma desteği sunar.
- Okunabilir ve sürdürülebilir kod yazmayı sağlar.
- Kolay kullanım → Basit arayüzler üzerinden API istekleri yapılır.
- JSON Parsing →
Gson,Moshigibi kütüphanelerle JSON verileri otomatik parse edilir. - Asenkron Çalışma → Callback veya Coroutines ile çalışır.
- Dinamik URL desteği → URL parametreleri, header bilgileri kolayca eklenebilir.
- RxJava & Coroutines desteği → Modern asenkron programlamayla uyumludur.
- Kod tekrarını azaltır.
- Ağ işlemlerini düzenli ve okunabilir hale getirir.
- Test edilebilirliği artırır.
- Hata yönetimini kolaylaştırır.
- OkHttp, Android ve Java için popüler bir HTTP istemcisidir.
- Ağ işlemlerini (GET, POST, PUT, DELETE gibi) hızlı ve güvenli bir şekilde yapmayı sağlar.
- Retrofit, arka planda HTTP isteklerini yönetmek için genellikle OkHttp kullanır.
- Hafif ve hızlıdır.
- Cache (önbellek) desteği ile internet yokken de veri sağlayabilir.
- Interceptor desteği sayesinde:
- Loglama yapabilir,
- Header ekleyebilir,
- Token yenileme işlemleri gibi özel durumları yönetebilir.
- Timeout (zaman aşımı) ayarlarını kolayca yapmayı sağlar.
- Doğrudan HTTP istekleri atmak için.
- Retrofit ile birlikte API işlemlerinde.
- Ağ trafiğini loglamak veya özelleştirmek için.
OkHttp, Android uygulamalarında internet üzerinden veri alışverişini kolaylaştıran, hızlı, güvenli ve esnek bir kütüphanedir. Retrofit gibi popüler kütüphanelerin temelinde de OkHttp vardır.
- Jetpack Compose, Android’in modern UI toolkit’idir.
- XML yazmadan, tamamen Kotlin kodu ile arayüz oluşturmayı sağlar.
- Deklaratif bir yaklaşım kullanır: "Ne görmek istiyorum?" diye tanımlarsın, Compose gerisini halleder.
- Daha az kod → Daha okunabilir ve bakımı kolay.
- Deklaratif Yapı → UI güncellemelerini otomatik yapar. State değişirse ekran kendini yeniler.
- Daha Az Kod → XML ve Adapter karmaşasına gerek kalmaz.
- Kotlin ile Güçlü Entegrasyon → Coroutine, Flow gibi modern Kotlin özellikleriyle uyumlu.
- Material Design Desteği → Buton, Card, TextField gibi hazır UI bileşenleri içerir.
- Hızlı Önizleme (Preview) → Android Studio’da anında tasarımı görebilirsin.
- XML + Adapter yerine tek noktadan, sade bir şekilde UI geliştirme.
- State yönetimi kolaydır (örneğin
mutableStateOfile). - Daha az boilerplate kod → daha hızlı geliştirme.
- Test edilebilirliği artırır.
- Google, gelecekte Android UI geliştirme için Compose’u merkez yapıyor → uzun vadeli yatırım.
- Yeni Android projelerinde varsayılan UI çözümü olarak kullanılır.
- MVVM + Compose çok iyi çalışır → ViewModel’deki veriyi direkt UI’ye yansıtabilirsin.
- Hızlı prototipleme için uygundur.
- Google’ın en güncel tasarım dili.
- Material You konsepti ile birlikte geldi.
- Kullanıcı cihazından tema renkleri alabilir → kişiselleştirilmiş tasarım.
- Modern ve uyumlu görünüm.
- Daha yuvarlak köşeler, dinamik renkler.
- Android 12+ cihazlarda sistem renklerini otomatik alabilir.
- Compose ve XML ile uyumlu.
- Butonlar, kartlar, input alanları gibi UI bileşenlerini güncel tasarımla oluşturmak.
- Kullanıcıya cihazı ile bütünleşmiş bir deneyim sunmak.
- Navigation Compose, Jetpack Compose ile birlikte kullanılan navigasyon kütüphanesidir.
- Uygulama içinde farklı ekranlar (screen) arasında geçiş yapmayı sağlar.
- Eski
Fragmenttabanlı yapıya gerek kalmadan, tamamen Compose uyumlu çalışır.
- Deklaratif yapıya uygun, Compose ile sorunsuz çalışır.
- Kod okunabilirliği yüksektir.
- Parametre gönderme ve alma işlemleri kolaydır.
- Back stack (geri dönüş yığını) otomatik yönetilir.
- Deep link desteği vardır.
- Çok ekranlı Compose uygulamalarında.
- Kullanıcı akışlarını (ör. giriş → ana sayfa → profil) yönetmek için.
- Alt menü (BottomNavigation) ve üst seviye navigasyonlarda.
Navigation Compose, Compose tabanlı uygulamalarda ekran geçişlerini kolaylaştıran, modern ve sade bir navigasyon çözümüdür.
- SharedPreferences, Android’de küçük verileri kalıcı olarak saklamak için kullanılan bir yapıdır.
- Key-Value (anahtar-değer) mantığıyla çalışır.
- Genellikle kullanıcı ayarları, basit konfigürasyonlar veya oturum bilgileri gibi veriler saklanır.
- Uygulama kapatılsa bile veriler kaybolmaz.
- Kullanıcı tercihlerini (örn: gece modu açık/kapalı), giriş bilgilerini veya küçük flag’leri saklamak için idealdir.
- Hafif ve hızlıdır, veritabanı kullanmaya gerek kalmaz.
- Key-Value Store: Veriler anahtar adıyla kaydedilir ve çağrılır.
- Primitive tipleri destekler:
String,Int,Boolean,Float,Long. - Kalıcıdır: Silinmediği sürece cihazda kalır.
- Kolay Kullanım: Tek satır kod ile veri yazılıp okunabilir.
- Küçük veriler için çok hızlı ve pratik.
- Kullanıcı deneyimini geliştirmek için idealdir (ör. dil seçimi, tema modu).
- Ekstra yapılandırma gerektirmez.
- Kullanıcının giriş yapıp yapmadığını saklamak (
isLoggedIn = true). - Uygulama temasını hatırlamak (örn: dark mode tercihi).
- Basit uygulama ayarlarını (örn: bildirim açık/kapalı) depolamak.