Alan adı katmanı, kullanıcı arayüzü katmanı ile veri katmanından yararlanın.
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
) { /* ... */ }
.
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.
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.
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:
Sizin için önerilenler
- Not: JavaScript kapalıyken bağlantı metni gösterilir
- Veri katmanı
- Kullanıcı arayüzü durumu üretimi