Android proje modülerleştirmesini göz önünde bulundurmak

Yayınlanan: 2019-08-21

Bir proje belirli bir ölçeğe ulaştığında, onunla tek bir modülde daha fazla çalışmak daha az etkili hale gelir. Modülerleştirme daha sonra etkili bir çözüm haline gelir.

Modülerleştirmenin 4 avantajı

Modülerleştirmeye karar vermeden önce, tam olarak neyin dahil olduğu konusunda net olmak iyidir. Modüler bir android proje yapısının avantajları şunları içerir:

Daha iyi kod izolasyonu

Her modül, genel API arabirimlerini açığa çıkarabilir ve uygulama ayrıntılarını gizleyebilir. Tek bir modülle, uygulamasının iyi gizlendiğinden tam olarak emin olamazsınız (özellikle paket görünürlük değiştiricisinin bulunmadığı Kotlin'de).

Daha kolay yeni teknoloji değerlendirmesi

Bir modül oluşturduğunuzda, diğer modülleri etkilemeden yeni mimari deseni veya yeni kitaplığı kontrol edebilirsiniz.

Azaltılmış proje oluşturma süresi

Bir modülün değiştirilmesi, o modülün ve ona bağlı olan diğerlerinin yeniden oluşturulmasını gerektirir. Bu belgeleri okuyarak tam olarak nasıl çalıştığını görün: Android geliştiricileri. Bağımlılık yapılandırmaları

Daha uygun iş

Daha küçük ve yalıtılmış kod parçalarını analiz etmek/hata ayıklamak/yeniden düzenleme yapmak daha kolay hale gelir. Ayrıca, yeni geliştirici katılımı daha hızlı olacaktır.

Bu avantajlar sizi modülerleştirme sürecini başlatmaya ikna etmeye yetecek gibi görünüyor, ancak nasıl başlayacaksınız?

#1: Modüllerinizi ve aralarındaki ilişkileri tanımlayın

Modüllerinizi tanımak için iki yaklaşım vardır: özelliğe göre ve katmana göre.

Özellik modülleri altında, uygulamanın kullanıcılara açık olan bazı alanlarını anlayabilirsiniz (örn. oturum açma, gösterge tablosu, profil vb.). Bu alanlar, tek bir ekrandan veya bazı işlemleri kapsayan ekranların akışından oluşabilir. Bu tipteki modüller aynı tipteki modüllere bağlı olamaz.

Özellikleri belirledikten sonra, kesinlikle birkaç hatta tüm modüllerin ihtiyaç duyduğu ortak işlevleri çıkarmanız gerekecektir. Bu modüller ayrı mimari katmanlardan (kalıcı depolama, ağ oluşturma, gezinme, UI bileşenleri gibi) veya bir dizi özellik tarafından kullanılan bazı verileri işlemenin iş mantığından sorumlu olabilir. Bu tür modüllere genellikle kütüphaneler denir. Kütüphane modülleri bağımlılık ağaçları oluşturabilir.

Özellik ve kitaplık modüllerinin yanı sıra, diğer modüller arasındaki yatay bağlantıları yönetmek için bir modüle ihtiyaç vardır (bununla ilgili daha fazla bilgi bir sonraki noktada). Bu modül, özel bir uygulama sınıfı ve bir bağımlılık enjeksiyonu kurulumu içerecektir. Başka hiçbir modül bu modüle bağlı olamaz, ancak bu modül projedeki diğer tüm modüllere bağlıdır.

Uygulamalardaki modüller ve ilişkileri

Yukarıdaki tanımlar dikkate alındığında, modül hiyerarşisi şöyle görünebilir:

#2: Bağımlılık ekleme kurulumu

Proje modülleri arasındaki bağımlılıklara rağmen, hançer bağımlılıkları da kurmalısınız. Dagger, bağımlılığı bildirmenin iki yolunu sunar: alt bileşenler ve bileşen bağımlılığı .

Hançer alt bileşen bağımlılığı, ebeveynlerin tüm bağımlı çocukları beyan etmesini gerektirir. Proje modülleri arasında bu tür bir ilişki çalışmaz çünkü proje modülü bağımlılığının yönünü tersine çevirir. Ancak ayrı proje modülleri içinde kullanılabilir.

Hançer bileşeni bağımlılığı daha esnektir çünkü bir çocuk ebeveyne bağımlı olduğunu beyan edebilir. Bu, ayrı proje modülleri arasında bu tür bir bağımlılığın kullanılmasını mümkün kılar.

Bir noktada, bir modülün başka bir modül hakkında sınırlı bilgiye ihtiyaç duyduğunu görebilirsiniz. Bunun çok iyi bir örneği, özellik modülleri arasında gezinme olabilir. Bu tür bir ilişkinin sağlanmasına genellikle yatay bağımlılık denir. Ayrı modüller arasında bu iletişim kanalını oluşturmak için, bu iletişimi ve beyan edilen arayüzlere bir uygulamayı bağlayacak modülleri tanımlayan arayüzlere sahip ek modüller gereklidir.

Yatay bağımlılığı yönetmek için proje modülü bağımlılık kurulumu aşağıdaki resimde sunulmaktadır:

Proje modülü bağımlılık kurulumu

Bu tür ilişkiler için örnek kod, makalenin sonunda bir projede verilmiştir.

# 3: Gradle kurulumu

Her proje modülünün, eklenen bağımlılıklar ve eklentiler dışında hemen hemen aynı olan gradle.build'i vardır. Bu nedenle, proje dizini kökündeki bir gradle dosyasına tekrarlayan yapılandırmayı çıkarmak güzel. Böyle bir dosya, statik kod analizini yürütmek veya birim testini çalıştırmak için ortak gradle görevlerini de kaydedebilir.

Bu tür yaygın kurulumun kod parçacığı burada bulunur:

 afterEvaluate { project -> def isAndroid = project.plugins.hasPlugin('com.android.library') || project.plugins.hasPlugin('com.android.application') setupModule(isAndroid) setupCommonTestDependencies(isAndroid) setupCommonTasks(isAndroid) } def setupModule(isAndroid) { if (isAndroid) { android { compileSdkVersion projectCompileSdk defaultConfig { minSdkVersion projectMinSdk targetSdkVersion projectTargetSdk } compileOptions { sourceCompatibility JavaVersion.VERSION_1_8 targetCompatibility JavaVersion.VERSION_1_8 } lintOptions { abortOnError true checkReleaseBuilds false checkAllWarnings true warningsAsErrors true def lintBaseline = file("quality/lint-baseline.xml") if (lintBaseline.exists()) baseline lintBaseline } } } else { sourceCompatibility = JavaVersion.VERSION_1_8 targetCompatibility = JavaVersion.VERSION_1_8 } } def setupCommonTestDependencies(isAndroid) { dependencies { testImplementation "junit:junit:${junitVersion}" testImplementation "org.assertj:assertj-core:${assertJVersion}" testImplementation "org.mockito:mockito-core:${mockitoVersion}" testImplementation "com.nhaarman.mockitokotlin2:mockito-kotlin:${mockitoKotlinVersion}" if (isAndroid) { androidTestImplementation "androidx.test.ext:junit:${axTestJUnitVersion}" androidTestImplementation "androidx.test.espresso:espresso-core:${axEspressoLibVersion}" } } } def setupCommonTasks(isAndroid) { if (isAndroid) { tasks.register("unitTest") { task -> task.dependsOn(testDebugUnitTest) } } else { tasks.register("unitTest") { task -> task.dependsOn(test) } } }

Çözüm

Bu makale, bir Android projesini modüler hale getirmek için ayrıntılı veya eksiksiz bir kılavuz değildir. Ama bence proje modülerleştirmeye başlarken göz önünde bulundurmanız gereken yönleri ele alıyor.

Bağlantıda yatay bağımlılığı gösteren bir kod parçası bulunur.

Android için yerel bir uygulama oluşturmak ister misiniz? Miquido'yu seçin!