✓ MusicApp with Dagger Hilt ( Data-Domain- UI Layer )
Bu Kotlin uygulaması, iTunes API'den alınan verilerle oluşturulmuştur. Bu Kotlin uygulamasında, veri işleme, iş mantığı ve kullanıcı arayüzü ile ilgili sorumlulukları ayrı katmanlara bölmek için Data, Domain ve UI katmanlarını kullanmayı tercih ettim. Verilerin API'den alınması ve işlenmesi için çeşitli framework'ler ve kütüphaneler kullandım. Ayrıca, kullanıcı deneyimini iyileştirmek için sayfalama (pagination) yöntemi de uygulanmıştır. Bu yaklaşım, uygulamanın verileri verimli bir şekilde yönetmesini ve büyük veri kümeleriyle başa çıkmasına yardımcı olması amaçlanmıştır.
Proje, birçok kütüphane ve bileşen kullanılarak geliştirilmiştir ve güncel teknolojilerle kullanıcı ve uygulama etkileşimini en hızlı şekilde sağlamayı hedeflemektedir. Tasarımı kullanıcı etkileşimini ön planda tutacak şekilde yapılmıştır. Uygulama, kullanıcı dostu bir arayüz ve etkileşimli özellikler sunmak için özenle geliştirilmiştir.
- Pagination
- Dagger Hilt
- Data-Domain-UI Layer
- Retrofit
- Room
- Navigation Component
- Splash Screen API
- Coroutine
- Flow
- LifeCycle
- Shared Preferences
- Coil
Data, Domain ve UI katmanları, yazılım mimarisi konseptlerinden biri olan MVVM (Model-View-ViewModel) ve Clean Architecture prensipleriyle ilişkilidir. Her bir katman, belirli bir sorumluluk ve iş mantığı için tasarlanmıştır.MVVM (Model-View-ViewModel) mimarisi, UI Layer (Activity, Fragment vb.) ve ViewModel arasında bir bağlantı noktası sağlar. ViewModel, kullanıcının arayüz ile etkileşimini yönetir, gerekli verileri Domain Layer'dan alır ve UI Layer'a sunar. ViewModel, UI durumunu takip eder ve verilerin doğru bir şekilde güncellenmesini sağlar.Clean Architecture prensipleri, bu katmanların bağımsız olmasını ve birbirlerine bağımlılık oluşturmamalarını sağlar. Bu sayede, her katmanı ayrı ayrı geliştirmek, test etmek ve değiştirmek kolaylaşır.Benim bu projede uyguladıgım bu pattern başta uygulamada bir takım bussines logic leri yönetmenizi gerektitiyor ancak daha sonrasında yeni bir şey ekleme ve test edilebilirlik açısından işimi çok kolaylaştırıyordu.Kısıca kullandığım yapılarla bunları ilişkilendiricek olursam:
- Dagger Hilt: Bağımlılıkları yönetmek ve enjeksiyon yapısı sağlamak için data katmanında kullanılabilir.
- Retrofit: Veri API'si ile iletişim kurmak ve veri alışverişi yapmak için data katmanında kullanılabilir.
- Room: Veritabanı işlemlerini yönetmek, verileri saklamak ve erişmek için data katmanında kullanılabilir.
- Coroutine: Asenkron işlemleri yönetmek ve verileri işlemek için data katmanında kullanılabilir.
- Flow: Veri akışını yönetmek ve reaktif programlama yapmak için data katmanında kullanılabilir.
- Shared Preferences: Küçük verileri saklamak ve yönetmek için data katmanında kullanılabilir.
- Pagination: Veri akışını yönetmek, sayfalama işlemlerini gerçekleştirmek ve verilerin etkili bir şekilde yönetilmesini sağlamak için domain katmanında kullanılabilir.
- Navigation Component: Uygulama içinde gezinme ve sayfa yönlendirmeleri için UI katmanında kullanılabilir.
- Splash Screen API: Uygulama başlangıcında bir açılış ekranı oluşturmak ve kullanıcı deneyimini iyileştirmek için UI katmanında kullanılabilir.
- Coroutine: Asenkron işlemleri yönetmek, iş parçacığı yönetimini iyileştirmek ve UI etkinliklerini engellemeden verileri işlemek için UI katmanında kullanılabilir.
- LifeCycle: Uygulamanın yaşam döngüsünü izlemek ve uygun aksiyonlar almak için UI katmanında kullanılabilir.
- Coil: Resim yüklemeyi ve görüntüleri işlemeyi kolaylaştırmak için UI katmanında kullanılabilir.
Kaynak:https://developer.android.com/topic/architecture
MusicApp.ItunesSearchRepository.kt.MusicApp.app.main.2023-07-13.13-58-56.mp4
dependencies {
// Hilt
implementation("com.google.dagger:hilt-android:2.44")
kapt("com.google.dagger:hilt-android-compiler:2.44")
implementation("androidx.hilt:hilt-navigation-compose:1.0.0")
// Retrofit
implementation("com.squareup.retrofit2:retrofit:2.9.0")
implementation("com.squareup.retrofit2:converter-gson:2.9.0")
// http client
implementation("com.squareup.okhttp3:okhttp:4.10.0")
//interceptor
implementation("com.squareup.okhttp3:logging-interceptor:4.10.0")
// Navigation Components
implementation "androidx.navigation:navigation-fragment-ktx:2.5.3"
implementation "androidx.navigation:navigation-ui-ktx:2.5.3"
// Coroutines
implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-core:1.6.4'
implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.6.4'
// Coroutine Lifecycle Scopes
implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:2.6.1"
implementation "androidx.lifecycle:lifecycle-runtime-ktx:2.6.1"
//BottomBar
implementation 'com.github.ismaeldivita:chip-navigation-bar:1.4.0'
//circle
implementation 'de.hdodenhof:circleimageview:3.1.0'
//pagination
def paging_version = "3.1.1"
implementation "androidx.paging:paging-runtime:$paging_version"
//Coil
implementation 'io.coil-kt:coil:1.3.2'
//room
implementation 'androidx.room:room-runtime:2.5.2'
kapt 'androidx.room:room-compiler:2.5.2'
annotationProcessor "androidx.room:room-compiler:2.5.2"
implementation "androidx.room:room-ktx:2.5.2"
//splashScreen
implementation "androidx.core:core-splashscreen:1.0.1"
}