Facade tasarım desenini biliyor musunuz? Kullanım deneyiminizi anlatın.
sobes.tech yapay zeka
AI'dan gelen yanıt
Evet, Facade tasarım desenine aşinayım. Bu, karmaşık bir sınıf alt sistemine tek bir arayüz sağlayan yapısal bir desendir. Amacı, alt sistemi kullanımı basitleştirmek, karmaşıklığını müşteriden gizlemektir.
Facade desenini kullanma deneyimim, örneğin, bir uygulamada çok katmanlı mimariyle çalışırken oldu. Diyelim ki, ağ ve veritabanı ile çalışma modülleri vardı. Müşteri kodunun doğrudan ağ katmanı sınıflarıyla (Retrofit, OkHttp), ayrıştırıcılar, veritabanı sınıfları (Room, DAO) ile etkileşime geçmesi yerine, bir facade sınıfı uygulandı. Bu facade, getUser(userId) veya saveUser(user) gibi basit metodlar sağladı ve bunlar, içlerinde ilgili alt sistemlerle etkileşimi koordine etti: ağ isteği yapma, verileri ayrıştırma, veritabanına kaydetme.
Bu yaklaşımın avantajları:
- Müşteri kodunu basitleştirme: Müşteri, alt sistemin iç yapısını bilmek zorunda değildir.
- Bağlantı azaltma: Facade, müşteriyi alt sistemin belirli uygulamalarından ayırır, bu da onların değiştirilmesini kolaylaştırır.
- Yapısal iyileştirme: Alt sistem daha yönetilebilir ve anlaşılır hale gelir.
Basitleştirilmiş bir facade uygulama örneği:
// API ile çalışma alt sistemi
class ApiService {
fun getUserFromApi(userId: Int): String {
// Ağ isteği mantığı
return "{\"id\":$userId, \"name\":\"John Doe\"}"
}
}
// Veritabanı ile çalışma alt sistemi
class DatabaseService {
fun saveUserToDb(userJson: String) {
// Veritabanına kaydetme mantığı
}
fun getUserFromDb(userId: Int): String {
// Veritabanından alma mantığı
return "" // Yer tutucu
}
}
// Facade
class UserFacade(
private val apiService: ApiService,
private val databaseService: DatabaseService
) {
fun getUser(userId: Int): String {
// Önce veritabanından almaya çalış
val userFromDb = databaseService.getUserFromDb(userId)
if (userFromDb.isNotEmpty()) {
return userFromDb
}
// Veritabanında yoksa, API'den al
val userFromApi = apiService.getUserFromApi(userId)
// Önbelleğe almak için veritabanına kaydet
databaseService.saveUserToDb(userFromApi)
return userFromApi
}
}
// Müşteri kodunda facade kullanımı örneği
fun main() {
val apiService = ApiService()
val databaseService = DatabaseService()
val userFacade = UserFacade(apiService, databaseService)
val userJson = userFacade.getUser(123)
println(userJson)
}
Bu örnekte, UserFacade, API'den kullanıcı verisi alma ve veritabanına kaydetme detaylarını gizler, müşteriye basit bir getUser metodı sağlar. Müşteri, ApiService ve DatabaseService'in varlığını bilmek zorunda değildir.
Bu şekilde, Facade, özellikle karmaşık modüllerle çalışırken, daha temiz, anlaşılır ve bakımı kolay kodlar oluşturmaya yardımcı olur.