Sobes.tech
Middle

Poznáte vzor návrhu Facade? Porozprávajte o svojich skúsenostiach s jeho používaním.

sobes.tech AI

Odpoveď od AI

Áno, som oboznámený s návrhovým vzorom Facade. Je to štrukturálny vzor, ktorý poskytuje unifikované rozhranie ku komplexnému podsystému tried. Jeho cieľom je zjednodušiť používanie podsystému tým, že skryje jeho zložitosť pred klientom.

Skúsenosti s použitím vzoru Facade mám napríklad pri práci s viacvrstvovou architektúrou aplikácie. Predstavme si modul pre prácu so sieťou a databázou. Namiesto toho, aby klientsky kód priamo komunikoval s triedami sieťovej vrstvy (Retrofit, OkHttp), parsermi, triedami databázy (Room, DAO), bol implementovaný trieda-fasáda. Táto fasáda poskytuje jednoduché metódy, napríklad getUser(userId) alebo saveUser(user), ktoré vo vnútri koordinujú komunikáciu s príslušnými podsystémami: vykonávajú sieťový požiadavok, parsujú dáta, ukladajú ich do databázy.

Výhody takéhoto prístupu:

  • Zjednodušenie klientskej kódu: Klient nemusí vedieť o vnútornej štruktúre podsystému.
  • Zníženie závislostí: Fasáda oddeľuje klienta od konkrétnych implementácií podsystému, čo uľahčuje ich výmenu.
  • Zlepšenie štruktúrovanosti: Podsystém sa stáva lepšie spravovateľný a zrozumiteľný.

Príklad zjednodušenej implementácie fasády:

// Podsystém práce s API
class ApiService {
    fun getUserFromApi(userId: Int): String {
        // Logika sieťového požiadavku
        return "{\"id\":$userId, \"name\":\"John Doe\"}"
    }
}

// Podsystém práce s databázou
class DatabaseService {
    fun saveUserToDb(userJson: String) {
        // Logika ukladania do databázy
    }

    fun getUserFromDb(userId: Int): String {
        // Logika získavania z databázy
        return "" // Náhradná implementácia
    }
}

// Fasáda
class UserFacade(
    private val apiService: ApiService,
    private val databaseService: DatabaseService
) {
    fun getUser(userId: Int): String {
        // Najskôr sa pokúsime získať z databázy
        val userFromDb = databaseService.getUserFromDb(userId)
        if (userFromDb.isNotEmpty()) {
            return userFromDb
        }

        // Ak nie je v databáze, získame z API
        val userFromApi = apiService.getUserFromApi(userId)

        // Ukladáme do databázy pre cachovanie
        databaseService.saveUserToDb(userFromApi)

        return userFromApi
    }
}

// Príklad použitia fasády v klientskom kóde
fun main() {
    val apiService = ApiService()
    val databaseService = DatabaseService()
    val userFacade = UserFacade(apiService, databaseService)

    val userJson = userFacade.getUser(123)
    println(userJson)
}

V tomto príklade UserFacade skrýva detaily získavania údajov používateľa z API a ukladania do databázy, poskytujúc klientskemu kódu jednoduchú metódu getUser. Klient nemusí vedieť o existencii ApiService a DatabaseService.

Týmto spôsobom pomáha Facade vytvárať čistejší, zrozumiteľnejší a ľahko udržiavateľný kód, najmä pri práci s komplexnými modulmi.