Sobes.tech
Middle

Դու գիտե՞ք Facade նախագծման ձևանմուշը: Խոսեք դրա օգտագործման փորձի մասին։

sobes.tech AI

Պատասխան AI-ից

Այո, ես ծանոթ եմ Facade նախագծման օրինակին: Դա կառուցվածքային օրինակ է, որը ապահովում է միացյալ ինտերֆեյս բարդ ենթամշակույթի դասերի համար: Նրա նպատակն է պարզեցնել ենթամշակույթի օգտագործումը, թաքցնելով նրա բարդությունը հաճախորդից:

Ես ունեցել եմ փորձ Facade օրինակով, օրինակ՝ բազմաշերտ ծրագրային ճարտարապետության դեպքում: Նկատենք, որ եղել է մոդուլ ցանցի և տվյալների բազայի հետ աշխատելու համար: Փոխարենը, որ հաճախորդի կոդը ուղղակիորեն շփվի ցանցային շերտի դասների (Retrofit, OkHttp), պարսկերների, տվյալների բազայի դասերի (Room, DAO) հետ, ստեղծվել է ֆասադ դաս: Այս ֆասադը տրամադրում է պարզ մեթոդներ, օրինակ՝ getUser(userId) կամ saveUser(user), որոնք ներսում համակարգում են համապատասխան ենթամշակույթների հետ շփումը՝ կատարելով ցանցային հարցում, տվյալների պարսկերում, պահպանում տվյալների բազայում:

Այս մոտեցման առավելությունները՝

  • Հեշտացնել հաճախորդի կոդը: Հաճախորդը չպետք է իմանա ենթամշակույթի ներքին կառուցվածքը:
  • Համակցվածության նվազեցում: Ֆասադը բաժանում է հաճախորդին ենթամշակույթի կոնկրետ իրականացումներից, ինչը հեշտացնում է փոխարինումը:
  • Կառուցվածության բարելավում: Սուբսիստեմը ավելի կառավարելի և հասկանալի է դառնում:

Նմուշ՝ ֆասադի պարզեցված իրականացման:

// API-ի հետ աշխատող ենթամշակույթ
class ApiService {
    fun getUserFromApi(userId: Int): String {
        // Ցանցային հարցման տրամաբանություն
        return "{\"id\":$userId, \"name\":\"John Doe\"}"
    }
}

// Տվյալների բազայի հետ աշխատող ենթամշակույթ
class DatabaseService {
    fun saveUserToDb(userJson: String) {
        // Տվյալների պահպանում
    }

    fun getUserFromDb(userId: Int): String {
        // Տվյալների ստացում
        return "" // Զանգված
    }
}

// Ֆասադ
class UserFacade(
    private val apiService: ApiService,
    private val databaseService: DatabaseService
) {
    fun getUser(userId: Int): String {
        // Նախ փորձում ենք ստանալ տվյալները տվյալների բազայից
        val userFromDb = databaseService.getUserFromDb(userId)
        if (userFromDb.isNotEmpty()) {
            return userFromDb
        }

        // Եթե չկա տվյալների բազայում, ստանում ենք API-ից
        val userFromApi = apiService.getUserFromApi(userId)

        // Սխեման պահպանում ենք տվյալների բազայում
        databaseService.saveUserToDb(userFromApi)

        return userFromApi
    }
}

// Օրինակ՝ ֆասադի օգտագործում հաճախորդային կոդում
fun main() {
    val apiService = ApiService()
    val databaseService = DatabaseService()
    val userFacade = UserFacade(apiService, databaseService)

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

Այս օրինակով UserFacade թաքցնում է օգտվողի տվյալների ստացման և պահպանում գործընթացները, տրամադրելով հաճախորդին պարզ getUser մեթոդը: Հաճախորդը չպետք է իմանա ApiService և DatabaseService մասին:

Այսպիսով, Facade-ն օգնում է ստեղծել ավելի մաքուր, հասկանալի և հեշտ պահպանվող կոդ, հատկապես աշխատելով բարդ մոդուլների հետ։