Facade: mobil arxitekturada fasad nümunəsinin əsasları

Müəllif: IT Sectr Dərc olunub: 2026-02-18 Oxuma vaxtı: 9 dəq

Facade — siniflərin mürəkkəb alt sisteminə sadələşdirilmiş interfeys təqdim edən struktural dizayn nümunəsidir. Mobil inkişafda Facade ən çox Service Layer və ya UseCase kimi həyata keçirilir və şəbəkə, verilənlər bazası və analitika ilə qarşılıqlı əlaqəni gizlədir. Martin Fowler-ın məlumatına görə (Patterns of Enterprise Application Architecture, 2003), Facade xidmət qatının təşkili üçün əsas nümunələrdən biridir.

Əsas məqamlar

  • Facade — siniflər, kitabxanalar və ya freymvorklardan ibarət mürəkkəb sistemə sadə interfeys təqdim edən struktural nümunədir
  • Service Layer — mobil arxitekturada Facade-in həyata keçirilməsi, API, keş və analitikanı UI-dən gizlədir
  • Facade alt sistemi gizlətmir — müştəri zərurət olduqda birbaşa ona müraciət edə bilər
  • Clean Architecture-də UseCase — bir biznes ssenarisini orkestrləşdirən Facade növü
  • Facade vs Adapter: Facade interfeysi sadələşdirir, Adapter isə bir interfeysi digərinə çevirir

Facade nümunəsi nədir?

Facade — alt sistemin interfeyslər qrupuna vahid interfeys təqdim edən struktural nümunədir. O, alt sistemdən istifadəni sadələşdirən yüksək səviyyəli interfeys müəyyən edir. Facade yeni funksionallıq əlavə etmir — o, mövcud komponentləri orkestrləşdirir və onların qarşılıqlı əlaqəsinin mürəkkəbliyini müştəridən gizlədir.

Kotlin
// Mürəkkəb alt sistem
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 üçün sadə 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 və AnalyticsTracker-ı ViewModel-dən gizlədən Facade-dir. UI API, verilənlər bazası və analitikaya üç ayrı sorğu yerinə loginUser(email, password) çağırır. Bu, birləşməni azaldır: sabah AuthApi FirebaseAuth olarsa və ya UserDao Room-a miqrasiya edərsə, yalnız Facade dəyişəcək, UI deyil.

Mobil arxitekturada Facade: Service Layer

Service Layer — mobil tətbiqlərdə Facade-in geniş yayılmış həyata keçirilməsidir. O, biznes məntiqini və qatlar arasında koordinasiyanı kapsullayır. Android-də Service Layer çox vaxt UseCase vasitəsilə (Clean Architecture), iOS-də isə Manager və ya Service protokolları vasitəsilə həyata keçirilir.

KomponentAlt sistemdə roluFacade nəyi gizlədir
AuthApiServerə şəbəkə sorğusuSorğu formatı, endpoint, HTTP xəta emalını
UserDaoTokenin lokal saxlanmasıVerilənlər bazası sxemini, SQL sorğularını, miqrasiyaları
AnalyticsTrackerAnalitika hadisələrinin göndərilməsiFirebase/AppMetrica SDK, hadisə formatını
NetworkMonitorŞəbəkə əlçatanlığının yoxlanmasıConnectivityManager, BroadcastReceiver

AuthService bütün dörd komponenti birləşdirir. ViewModel bir metod çağırır və bunun altında şəbəkə sorğusunun, verilənlər bazasına yazmanın, izləmənin və şəbəkə yoxlanmasının baş verdiyini bilmir. Test zamanı AuthService-i mock-la əvəz etmək olar və real komponentlərlə inteqrasiya olmadan bütün avtorizasiya məntiqini yoxlamaq olar.

Facade vs Adapter vs Mediator

Facade, Adapter və Mediator — struktural nümunələrdir, lakin fərqli məsələləri həll edirlər. Onlar tez-tez qarışdırılır, çünki hər üçü vasitəçi obyekt təqdim edir. Fərqləri mobil tətbiq nümunəsində araşdıraq.

CəhətFacadeAdapterMediator
MəqsədAlt sistemin interfeysini sadələşdirməkİnterfeysi çevirməkKomponentlərin birləşməsini azaltmaq
İstiqamətBir interfeys → alt sistemMüştəri → AdapteeN komponent ↔ Mediator
İnterfeysin dəyişməsiYeni, sadələşdirilmiş yaradırMövcudunu çevirirDəyişmir, koordinasiya edir
Alt sistem nümunəni bilir?XeyrXeyrBəli, Mediator vasitəsilə ünsiyyət qurur
Mobil inkişafda nümunəUseCase / Service LayerRecyclerView.AdapteriOS-də Coordinator

Facade alt sistemi gizlətmir — müştəri zərurət olduqda birbaşa AuthApi-ya müraciət edə bilər. Adapter mütləq şəkildə Adaptee-nin interfeysini dəyişir. Mediator bir-birindən xəbərsiz ola bilən çoxsaylı obyektlər arasında mürəkkəb qarşılıqlı əlaqələri koordinasiya edir.

Android üçün Kotlin-də Facade-in həyata keçirilməsi

Facade-in həyata keçirilməsi Clean Architecture ilə Android üçün Kotlin-də hər biznes ssenarisi üçün giriş nöqtəsi kimi UseCase-dən istifadə edir. UseCase — bu, repozitoriyanı, mapper-i və digər asılılıqları UI qatından gizlədən Facade-dir.

Kotlin
// Repository — də Facade, lakin bir səviyyə aşağı
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 ssenarisi üçün 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 yükləmə ssenarisi üçün Facade-dir. O, keşləmə məntiqini (local → remote), DTO → Entity → Profile çevrilməsini və analitika izləməsini gizlədir. ViewModel invoke(userId) çağırır və hazır UserProfile və ya xətanı alır. UseCase-i repozitoriyanı mock-obyektlə əvəz edərək təcrid olunmuş şəkildə test etmək olar.

iOS üçün Swift-də Facade-in həyata keçirilməsi

iOS-də Facade çox vaxt Manager və ya Service kimi həyata keçirilir. Android-dən fərqli olaraq, iOS Facade-in interfeysini müəyyən etmək üçün protokollardan istifadə edir ki, bu da testlərdə həyata keçirmələri asanlıqla əvəz etməyə imkan verir. Media ilə iş üçün Facade-i nəzərdən keçirək — yükləmə, keşləmə və göstərmə.

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. Keşi yoxlamaq
        if let cached = cache.image(for: url) {
            return .success(cached)
        }
        // 2. Verilənləri yükləmək
        let result = await downloader.download(from: url)
        guard case let .success(data) = result else {
            return .failure(MediaError.downloadFailed)
        }
        // 3. Dekodlaşdırmaq
        guard let image = decoder.decode(data) else {
            return .failure(MediaError.decodeFailed)
        }
        // 4. Keşdə saxlamaq
        cache.setImage(image, for: url)
        return .success(image)
    }
}

MediaService üçmərhələli prosesi kapsullayır: keş → yükləmə → dekodlaşdırma. UI ImageCache, URLSession və ImageDecoder-i idarə etmək əvəzinə bir loadImage(from:) metodunu çağırır. Test zamanı MediaServiceProtocol-i real yükləmə olmadan əvvəlcədən hazırlanmış şəkilləri qaytaran mock-la əvəz etmək olar.

Facade-dən istifadə zamanı tipik səhvlər

Səhvlər Facade-in layihələndirilməsi zamanı onun üstünlüklərini puç edir: sadələşdirmə əvəzinə bütün sistemin asılı olduğu God Object yaranır. Üç əsas problemi araşdıraq.

God Facade — həddindən artıq məsuliyyət

Bir Facade avtorizasiya, profil yükləmə, mesaj göndərmə və sinxronizasiya üçün metodlar ehtiva etdikdə — bu God Object-dir. Əlamət: bir sinifdə 15+ ictimai metod. Həlli: məsuliyyət sahələrinə görə bir neçə ixtisaslaşmış Facade-ə bölmək — AuthService, ProfileService, MessagingService.

Alt sistemin detallarının sızması olan Facade

Facade alt sistemə xas tiplər qaytarırsa (məsələn, FirebaseUser və ya RealmObject), müştəri yenə də konkret həyata keçirilməyə bağlıdır. Həlli: Facade yalnız öz tiplərini (data class / struct) qaytarmalı və müştərini alt sistemin detallarından tamamilə abstraksiya etməlidir.

Facade yeganə giriş nöqtəsi kimi

Facade alt sistemə birbaşa girişi qadağan etdikdə, o, darboğaza çevrilir. Bəzən müştəriyə alt sistemin spesifik metodu lazımdır və onu Facade-dən keçməyə məcbur etmək artıqdır. Facade ciddi gatekeeper olmamalıdır: o, rahat interfeys təqdim edir, lakin komponentlərə birbaşa girişi bloklamır.

Tez-tez verilən suallar

Facade və Proxy arasındakı fərq nədir?

Facade alt sistemə sadələşdirilmiş interfeys təqdim edir və çox vaxt yeni metodlar dəsti yaradır. Proxy orijinal obyektlə eyni interfeysi saxlayır, lakin giriş nəzarəti və ya gec yükləmə əlavə edir. Facade — sadələşdirmə üçün, Proxy — nəzarət üçündür.

Facade Service Layer ilə eyni şeydir?

Service Layer — Facade nümunəsinin tətbiq arxitekturası səviyyəsində həyata keçirilməsidir. O, UI və biznes məntiqi arasında sərhədi müəyyən edir və xidmətlərin həyata keçirilmə detallarını gizlədir. Android-də Service Layer çox vaxt UseCase vasitəsilə, iOS-də isə Manager və ya Service protokolları vasitəsilə həyata keçirilir.

Facade nə vaxt God Object-ə çevrilir?

God Facade bir sinif bir-biri ilə əlaqəsi olmayan bir neçə alt sistemin məsuliyyətini öz üzərinə götürdükdə yaranır. Əlamətlər: 15+ ictimai metod, müxtəlif domenlərdən metodlar (avtorizasiya + ödənişlər + bildirişlər), sinfin test edilməsinin çətinliyi (10+ asılılıq). Həlli: domen Facade-lərinə bölmək.

Kiçik tətbiqdə Facade lazımdırmı?

1-2 ekranlı tətbiqdə Facade artıqdır — UI-dən API və verilənlər bazasına birbaşa müraciət daha sadə və aydındır. Facade özünü doğruldur 5+ ekran və 3+ alt sistem olduqda. Orta və kiçik layihələrdə əlavə UseCase qabığı olmadan yeganə Facade qatı kimi Repository kifayətdir.

Facade istifadə edən kodu necə test etmək olar?

Facade testi sadələşdirir, çünki bütöv alt sistemi bir mock-obyektlə əvəz edir. Üç komponenti (şəbəkə + verilənlər bazası + analitika) mock etmək əvəzinə bir Facade-i mock etmək kifayətdir. Swift-də bunun üçün protocol, Kotlin-də isə interface istifadə olunur. Facade həmçinin komponentlərin orkestrləşdirilməsinin yoxlandığı inteqrasiya testləri üçün də rahatdır.

Yekunlar

  • Facade — mürəkkəb alt sistemə sadə interfeys təqdim edən struktural nümunədir
  • Service LayerUseCase — mobil arxitekturada Facade-in geniş yayılmış həyata keçirilmələri
  • Facade alt sistemi gizlətmir: müştəri zərurət olduqda komponentlərə birbaşa müraciət edə bilər
  • Facade vs Adapter: Facade sadələşdirir, Adapter çevirir; Facade vs Mediator: Facade birtərəflidir, Mediator ikitərəflidir
  • God Facade — antipattern: bir sinifdə 15+ metod Single Responsibility-nin pozulduğunu göstərir
  • Protokol/interfeys Facade üçün məcburidir — alt sistemin mock-test edilməsinin yeganə yoludur
  • Tövsiyə: Facade-i 5+ ekran və 3+ alt sistem olduqda tətbiq edin; kiçik layihələr üçün Repository kifayətdir

Açar təslim mobil tətbiq hazırlayacağıq

IT Sectr 2017-ci ildən startaplar və bizneslər üçün iOS və Android tətbiqləri yaradır. Sizə məsləhət verəcəyik və ən yaxşı həlli təklif edəcəyik.

Layihəni müzakirə et

Həm də oxuyun