Facade: mobil arxitekturada fasad namunasi asoslari

Muallif: IT Sectr Nashr etilgan: 2026-02-18 O'qish vaqti: 9 daq

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 — sinflar, kutubxonalar yoki freymvorklarning murakkab tizimiga oddiy interfeys taqdim etadigan strukturaviy namuna
  • Service Layer — mobil arxitekturada Facade amalga oshirilishi bo'lib, API, kesh va analitikani UI'dan yashiradi
  • Facade quyi tizimni yashirmaydi — mijoz kerak bo'lganda unga to'g'ridan-to'g'ri murojaat qilishi mumkin
  • Clean Architecture'dagi UseCase — bitta biznes ssenariyni orkestrlashuvchi Facade turi
  • Facade vs Adapter: Facade interfeysni soddalashtiradi, Adapter bir interfeysni boshqasiga aylantiradi

Facade namunasi nima?

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.

Kotlin
// 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.

Mobil arxitekturada Facade: Service Layer

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.

KomponentQuyi tizimdagi roliFacade nimani yashiradi
AuthApiServerga tarmoq so'roviSo'rov formatini, endpoint, HTTP xatolarni qayta ishlashni
UserDaoTokenni lokal saqlashMa'lumotlar bazasi sxemasini, SQL so'rovlar, migratsiyalarni
AnalyticsTrackerAnalitika hodisalarini yuborishFirebase/AppMetrica SDK, hodisalar formatini
NetworkMonitorTarmoq mavjudligini tekshirishConnectivityManager, 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 vs Adapter vs Mediator

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.

JihatFacadeAdapterMediator
MaqsadQuyi tizim interfeysini soddalashtirishInterfeysni aylantirishKomponentlar bog'lanishini kamaytirish
Yo'nalishBitta interfeys → quyi tizimMijoz → AdapteeN komponent ↔ Mediator
Interfeysning o'zgarishiYangi, soddalashtirilgan yaratadiMavjudini aylantiradiO'zgartirmaydi, koordinatsiya qiladi
Quyi tizim namuna haqida biladimi?Yo'qYo'qHa, Mediator orqali muloqot qiladi
Mobil ishlanmadagi misolUseCase / Service LayerRecyclerView.AdapteriOS'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.

Android uchun Kotlin'da Facade amalga oshirilishi

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.

Kotlin
// 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 uchun Swift'da Facade amalga oshirilishi

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.

Swift
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.

Facade'dan foydalanishdagi odatiy xatolar

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.

God Facade — haddan tashqari mas'uliyat

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.

Quyi tizim detallari oqadigan Facade

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 yagona kirish nuqtasi sifatida

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 va Proxy o'rtasidagi farq nima?

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.

Facade Service Layer bilan bir xil narsami?

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.

Facade qachon God Object'ga aylanadi?

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.

Kichik ilovada Facade kerakmi?

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'dan foydalanadigan kodni qanday test qilish kerak?

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

  • Facade — murakkab quyi tizimga oddiy interfeys taqdim etadigan strukturaviy namuna
  • Service Layer va UseCase — mobil arxitekturada Facade'ning keng tarqalgan amalga oshirilishlari
  • Facade quyi tizimni yashirmaydi: mijoz kerak bo'lganda komponentlarga to'g'ridan-to'g'ri murojaat qilishi mumkin
  • Facade vs Adapter: Facade soddalashtiradi, Adapter aylantiradi; Facade vs Mediator: Facade bir tomonlama, Mediator ikki tomonlama
  • God Facade — antipattern: bitta sinfda 15+ metod Single Responsibility buzilishini ko'rsatadi
  • Protokol/interfeys Facade uchun majburiy — bu quyi tizimni mock test qilishning yagona usuli
  • Tavsiya: Facade'ni 5+ ekran va 3+ quyi tizim bo'lganda kiriting; kichik loyihalar uchun Repository yetarli

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.

Loyihani muhokama qilish

Shuningdek o'qing