0Pricing
Android Academy · Ders

Modül Bağımlılıklarını Yönetme

Grafiği temiz ve döngüsüz tutun.

Modül Bağımlılıklarını Yönetme, CoddyKit'te ücretsiz bir Android Academy dersidir. Bu, 4 dersinin 3. dersidir. Aşağıdan dersin tamamını ücretsiz okuyabilir, sonra tarayıcıda yerleşik kod editörü ve 7/24 yapay zeka koçu ile uygulamalı olarak pratik yapabilirsin. Bu, Android Academy öğrenme yolunun bir parçasıdır ve ilerlemeniz web ve CoddyKit uygulaması arasında senkronize olur. Android Academy kursu toplamda 4 dersten oluşur.

Bağımlılık Grafiği

Her modül, bağlı olduğu diğer modülleri bildirir. Bunların tümü birlikte bir bağımlılık grafiği oluşturur. Sağlıklı bir grafik, DAG'dir (yönlü döngüsüz grafik): bağımlılıklar tek bir yöne işaret eder ve hiçbir zaman döngü oluşturmaz.

Bu derste bağımlılıkları temiz biçimde bildirmeyi, doğru Gradle yapılandırmasını seçmeyi, sürümleri paylaşmayı ve döngüleri önlemeyi öğreneceksiniz.

Modül Bağımlılığı Bildirme

dependencies bloğunun içinde project(":path:to:module") kullanarak başka bir modüle bağımlılık eklersiniz. Yol, klasörleri yansıtır ve settings.gradle.kts içinde bildirdiğiniz değerle eşleşir.

// feature/profile/build.gradle.kts
dependencies {
    implementation(project(":core:data"))
    implementation(project(":core:designsystem"))
    implementation(project(":core:model"))
}

implementation ve api

Seçtiğiniz yapılandırma, tüketicilere neyin sızacağını belirler:

  • implementation: bağımlılık özeldir. Size bağımlı modüller bunu göremez. Varsayılan tercih budur.
  • api: bağımlılık yeniden dışa açılır (geçişli). Bunu yalnızca herkese açık türleriniz bu bağımlılıktan geliyorsa kullanın.

Neredeyse her zaman implementation kullanmayı tercih edin — gizli bir bağımlılık değiştiğinde tüketicilerin yeniden derlenmesi gerekmediği için derleme hızını artırır.

// core/data/build.gradle.kts
dependencies {
    // Repository signatures return :core:model types,
    // so consumers need to SEE it -> api
    api(project(":core:model"))

    // Network is an internal detail -> implementation
    implementation(project(":core:network"))
}

implementation Derlemeleri Neden Hızlandırır

implementation kullanıldığında Gradle, gizli bir bağımlılıktaki değişikliğin modülün herkese açık ABI'sini etkileyemeyeceğini bilir. Bu nedenle tüketicilerin yeniden derlenmesi gerekmez. api kullanıldığında ise değişiklik her geçişli tüketiciye yayılır.

Pratik kural: Bir bağımlılık yalnızca modülün herkese açık türlerinde (dönüş türleri, herkese açık parametreler) görünüyorsa api içine konur. Aksi durumda implementation kullanın.

// Public -> needs api
fun observeUser(): Flow<User>   // Flow and User leak out

// Internal -> implementation is enough
private val client: OkHttpClient // never exposed

Sürümleri Merkezileştirme: Sürüm Kataloğu

Çok sayıda modül varken kütüphane sürümlerini her yerde tekrarlamak istemezsiniz. Gradle'ın sürüm kataloğu (gradle/libs.versions.toml) sürümleri ve takma adları tek bir yerde tanımlar. Her modül aynı takma ada başvurur.

# gradle/libs.versions.toml
[versions]
compose-bom = "2024.09.00"
retrofit = "2.11.0"

[libraries]
compose-bom = { group = "androidx.compose", name = "compose-bom", version.ref = "compose-bom" }
retrofit = { group = "com.squareup.retrofit2", name = "retrofit", version.ref = "retrofit" }

Katalogu Bir Modülde Kullanma

Modüller daha sonra kütüphanelere oluşturulan libs erişimcisi üzerinden başvurur. Derleme dosyasında sürüm numaralarının bulunmaması, yükseltmelerin tek bir yerden yapılabileceği anlamına gelir.

// core/network/build.gradle.kts
dependencies {
    implementation(platform(libs.compose.bom))
    implementation(libs.retrofit)
}

En Büyük Günah: Döngüler

Döngü, A modülünün B'ye bağımlı olması ve B'nin doğrudan veya bir zincir üzerinden A'ya geri bağımlı olmasıdır. Gradle, döngüsel bir bağımlılığı derlemeyi reddeder. Bu durum aynı zamanda bir tasarım sorununa da işaret eder: iki modül arasındaki sınır yanlıştır.

// :feature:cart  -> implementation(project(":feature:checkout"))
// :feature:checkout -> implementation(project(":feature:cart"))
//
// Gradle error:
// Circular dependency between the following tasks:
// :feature:cart:compile -> :feature:checkout:compile -> :feature:cart:compile

Döngüyü Kırma

Bir döngüyü kırmak için ortak parçayı, her ikisinin de bağımlı olabileceği daha alt bir modüle çıkarın. İki özellik birbirinin verilerine ihtiyaç duyuyorsa bu ortak sözleşme, özelliklerden birinde değil çekirdekte bulunmalıdır.

Bu, aşağı doğru akışı yeniden sağlar: iki özellik de aşağıda bulunan çekirdeğe yönelir ve çekirdek hiçbir zaman yukarıya yönelmez.

// Before: cart <-> checkout (cycle)
// After:  cart -> :core:order  <-  checkout

// core/order/OrderContract.kt
data class Order(val items: List<CartItem>, val total: Double)

// feature/cart    -> implementation(project(":core:order"))
// feature/checkout-> implementation(project(":core:order"))

Tersine Çevirme: Soyutlamalara Bağımlı Olma

Bazen düşük düzeyli bir modül, daha üst bir düzeyde bulunan davranışa ihtiyaç duyar. Yukarıya bağımlı olmak yerine düşük düzeyli modülde bir arayüz tanımlayın ve üst düzey modülün bağımlılık ekleme yoluyla uygulamayı sağlamasına izin verin. Buna bağımlılıkların tersine çevrilmesi denir.

// core/analytics defines the contract
interface AnalyticsLogger {
    fun log(event: String)
}

// :app provides the real implementation and injects it down
@Module
@InstallIn(SingletonComponent::class)
object AnalyticsModule {
    @Provides
    fun logger(impl: FirebaseAnalyticsLogger): AnalyticsLogger = impl
}

Grafiği Görselleştirme ve Koruma

Gradle'dan modül grafiğini yazdırmasını veya görselleştirmesini isteyebilir, hatta yasaklanmış bir bağımlılık ortaya çıkarsa derlemeyi başarısız kılan bir test ekleyebilirsiniz (örneğin bir çekirdek modülünün bir özelliğe bağımlı olması). module-graph eklentisi gibi araçlar otomatik olarak bir diyagram oluşturur.

# Print the project structure
./gradlew projects

# Inspect why :feature:home pulls in a library
./gradlew :feature:home:dependencies --configuration debugRuntimeClasspath

Temiz ve Döngüsüz Bir Örnek

Sağlıklı bir grafik aşağıda gösterilmiştir. Yukarıdan aşağıya okuyun; hiçbir ok geriye, yukarıya doğru yönelmez ve hiçbir iki modül birbirine karşılıklı olarak yönelmez. Tam olarak ulaşmak istediğiniz yapı budur.

// :app
//   -> :feature:home   -> :core:data -> :core:network -> :core:model
//   -> :feature:profile -> :core:data -> :core:database -> :core:model
//   -> :core:designsystem
//
// Every path ends at :core:model. No cycles. Builds in parallel.

Hızlı Kontrol

:core:network modülünüz OkHttpClient öğesini yalnızca kendi içinde kullanıyor — bu öğe hiçbir herkese açık işlev imzasında görünmüyor. OkHttp bağımlılığını bildirmek için hangi Gradle yapılandırmasını kullanmalısınız?

Özet: Modül Bağımlılıklarını Yönetme

Modül grafiğini sağlıklı tutmayı öğrendiniz:

  • Modül bağımlılıklarını project(":path") ile bildirin.
  • Varsayılan olarak implementation kullanın; api yalnızca herkese açık yüzeyinizdeki türler için kullanılmalıdır.
  • Sürümleri bir sürüm kataloğunda (libs.versions.toml) merkezileştirin.
  • Hiçbir zaman döngü oluşturmayın — Gradle bunları reddeder; ortak kodu aşağıya çıkararak veya arayüzlerle tersine çevirerek döngüleri kırın.

Sonraki bölümde özellikleri birbirine bağlamadan gezinme yoluyla bağlayacaksınız.

Sıkça Sorulan Sorular

“Modül Bağımlılıklarını Yönetme” dersi ücretsiz mi?

Evet — “Modül Bağımlılıklarını Yönetme” dersin tüm metni burada web'de ücretsiz olarak okunabilir. Etkileşimli olarak pratik yapmak (yerleşik kod editörü ve 7/24 yapay zeka koçu) ve Android Academy kursunun geri kalanını açmak için CoddyKit PRO'ya yükselt. Android Academy kursu toplamda 4 dersten oluşur.

“Modül Bağımlılıklarını Yönetme” dersinde ne öğreneceğim?

Grafiği temiz ve döngüsüz tutun. Android Academy ile uygulamalı kodu tarayıcıda doğrudan çalıştırarak pratik yaparsın ve 7/24 yapay zeka koçu dersi çalışırken sorularını yanıtlar.

Android Academy öğrenmeye başlamak için deneyim gerekli mi?

Önceden deneyim gerekmez. CoddyKit'te Android Academy, başlangıçtan ileri seviyeye kadar yapılandırıldığı için buradan başlayabilir veya başından başlayıp kendi hızında ilerleme yapabilirsin. Bu, 4 dersinin 3. dersidir.

“Modül Bağımlılıklarını Yönetme” dersi ne kadar sürer?

Çoğu CoddyKit dersi yaklaşık 5–10 dakika sürer. Her biri kısa ve etkileşimli olduğu için sabit ilerleme yaparsın ve web ile uygulama arasında tam olarak bıraktığın yerden devam edebilirsin.

Bu Android Academy dersinde kod yazıp çalıştırabilir miyim?

Evet. Her Android Academy dersi yerleşik bir kod editörü içerir, bu sayede tarayıcıda gerçek kod yazıp çalıştırabilir ve anlık yapay zeka geri bildirimi alırsın — yerel kurulum gerekli değildir.

Bu kursun tüm dersleri

  1. Modülerleştirme Neden Kullanılır
  2. Özellik ve Çekirdek Modüller
  3. Modül Bağımlılıklarını Yönetme
  4. Modüller Arası Gezinme
← Android Academy Sayfasına Dön