Alan katmanı

Alan adı katmanı, kullanıcı arayüzü katmanı ile veri katmanından yararlanın.

İsteğe bağlı alan katmanı dahil edildiğinde,
    kullanıcı arayüzü katmanına bağlıdır ve veri katmanına bağlıdır.
Şekil 1. Alan adı katmanının uygulama mimarisindeki rolü.

Alan adı katmanı, karmaşık iş mantığını veya birden fazla ViewModel tarafından yeniden kullanılan basit bir iş mantığına sahiptir. Bu katman isteğe bağlıdır. Çünkü tüm uygulamalar bu gereksinimlere sahip olmayacaktır. Yalnızca (ör. karmaşıklığı ele almak veya yeniden kullanılabilirliği tercih etmek için) bu teknolojiden yararlanabilir.

Alan adı katmanı aşağıdaki avantajları sağlar:

  • Kodların yinelenmesini önler.
  • Alan katmanı sınıflarının kullanıldığı sınıflarda okunabilirliği iyileştirir.
  • Uygulamanın test edilebilirliğini artırır.
  • Sorumlulukları bölüştürmenize olanak tanıyarak büyük çaplı sınıflardan kaçınır.

Bu sınıfların basit ve hafif olması için her kullanım alanında yalnızca tek bir işleve kıyasla sorumluluk taşımalı ve değişken dışı verilerdir. Bunun yerine, kullanıcı arayüzünüzdeki veya veri katmanlarındaki değişken verileri işlemelisiniz.

Bu kılavuzdaki adlandırma kuralları

Bu kılavuzda, kullanım alanları sorumlu oldukları tek işlemle adlandırılmıştır . Kural aşağıdaki gibidir:

şimdiki zaman fiil + isim/ne (isteğe bağlı) + UseCase.

Örneğin: FormatDateUseCase, LogOutUserUseCase, GetLatestNewsWithAuthorsUseCase veya MakeLoginRequestUseCase.

Bağımlılıklar

Tipik bir uygulama mimarisinde, kullanım alanı sınıfları Veri katmanından kullanıcı arayüzü katmanı ve depolar. Yani, bu eğitimde kod deposu sınıflarına bağlıdır ve kullanıcı arayüzü katmanıyla aynı şekilde kullanır: geri çağırma (Java için) veya eş yordam ( Kotlin) kaldırın. Bu konuda daha fazla bilgi için veri katmanına öğrenin.

Örneğin, uygulamanızda hem haber deposu hem de yazar deposu oluşturur ve bunları birleştirir:

class GetLatestNewsWithAuthorsUseCase(
  private val newsRepository: NewsRepository,
  private val authorsRepository: AuthorsRepository
) { /* ... */ }

Kullanım alanları yeniden kullanılabilir mantık içerdiği için başka kullanım alanları tarafından da kullanılabilir durumlarda işe yarar. Alan adı katmanında birden çok düzeyde kullanım alanının olması normaldir. Örneğin, örneğin, aşağıdaki örnekte tanımlanan kullanım alanı, Kullanıcı arayüzü katmanında birden fazla sınıf zamana bağlıysa FormatDateUseCase kullanım alanı ekranda uygun mesajı görüntülemek için alt bölgeleri (bölgeleri) kullanın:

class GetLatestNewsWithAuthorsUseCase(
  private val newsRepository: NewsRepository,
  private val authorsRepository: AuthorsRepository,
  private val formatDateUseCase: FormatDateUseCase
) { /* ... */ }
.
GetlastNewsWithAuthorsUseCase,
    Ancak bu aynı zamanda FormatDataUseCase'a ve başka bir kullanım alanı sınıfına
    yer alır.
Şekil 2. Diğerlerine bağımlı olan bir kullanım alanına ilişkin örnek bağımlılık örnekler üzerinden görüntüleyebilirsiniz.

Kotlin'deki telefon araması kullanım alanları

Kotlin'de, kullanım alanı sınıfı örneklerini şöyle çağrılabilir: invoke() işlevi, operator değiştiricisiyle tanımlanıyor. Aşağıdakilere göz atın örnek:

class FormatDateUseCase(userRepository: UserRepository) {

    private val formatter = SimpleDateFormat(
        userRepository.getPreferredDateFormat(),
        userRepository.getPreferredLocale()
    )

    operator fun invoke(date: Date): String {
        return formatter.format(date)
    }
}

Bu örnekte, FormatDateUseCase öğesindeki invoke() yöntemi aşağıdakilerden hangisini yapmanıza olanak tanır? sınıfının örneklerini işlev gibi çağırır. invoke() yöntemi Belirli bir imzayla sınırlı değildir; birkaç parametre içerebilir ve herhangi bir tür döndürür. Ayrıca invoke() üzerinde farklı imzalar kullanabilirsiniz inceleyebilirsiniz. Yukarıdaki örnekte verilen kullanım alanını şu şekilde çağırabilirsiniz:

class MyViewModel(formatDateUseCase: FormatDateUseCase) : ViewModel() {
    init {
        val today = Calendar.getInstance()
        val todaysDate = formatDateUseCase(today)
        /* ... */
    }
}

invoke() operatörü hakkında daha fazla bilgi edinmek için bkz. Kotlin dokümanlarına göz atın.

Yaşam döngüsü

Kullanım alanlarının kendi yaşam döngüsü yoktur. Bunun yerine sınıf, çalışır. Bu, kullanıcı arayüzündeki sınıflardan kullanım alanlarını çağırabileceğiniz anlamına gelir katmanından, hizmetlerden veya Application sınıfının kendisinden yararlanabilirsiniz. Çünkü kullanım alanları değişken veriler içermemelidir, yeni bir kullanım alanı örneği oluşturmanız gerekir sınıfını her defasında bir bağımlılık olarak geçer.

İleti dizisi

Alan katmanındaki kullanım alanları ana güvenli olmalıdır; diğer bir deyişle ana ileti dizisinden arama yapabilirsiniz. Kullanım alanı sınıfları uzun süreli performans gösteriyorsa bu mantığı işletme sahibine aktarmakla yükümlüdür. kontrol edin. Ancak, bunu yapmadan önce, sitenizi veya oyununuzu işlemlerinin hiyerarşinin diğer katmanlarına yerleştirilmesi daha iyi olur. Genellikle, yeniden kullanılabilirliği veya yeniden kullanılabilirliği teşvik etmek için veri katmanında önbelleğe alma. Örneğin, büyük bir listede yoğun kaynak kullanan bir operasyon, veri katmanına yerleştirilerek etki alanı katmanına göre daha fazla yer alır. uygulamanın birden fazla ekranında yeniden kullanılması için önbelleğe alınmış olmalıdır.

Aşağıdaki örnekte, çalışmasını arka planda gerçekleştiren bir kullanım alanı gösterilmektedir ileti dizisi:

class MyUseCase(
    private val defaultDispatcher: CoroutineDispatcher = Dispatchers.Default
) {

    suspend operator fun invoke(...) = withContext(defaultDispatcher) {
        // Long-running blocking operations happen on a background thread.
    }
}

Genel görevler

Bu bölümde, sık kullanılan alan katmanı görevlerinin nasıl gerçekleştirileceği açıklanmaktadır.

Yeniden kullanılabilir, basit iş mantığı

Kullanıcı arayüzü katmanında bulunan tekrarlanabilir iş mantığını kullanım alanı sınıfıdır. Bu, herhangi bir değişikliği mantığın her yerinde uygulamayı kolaylaştırır bu düzenlemelerin nedenlerinden biri. Ayrıca mantığı tek başına test etmenize de olanak tanır.

Daha önce açıklanan FormatDateUseCase örneğini göz önünde bulundurun. İşletmeniz gelecekteki tarih biçimlendirmesinin değişmesiyle ilgili gereksinimleri, yalnızca tek bir yerde toplaması çok önemliydi.

Depoları birleştirme

Bir haber uygulamasında NewsRepository ve AuthorsRepository sınıflarınız olabilir haber ve yazar verisi işlemlerini ele alan yazılımlar bulmanız gerekir. Article sınıfı NewsRepository öğesinin yalnızca yazarın adını içerdiğini, ekranda yazar hakkında daha fazla bilgi görüntüleyebilirsiniz. Yazar bilgileri AuthorsRepository sitesinden alınabilir.

GetNewsWithAuthorsUseCase iki farklı depoya bağlıdır
    NewsRepository ve AuthorsRepository.
Şekil 3. Verileri birleştiren bir kullanım alanı için bağımlılık grafiği kullanabilirsiniz.

Mantık birden fazla depo içerdiği ve karmaşık hale gelebileceği için şu mantığı soyutlamak için bir GetLatestNewsWithAuthorsUseCase sınıfı oluşturun: ViewModel'i değiştirin ve daha okunabilir hale getirin. Bu şekilde bir mantığa ve uygulamanın farklı bölümlerinde yeniden kullanılabilir.

/**
 * This use case fetches the latest news and the associated author.
 */
class GetLatestNewsWithAuthorsUseCase(
  private val newsRepository: NewsRepository,
  private val authorsRepository: AuthorsRepository,
  private val defaultDispatcher: CoroutineDispatcher = Dispatchers.Default
) {
    suspend operator fun invoke(): List<ArticleWithAuthor> =
        withContext(defaultDispatcher) {
            val news = newsRepository.fetchLatestNews()
            val result: MutableList<ArticleWithAuthor> = mutableListOf()
            // This is not parallelized, the use case is linearly slow.
            for (article in news) {
                // The repository exposes suspend functions
                val author = authorsRepository.getAuthor(article.authorId)
                result.add(ArticleWithAuthor(article, author))
            }
            result
        }
}

Mantık, news listesindeki tüm öğeleri eşler; Her ne kadar veri katmanı Bu çalışma, ana iş parçacığını (ana iş parçacığı) nasıl engelleyeceğinizi bilmediğiniz için pek çok öğe vardır. Bu nedenle kullanım alanı, çalışmayı arka plana taşır iş parçacığının bir parçası olacak.

NewsWithAuthorsRepository

Diğer tüketiciler

Kullanıcı arayüzü katmanı dışında, alan adı katmanı aşağıdaki sınıflarda yeniden kullanılabilir: hizmetleri ve Application sınıfı. Dahası, TV gibi diğer platformlar veya Wear kod tabanını mobil uygulamayla paylaşırsa kullanıcı arayüzü katmanı destekleyici uygulamalar oluşturun.

Veri katmanı erişim kısıtlaması

Alan katmanını uygularken dikkat etmeniz gereken bir diğer unsur da kullanıcı arayüzü katmanından veri katmanına doğrudan erişime izin ver veya her şeyi alan katmanından sağlar.

Kullanıcı Arayüzü katmanı, veri katmanına doğrudan erişemez, Alan katmanından geçmelidir.
Şekil 4. Kullanıcı arayüzü katmanına erişimin reddedildiğini gösteren bağımlılık grafiği veri katmanından yararlanın.

Bu kısıtlamayı yapmanın bir avantajı, kullanıcı arayüzünüzün Örneğin, her oturumda analiz günlüğü gerçekleştiriyorsanız erişim isteğidir.

Ancak potansiyel olarak önemli dezavantajı ise veri katmanına basit işlev çağrıları olduğunda bile kullanım alanları ekleyebilir, Bu da çok az fayda olsa da karmaşıklık yaratabilir.

Kullanım alanlarını yalnızca gerektiğinde eklemek iyi bir yaklaşımdır. Kullanıcı arayüzünüz neredeyse her zaman kullanım alanları üzerinden verilere eriştiğinden, verilere yalnızca bu şekilde erişmek mantıklıdır.

Sonuç olarak veri katmanına erişimi kısıtlama kararı, ve katı kuralları mı yoksa daha esnek bir yapıyı mı tercih ettiğinize bahsedeceğiz.

Test

Alan test edilirken genel test kılavuzu geçerlidir. katmanıdır. Diğer kullanıcı arayüzü testleri için geliştiriciler genellikle sahte depolar kullanırlar. alan katmanını test ederken sahte veri depoları kullanmak iyi bir uygulamadır.

Örnekler

Aşağıdaki Google örnekleri, alan adı katmanının kullanımını göstermektedir. Uygulamadaki bu rehberliği görmek için bu yöntemleri inceleyin:

ziyaret edin.