Sobes.tech
Middle

Facade dizayn naqshini bilasizmi? Uning foydalanish tajribangiz haqida gapiring.

sobes.tech AI

AIdan javob

Ha, men Facade dizayn naqshidan xabardorman. Bu, murakkab klassalar tizimiga yagona interfeys taqdim etadigan tuzilma naqshidir. Uning maqsadi, tizimning murakkabligini yashirish orqali uni foydalanishni soddalashtirishdir.

Menimcha, Facade naqshini ishlatish tajribam, masalan, ilovada ko'p qatlamli arxitekturaga ishlashda bo'ldi. Faraz qilaylik, tarmoq va ma'lumotlar bazasi bilan ishlash uchun modul bor edi. Mijoz kodi to'g'ridan-to'g'ri tarmoq qatlamining klasslari (Retrofit, OkHttp), parserlar, ma'lumotlar bazasi klasslari (Room, DAO) bilan o'zaro aloqada bo'lishi o'rniga, facade klassi ishlab chiqildi. Bu facade oddiy metodlar, masalan, getUser(userId) yoki saveUser(user), taqdim etdi va ular ichki ravishda mos tizimlar bilan o'zaro aloqani muvofiqlashtirdi: tarmoq so'rovini amalga oshirish, ma'lumotlarni tahlil qilish, ularni ma'lumotlar bazasida saqlash.

Bu yondashuvning afzalliklari:

  • Mijoz kodini soddalashtirish: Mijoz tizimning ichki tuzilishini bilishi shart emas.
  • Bog'lanishni kamaytirish: Facade, mijozni tizimning aniq amalga oshirishlaridan ajratadi, bu ularni almashtirishni osonlashtiradi.
  • Strukturani yaxshilash: Tizim boshqariladigan va tushunarli bo'ladi.

Facade ning soddalashtirilgan amalga oshirish misoli:

// API bilan ishlash tizimi
class ApiService {
    fun getUserFromApi(userId: Int): String {
        // Tarmoq so'rovi logikasi
        return "{\"id\":$userId, \"name\":\"John Doe\"}"
    }
}

// Ma'lumotlar bazasi bilan ishlash tizimi
class DatabaseService {
    fun saveUserToDb(userJson: String) {
        // Bazaga saqlash logikasi
    }

    fun getUserFromDb(userId: Int): String {
        // Bazadan olish logikasi
        return "" // Placeholder
    }
}

// Facade
class UserFacade(
    private val apiService: ApiService,
    private val databaseService: DatabaseService
) {
    fun getUser(userId: Int): String {
        // Avvalo, bazadan olishga harakat qilamiz
        val userFromDb = databaseService.getUserFromDb(userId)
        if (userFromDb.isNotEmpty()) {
            return userFromDb
        }

        // Agar bazada bo'lmasa, API dan olamiz
        val userFromApi = apiService.getUserFromApi(userId)

        // Cache uchun bazaga saqlaymiz
        databaseService.saveUserToDb(userFromApi)

        return userFromApi
    }
}

// Mijoz kodida facade dan foydalanish misoli
fun main() {
    val apiService = ApiService()
    val databaseService = DatabaseService()
    val userFacade = UserFacade(apiService, databaseService)

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

Ushbu misolda, UserFacade API dan foydalanuvchi ma'lumotlarini olish va ularni ma'lumotlar bazasida saqlash tafsilotlarini yashiradi, mijoz kodiga oddiy getUser metodini taqdim etadi. Mijoz ApiService va DatabaseService ning mavjudligini bilishi shart emas.

Shu tarzda, Facade murakkab modullar bilan ishlashda, kodni toza, tushunarli va oson qo'llab-quvvatlanadigan qilishga yordam beradi.