Facade — sinflarning murakkab quyi tizimiga soddalashtirilgan interfeys taqdim etadigan strukturaviy dizayn namunasidir. Mobil ishlanmada Facade ko'pincha Service Layer yoki UseCase sifatida amalga oshiriladi va tarmoq, ma'lumotlar bazasi hamda analitika bilan o'zaro aloqani yashiradi. Martin Fowler ma'lumotlariga ko'ra (Patterns of Enterprise Application Architecture, 2003), Facade xizmat qatlamini tashkil qilish uchun asosiy namunalardan biridir.
Asosiy fikrlar
Facade — quyi tizim interfeyslari guruhiga yagona interfeys taqdim etadigan strukturaviy namuna. U quyi tizimdan foydalanishni soddalashtiradigan yuqori darajadagi interfeysni belgilaydi. Facade yangi funksionallik qo'shmaydi — u mavjud komponentlarni orkestrlashadi va ularning o'zaro ta'siri murakkabligini mijozdan yashiradi.
// Murakkab quyi tizim
class AuthApi {
suspend fun login(email: String, pass: String): TokenResponse
}
class UserDao {
suspend fun saveUser(user: UserEntity)
suspend fun getUser(id: Long): UserEntity?
}
class AnalyticsTracker {
fun track(event: String, params: Map )
}
// Facade — UI uchun oddiy interfeys
class AuthService(
private val api: AuthApi,
private val dao: UserDao,
private val analytics: AnalyticsTracker
) {
suspend fun loginUser(email: String, password: String): Result {
return runCatching {
val token = api.login(email, password)
val user = User(token.userId, email, token.accessToken)
dao.saveUser(user.toEntity())
analytics.track("login_success", mapOf("method" to "email"))
user
}
}
}AuthService — AuthApi, UserDao va AnalyticsTracker'ni ViewModel'dan yashiradigan Facade. UI API, ma'lumotlar bazasi va analitikaga uchta alohida so'rov o'rniga loginUser(email, password) ni chaqiradi. Bu bog'lanishni kamaytiradi: ertaga AuthApi FirebaseAuth bo'lib qolsa yoki UserDao Room'ga migratsiya qilsa, faqat Facade o'zgaradi, UI emas.
Service Layer — mobil ilovalarda Facade'ning keng tarqalgan amalga oshirilishi. U biznes mantiqini va qatlamlar o'rtasidagi koordinatsiyani inkapsulyatsiya qiladi. Android'da Service Layer ko'pincha UseCase (Clean Architecture) orqali, iOS'da esa — Manager yoki Service protokollari orqali amalga oshiriladi.
| Komponent | Quyi tizimdagi roli | Facade nimani yashiradi |
|---|---|---|
| AuthApi | Serverga tarmoq so'rovi | So'rov formatini, endpoint, HTTP xatolarni qayta ishlashni |
| UserDao | Tokenni lokal saqlash | Ma'lumotlar bazasi sxemasini, SQL so'rovlar, migratsiyalarni |
| AnalyticsTracker | Analitika hodisalarini yuborish | Firebase/AppMetrica SDK, hodisalar formatini |
| NetworkMonitor | Tarmoq mavjudligini tekshirish | ConnectivityManager, BroadcastReceiver |
AuthService barcha to'rt komponentni birlashtiradi. ViewModel bitta metodni chaqiradi va uning ostida tarmoq so'rovi, ma'lumotlar bazasiga yozish, kuzatish va tarmoqni tekshirish sodir bo'layotganini bilmaydi. Test paytida AuthService'ni mock bilan almashtirish mumkin va real komponentlar bilan integratsiya qilmasdan butun avtorizatsiya mantiqini tekshirish mumkin.
Facade, Adapter va Mediator — strukturaviy namunalar, ammo turli vazifalarni hal qiladi. Ular ko'pincha aralashtiriladi, chunki uchalasi ham vositachi ob'ektni kiritadi. Farqlarni mobil ilova misolida ko'rib chiqamiz.
| Jihat | Facade | Adapter | Mediator |
|---|---|---|---|
| Maqsad | Quyi tizim interfeysini soddalashtirish | Interfeysni aylantirish | Komponentlar bog'lanishini kamaytirish |
| Yo'nalish | Bitta interfeys → quyi tizim | Mijoz → Adaptee | N komponent ↔ Mediator |
| Interfeysning o'zgarishi | Yangi, soddalashtirilgan yaratadi | Mavjudini aylantiradi | O'zgartirmaydi, koordinatsiya qiladi |
| Quyi tizim namuna haqida biladimi? | Yo'q | Yo'q | Ha, Mediator orqali muloqot qiladi |
| Mobil ishlanmadagi misol | UseCase / Service Layer | RecyclerView.Adapter | iOS'da Coordinator |
Facade quyi tizimni yashirmaydi — mijoz kerak bo'lganda AuthApi'ga to'g'ridan-to'g'ri murojaat qilishi mumkin. Adapter majburiy ravishda Adaptee interfeysini o'zgartiradi. Mediator bir-biridan bexabar bo'lishi mumkin bo'lgan ko'plab ob'ektlar o'rtasidagi murakkab o'zaro ta'sirlarni koordinatsiya qiladi.
Facade amalga oshirilishi Clean Architecture bilan Android uchun Kotlin'da har bir biznes ssenariy uchun kirish nuqtasi sifatida UseCase'dan foydalanadi. UseCase — bu repozitoriy, mapper va boshqa bog'liqliklarni UI qatlamidan yashiradigan Facade.
// Repository — ham Facade, lekin bir daraja pastroq
class UserRepositoryImpl(
private val local: UserLocalDataSource,
private val remote: UserRemoteDataSource,
private val mapper: UserMapper
) : UserRepository {
override suspend fun getUserProfile(id: String): UserProfile {
val cached = local.getUser(id)
if (cached != null && !cached.isStale) {
return mapper.toProfile(cached)
}
val dto = remote.fetchUser(id)
val entity = mapper.toEntity(dto)
local.saveUser(entity)
return mapper.toProfile(entity)
}
}
// UseCase — biznes ssenariy uchun Facade
class LoadUserProfileUseCase(
private val repo: UserRepository,
private val analytics: AnalyticsTracker
) {
suspend operator fun invoke(userId: String): Result {
return runCatching {
val profile = repo.getUserProfile(userId)
analytics.track("profile_loaded", mapOf("user_id" to userId))
profile
}
}
}LoadUserProfileUseCase — profil yuklash ssenariysi uchun Facade. U keshlash mantiqini (local → remote), DTO → Entity → Profile map qilishni va analitika kuzatishini yashiradi. ViewModel invoke(userId) ni chaqiradi va tayyor UserProfile yoki xatoni oladi. UseCase'ni repozitoriyani mock ob'ekt bilan almashtirib, izolyatsiya qilingan holda test qilish mumkin.
iOS'da Facade ko'pincha Manager yoki Service sifatida amalga oshiriladi. Android'dan farqli o'laroq, iOS Facade interfeysini aniqlash uchun protokollardan foydalanadi, bu esa testlarda amalga oshirishlarni oson almashtirishga imkon beradi. Media bilan ishlash uchun Facade'ni ko'rib chiqamiz — yuklash, keshlash va ko'rsatish.
protocol MediaServiceProtocol {
func loadImage(from url: URL) async -> Result<UIImage, Error>
}
final class MediaService: MediaServiceProtocol {
private let cache: ImageCache
private let downloader: ImageDownloader
private let decoder: ImageDecoder
func loadImage(from url: URL) async -> Result<UIImage, Error> {
// 1. Keshni tekshirish
if let cached = cache.image(for: url) {
return .success(cached)
}
// 2. Ma'lumotlarni yuklash
let result = await downloader.download(from: url)
guard case let .success(data) = result else {
return .failure(MediaError.downloadFailed)
}
// 3. Dekodlash
guard let image = decoder.decode(data) else {
return .failure(MediaError.decodeFailed)
}
// 4. Keshlash
cache.setImage(image, for: url)
return .success(image)
}
}MediaService uch bosqichli jarayonni inkapsulyatsiya qiladi: kesh → yuklash → dekodlash. UI ImageCache, URLSession va ImageDecoder'ni boshqarish o'rniga bitta loadImage(from:) metodini chaqiradi. Test paytida MediaServiceProtocol'ni real yuklashsiz oldindan tayyorlangan rasmlarni qaytaradigan mock bilan almashtirish mumkin.
Xatolar Facade'ni loyihalashda uning afzalliklarini yo'q qiladi: soddalashtirish o'rniga butun tizim bog'liq bo'lgan God Object paydo bo'ladi. Uchta asosiy muammoni ko'rib chiqamiz.
Bitta Facade avtorizatsiya, profil yuklash, xabar yuborish va sinxronizatsiya uchun metodlarni o'z ichiga olganida — bu God Objectdir. Belgisi: bitta sinfda 15+ ochiq metod. Yechim: mas'uliyat sohalari bo'yicha bir nechta ixtisoslashgan Facade'ga bo'lish — AuthService, ProfileService, MessagingService.
Agar Facade quyi tizimga xos turlarni qaytarsa (masalan, FirebaseUser yoki RealmObject), mijoz baribir aniq amalga oshirishga bog'liq bo'ladi. Yechim: Facade faqat o'z turlarini (data class / struct) qaytarishi va mijozni quyi tizim detallaridan to'liq abstraksiya qilishi kerak.
Facade quyi tizimga to'g'ridan-to'g'ri kirishni taqiqlaganda, u tor bo'yinga aylanadi. Ba'zan mijozga quyi tizimning maxsus metodi kerak bo'ladi va uni Facade orqali o'tishga majburlash ortiqcha. Facade qattiq gatekeeper bo'lmasligi kerak: u qulay interfeys taqdim etadi, lekin komponentlarga to'g'ridan-to'g'ri kirishni bloklamaydi.
Ko'p so'raladigan savollar
Facade quyi tizimga soddalashtirilgan interfeys taqdim etadi va ko'pincha yangi metodlar to'plamini yaratadi. Proxy asl ob'ekt bilan bir xil interfeysni saqlaydi, lekin kirishni boshqarish yoki kechikkan yuklashni qo'shadi. Facade — soddalashtirish uchun, Proxy — nazorat uchun.
Service Layer — bu Facade namunasining ilova arxitekturasi darajasida amalga oshirilishi. U UI va biznes mantiq o'rtasidagi chegarani belgilaydi, xizmatlar amalga oshirilishining detallarini yashiradi. Android'da Service Layer ko'pincha UseCase orqali, iOS'da — Manager yoki Service protokollari orqali amalga oshiriladi.
God Facade bitta sinf bir-biriga bog'liq bo'lmagan bir nechta quyi tizim uchun mas'uliyatni o'z zimmasiga olganida paydo bo'ladi. Belgilari: 15+ ochiq metod, turli domenlardan metodlar (avtorizatsiya + to'lovlar + bildirishnomalar), sinash qiyin bo'lgan sinf (10+ bog'liqlik). Yechim: domen Facade'lariga bo'lish.
1-2 ekranli ilovada Facade ortiqcha — UI'dan API va ma'lumotlar bazasiga to'g'ridan-to'g'ri murojaat qilish soddaroq va tushunarliroq. Facade o'zini oqlaydi 5+ ekran va 3+ quyi tizim bo'lganda. O'rta va kichik loyihalarda qo'shimcha UseCase qobig'isiz yagona Facade qatlami sifatida Repository yetarli.
Facade testni soddalashtiradi, chunki butun quyi tizimni bitta mock ob'ekt bilan almashtiradi. Uchta komponentni (tarmoq + baza + analitika) mock qilish o'rniga bitta Facade'ni mock qilish yetarli. Swift'da buning uchun protocol, Kotlin'da — interface ishlatiladi. Facade komponentlar orkestrlashuvi tekshiriladigan integratsion testlar uchun ham qulay.
Xulosa
Biz kalit topshirig'i bilan mobil ilovani ishlab chiqamiz
IT Sectr 2017-yildan beri startaplar va korxonalar uchun iOS va Android ilovalarini yaratadi. Biz sizga maslahat beramiz va eng yaxshi yechimni taklif qilamiz.