Android mimarisi için öneriler

Bu sayfada, Mimari ile ilgili çeşitli en iyi uygulamalar ve öneriler sunulmaktadır. Uygulamanızın kalitesini, dayanıklılığını ve ölçeklenebilirliğini iyileştirmek için bu özellikleri kullanın. Ayrıca uygulamanızı yönetmeyi ve test etmeyi kolaylaştırır.

Aşağıdaki en iyi uygulamalar konuya göre gruplandırılmıştır. Her birinin projeyi ekibin tavsiyede ne kadar önemli olduğunu gösterir. Öncelik listesi aşağıdaki gibidir:

  • Kesinlikle önerilir: Bu uygulamayı, politika ile çelişmediği sürece uygulamalısınız. temelden anlamak önemlidir.
  • Önerilir: Bu uygulama büyük olasılıkla uygulamanızı iyileştirebilir.
  • İsteğe bağlı: Bu yöntemle uygulamanızı belirli durumlarda iyileştirebilirsiniz.
ziyaret edin.

Katmanlı mimari

Önerdiğimiz katmanlı mimari, endişelerin ayrılmasını destekler. Google veri modellerinden kullanıcı arayüzünü yönlendirir, tek doğruluk ilkesi ile uyumludur, tek yönlü veri akışı ilkelerine uyar. İşte size en iyi en iyi uygulamaları paylaşacağız:

Öneri Açıklama
Açıkça tanımlanmış bir veri katmanı kullanın.
Kesinlikle önerilir
Veri katmanı, uygulama verilerini uygulamanın geri kalanına gösterir ve uygulamanızın iş mantığının büyük çoğunluğunu içerir.
  • Tek bir veri kaynağı içerseler bile depolar oluşturmanız gerekir.
  • Küçük uygulamalarda, veri katmanı türlerini bir data paketine veya modülüne yerleştirmeyi seçebilirsiniz.
Açıkça tanımlanmış bir kullanıcı arayüzü katmanı kullanın.
Kesinlikle önerilir
Kullanıcı arayüzü katmanı, uygulama verilerini ekranda gösterir ve kullanıcı etkileşiminin birincil noktası olarak işlev görür.
  • Küçük uygulamalarda, veri katmanı türlerini bir ui paketine veya modülüne yerleştirmeyi seçebilirsiniz.
ziyaret edin. Kullanıcı arayüzü katmanıyla ilgili diğer en iyi uygulamaları burada bulabilirsiniz.
Veri katmanı, uygulama verilerini bir depo kullanarak göstermelidir.
Kesinlikle önerilir

Kullanıcı arayüzü katmanındaki composable, etkinlikler veya ViewModeller gibi bileşenler, doğrudan bir veri kaynağıyla etkileşime geçmemelidir. Veri kaynaklarına örnek olarak şunlar verilebilir:

  • Veritabanları, DataStore, SharedPreferences, Firebase API'leri.
  • GPS konum sağlayıcıları.
  • Bluetooth veri sağlayıcıları.
  • Ağ bağlantısı durumu sağlayıcı.
Eş yordamları ve akışları kullanın.
Kesinlikle önerilir
Katmanlar arasında iletişim kurmak için eş yordamları ve akışları kullanabilirsiniz.

Diğer eş yordamlarla ilgili en iyi uygulamaları burada bulabilirsiniz.

Alan katmanı kullanın.
Büyük uygulamalarda önerilir
Birden çok ViewModel'de veri katmanıyla etkileşime geçen iş mantığını yeniden kullanmanız gerekiyorsa veya belirli bir ViewModel'in iş mantığı karmaşıklığını basitleştirmek istiyorsanız bir alan katmanı (kullanım alanları) kullanın

kullanıcı arayüzü katmanı

Kullanıcı arayüzü katmanının rolü, uygulama verilerini ekranda görüntülemektir. ve kullanıcı etkileşiminin temel noktası olarak işlev görür. Aşağıda bazı en iyi uygulamaları görebilirsiniz: kullanıcı arayüzü katmanı için:

Öneri Açıklama
Tek Yönlü Veri Akışı (UDF) yöntemini izleyin.
Kesinlikle önerilir
ViewModel'lerin gözlemci kalıbını kullanarak kullanıcı arayüzü durumunu gösterdiği ve yöntem çağrıları aracılığıyla kullanıcı arayüzünden işlemler aldığı Tek Yönlü Veri Akışı (UDF) ilkelerini uygulayın.
Avantajları uygulamanız için de geçerliyse AAC ViewModels'i kullanın.
Kesinlikle önerilir
İş mantığını işlemek için AAC ViewModelleri'ni kullanın ve kullanıcı arayüzü durumunu kullanıcı arayüzüne (Oluşturma veya Android Görünümleri) göstermek için uygulama verilerini getirin.

ViewModel ile ilgili diğer en iyi uygulamaları burada bulabilirsiniz.

ViewModels'in avantajlarını buradan inceleyebilirsiniz.

Yaşam döngüsüne duyarlı kullanıcı arayüzü durumu koleksiyonu kullanın.
Kesinlikle önerilir
Yaşam döngüsüne duyarlı uygun eş yordam oluşturucuyu kullanarak kullanıcı arayüzünden kullanıcı arayüzü durumunu toplayın: View sisteminde repeatOnLifecycle ve Jetpack Compose'da collectAsStateWithLifecycle.

repeatOnLifecycle hakkında daha fazla bilgi edinin.

collectAsStateWithLifecycle hakkında daha fazla bilgi edinin.

ViewModel'den kullanıcı arayüzüne etkinlik göndermeyin.
Kesinlikle önerilir
Etkinliği ViewModel'de hemen işleme ve etkinliğin işlenmesinin sonucunda bir durum güncellemesine neden olma. Kullanıcı arayüzü etkinlikleri hakkında daha fazla bilgiyi burada bulabilirsiniz.
Tek bir etkinlik uygulaması kullanın.
Önerilen
Ekranlar arasında gezinmek ve uygulamanızın birden fazla ekranı varsa uygulamanıza derin bağlantı vermek için gezinme parçaları veya gezinme önerileri özelliğini kullanın.
Jetpack Compose'u kullanın.
Önerilen
Telefonlar, tabletler, katlanabilir cihazlar ve Wear OS için yeni uygulamalar geliştirmek üzere Jetpack Compose'u kullanın.

Aşağıdaki snippet'te, yaşam döngüsüne duyarlı bir kullanıcı arayüzü durumunun nasıl toplanacağı açıklanmaktadır. şekilde:

Görüntüleme sayısı

class MyFragment : Fragment() {

    private val viewModel: MyViewModel by viewModel()

    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)

        viewLifecycleOwner.lifecycleScope.launch {
            viewLifecycleOwner.repeatOnLifecycle(Lifecycle.State.STARTED) {
                viewModel.uiState.collect {
                    // Process item
                }
            }
        }
    }
}

Oluştur

@Composable
fun MyScreen(
    viewModel: MyViewModel = viewModel()
) {
    val uiState by viewModel.uiState.collectAsStateWithLifecycle()
}

ViewModel

ViewModels, kullanıcı arayüzü durumunu sağlamak ve veri katmanından yararlanın. ViewModel'ler için en iyi uygulamalardan bazıları şunlardır:

Öneri Açıklama
ViewModel'ler, Android yaşam döngüsünden bağımsız olmalıdır.
Kesinlikle önerilir
ViewModel'ler, yaşam döngüsü ile ilgili herhangi bir türe referans içermemelidir. Bağımlılık olarak Activity, Fragment, Context veya Resources geçirmeyin. ViewModel'de bir öğe için Context özelliği gerekiyorsa bunun doğru katmanda olup olmadığını kesinlikle değerlendirmeniz gerekir.
Eş yordamları ve akışları kullanın.
Kesinlikle önerilir

ViewModel, aşağıdakileri kullanarak veri veya alan adı katmanlarıyla etkileşime girer:

  • Uygulama verilerini almak için Kotlin akışları,
  • suspend işlevleri, viewModelScope ile işlem gerçekleştirmek için kullanılır.
ViewModel'leri ekran düzeyinde kullanın.
Kesinlikle önerilir

ViewModel'leri yeniden kullanılabilir kullanıcı arayüzü parçalarında kullanmayın. ViewModelleri'ni şurada kullanmalısınız:

  • Ekran düzeyinde composable'lar
  • Görünümler'deki Etkinlikler/Parçalar,
  • Jetpack Navigasyon'u kullanırken hedefler veya grafikler.
Yeniden kullanılabilir kullanıcı arayüzü bileşenlerinde düz durum tutucu sınıfları kullanın.
Kesinlikle önerilir
Yeniden kullanılabilir kullanıcı arayüzü bileşenlerindeki karmaşıklığı yönetmek için düz durum tutucu sınıfları kullanın. Bu sayede devlet kaldırılabilir ve dışarıdan kontrol edilebilir.
AndroidViewModel kullanmayın.
Önerilen
AndroidViewModel yerine ViewModel sınıfını kullanın. ViewModel'de Application sınıfı kullanılmamalıdır. Bunun yerine bağımlılığı kullanıcı arayüzüne veya veri katmanına taşıyın.
Bir kullanıcı arayüzü durumunu gösterin.
Önerilen
ViewModels, verileri uiState adlı tek bir özellik üzerinden kullanıcı arayüzüne sunmalıdır. Kullanıcı arayüzünde alakasız birden fazla veri parçası gösteriliyorsa sanal makine birden fazla kullanıcı arayüzü durumu özelliğini gösterebilir.
  • uiState değerini StateFlow yapmalısınız.
  • Veriler hiyerarşinin diğer katmanlarından veri akışı olarak geliyorsa uiState öğesini, stateIn operatörünü WhileSubscribed(5000) politikasıyla (örnek) kullanarak oluşturmanız gerekir.
  • Veri katmanından gelen veri akışının olmadığı daha basit durumlarda, sabit StateFlow (örnek) olarak gösterilen MutableStateFlow kullanılabilir.
  • ${Screen}UiState veri sınıfını; veriler, hatalar ve yükleme sinyalleri içerebilecek bir veri sınıfı olarak kullanmayı seçebilirsiniz. Farklı eyaletler özelse bu sınıf da mühürlü bir sınıf olabilir.

Aşağıdaki snippet'te, bir ViewModel'den kullanıcı arayüzü durumunun nasıl gösterileceği ana hatlarıyla açıklanmaktadır:

@HiltViewModel
class BookmarksViewModel @Inject constructor(
    newsRepository: NewsRepository
) : ViewModel() {

    val feedState: StateFlow<NewsFeedUiState> =
        newsRepository
            .getNewsResourcesStream()
            .mapToFeedState(savedNewsResourcesState)
            .stateIn(
                scope = viewModelScope,
                started = SharingStarted.WhileSubscribed(5_000),
                initialValue = NewsFeedUiState.Loading
            )

    // ...
}

Yaşam döngüsü

Aşağıda, Android ile hakkında daha fazla bilgi edinin.

Öneri Açıklama
Etkinlikler veya Parçalar'daki yaşam döngüsü yöntemlerini geçersiz kılmayın.
Kesinlikle önerilir
Etkinlikler veya Parçalar'da onResume gibi yaşam döngüsü yöntemlerini geçersiz kılmayın. Bunun yerine LifecycleObserver alanını kullanın. Yaşam döngüsü belirli bir Lifecycle.State değerine ulaştığında uygulamanın iş yapması gerekiyorsa repeatOnLifecycle API'yi kullanın.

Aşağıdaki snippet'te, belirli bir değerde işlemlerin nasıl gerçekleştirileceği Yaşam döngüsü durumu:

Görüntüleme sayısı

class MyFragment: Fragment() {
    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)

        viewLifecycleOwner.lifecycle.addObserver(object : DefaultLifecycleObserver {
            override fun onResume(owner: LifecycleOwner) {
                // ...
            }
            override fun onPause(owner: LifecycleOwner) {
                // ...
            }
        }
    }
}

Oluştur

@Composable
fun MyApp() {

    val lifecycleOwner = LocalLifecycleOwner.current
    DisposableEffect(lifecycleOwner, ...) {
        val lifecycleObserver = object : DefaultLifecycleObserver {
            override fun onStop(owner: LifecycleOwner) {
                // ...
            }
        }

        lifecycleOwner.lifecycle.addObserver(lifecycleObserver)
        onDispose {
            lifecycleOwner.lifecycle.removeObserver(lifecycleObserver)
        }
    }
}

Bağımlılıkları yönetme

Bağımlılıkları yönetirken gözlemlemeniz gereken birkaç en iyi uygulama vardır kontrol edin:

Öneri Açıklama
Bağımlılık yerleştirme özelliğini kullanın.
Kesinlikle önerilir
Bağımlılık yerleştirme en iyi uygulamalarını kullanın. Mümkün olduğunda ağırlıklı olarak oluşturucu ekleme.
Gerektiğinde bir bileşeni kapsama alın.
Kesinlikle önerilir
Tür, paylaşılması gereken değişken veriler içerdiğinde veya türün başlatılması pahalıysa ve uygulamada yaygın olarak kullanılıyorsa bağımlılık kapsayıcısını kapsama alın.
Hilt'ı kullanın.
Önerilen
Basit uygulamalarda Hilt'ı veya manuel bağımlılık ekleme'yi kullanın. Projeniz yeterince karmaşıksa Hilt'ı kullanın. Örneğin, şunlar için:
  • ViewModelleri ile birden çok ekran (entegrasyon)
  • WorkManager kullanımı—entegrasyon
  • Gezinme grafiğinin kapsama alınmış ViewModelleri gibi gelişmiş Gezinme kullanımı (entegrasyon).

Test

Aşağıda test ile ilgili en iyi uygulamalardan bazıları verilmiştir:

Öneri Açıklama
Neleri test edeceğinizi öğrenin.
Kesinlikle önerilir

Proje genel olarak bir hello dünya uygulaması kadar basit değilse projeyi en azından şunları kullanarak test etmelisiniz:

  • Akışlar dahil olmak üzere ViewModelleri'nde birim testi yapın.
  • Veri katmanı varlıkları birim testi. Yani depolar ve veri kaynakları.
  • CI'da regresyon testleri olarak yararlı olan kullanıcı arayüzü gezinme testleri.
Alay etmek yerine sahteleri tercih et.
Kesinlikle önerilir
Daha fazla bilgi için Android dokümanlarında iki kez test kullanma başlıklı makaleye bakın.
StateFlows'u test edin.
Kesinlikle önerilir
StateFlow test edilirken:

Daha fazla bilgi için Android DAC kılavuzunda neleri test edebilirsiniz? başlıklı makaleye göz atın.

Modeller

Uygulamalarınızda model geliştirirken aşağıdaki en iyi uygulamaları dikkate almalısınız:

Öneri Açıklama
Karmaşık uygulamalarda katman başına bir model oluşturma.
Önerilen

Karmaşık uygulamalarda, anlamlı olduğunda farklı katmanlar veya bileşenlerde yeni modeller oluşturun. Aşağıdaki örnekleri göz önünde bulundurun:

  • Uzak veri kaynağı, ağ üzerinden aldığı modeli yalnızca uygulamanın ihtiyaç duyduğu verileri içeren daha basit bir sınıfla eşleyebilir.
  • Depolar, DAO modellerini yalnızca kullanıcı arayüzü katmanının ihtiyaç duyduğu bilgilerle daha basit veri sınıflarıyla eşleyebilir.
  • ViewModel, UiState sınıflarına veri katmanı modelleri içerebilir.

Adlandırma kuralları

Kod tabanınızı adlandırırken aşağıdaki en iyi uygulamalara dikkat etmeniz gerekir:

Öneri Açıklama
Adlandırma yöntemleri.
İsteğe bağlı
Yöntemler fiil deyimi olmalıdır. Örneğin, makePayment().
Adlandırma özellikleri.
İsteğe bağlı
Özellikler bir isim kelime öbeği olmalıdır. Örneğin, inProgressTopicSelection.
Veri akışlarını adlandırma.
İsteğe bağlı
Bir sınıf bir Akış akışını, LiveData'yı veya başka bir akışı gösterdiğinde adlandırma kuralı get{model}Stream() şeklindedir. Örneğin, getAuthorStream(): Flow<Author> İşlev, model listesi döndürürse model adı çoğul olmalıdır: getAuthorsStream(): Flow<List<Author>>
Adlandırma arayüzleri uygulamaları.
İsteğe bağlı
Arayüz uygulamalarında kullanılan adlar anlamlı olmalıdır. Daha iyi bir ad bulunamazsa önek olarak Default ekleyin. Örneğin, bir NewsRepository arayüzü için OfflineFirstNewsRepository veya InMemoryNewsRepository kullanabilirsiniz. İyi bir ad bulamıyorsanız, şunu kullanın: DefaultNewsRepository. Sahte uygulamalar, FakeAuthorsRepository örneğinde olduğu gibi Fake ön ekiyle başlamalıdır.