GoDasturchi
Client Library

Client Library

Klient kutubxonasi

Bank ilovasidan foydalanganingizda, siz bankning ICHKI ma'lumotlar bazasi bilan to'g'ridan-to'g'ri "gaplashmaysiz" — buning o'rniga sodda, qulay ilovadan foydalanasiz, u esa BARCHA murakkab ishni ORQADA bajaradi. Client Library — bizning cache uchun aynan shu "qulay ilova" vazifasini bajaradi: foydalanuvchi kodiga cache bilan ishlashning ODDIY, tushunarli usulini taqdim etadi.

example.go
package main

import (
	"fmt"
	"time"
)

type Cache struct {
	data map[string]string
}

func NewCache() *Cache { return &Cache{data: make(map[string]string)} }
func (c *Cache) Set(key, value string) { c.data[key] = value }
func (c *Cache) Get(key string) (string, bool) { v, ok := c.data[key]; return v, ok }

// CacheClient — ichki Cache'ni O'RAB, qulayroq, yuqori darajali metodlar taqdim etadi
type CacheClient struct {
	cache *Cache
}

func NewCacheClient(cache *Cache) *CacheClient {
	return &CacheClient{cache: cache}
}

// GetOrDefault — kalit topilmasa, standart qiymat qaytaradi (xatolik bilan
// ishlashni SODDALASHTIRADI)
func (cl *CacheClient) GetOrDefault(key, defaultValue string) string {
	value, ok := cl.cache.Get(key)
	if !ok {
		return defaultValue
	}
	return value
}

// GetOrCompute — kalit topilmasa, uni HISOBLAB, keshga SAQLAB, keyin qaytaradi
func (cl *CacheClient) GetOrCompute(key string, compute func() string) string {
	if value, ok := cl.cache.Get(key); ok {
		return value
	}
	value := compute()
	cl.cache.Set(key, value)
	return value
}

func main() {
	cache := NewCache()
	client := NewCacheClient(cache)

	fmt.Println(client.GetOrDefault("missing", "N/A"))

	computeCalls := 0
	result := client.GetOrCompute("expensive", func() string {
		computeCalls++
		time.Sleep(time.Millisecond) // "og'ir hisoblash"ni simulyatsiya qilamiz
		return "hisoblangan natija"
	})
	fmt.Println(result, computeCalls)
}

GetOrCompute — production tizimlarda ENG KO'P ishlatiladigan cache naqshlaridan biri (cache-aside deb ataladi): avval keshdan tekshiriladi, TOPILMASA — qimmat operatsiya (masalan baza so'rovi) BAJARILADI, natija keshga SAQLANADI, va shu bilan KEYINGI so'rov uchun kesh allaqachon TAYYOR bo'ladi.

CacheClientCachening O'ZINI emas, balki UNGA MUROJAAT qilishning QULAYROQ usulini taqdim etadi ("Wrapper" naqshi). Bu — "Service Boundaries" darsida ko'rgan g'oyaning kutubxona darajasidagi ko'rinishi: foydalanuvchi kodi past darajadagi (Get, ok tekshiruvi) tafsilotlar bilan emas, balki YUQORI darajadagi maqsad ("bu qiymatni ol, yo'q bo'lsa hisobla") bilan ishlaydi.

>_ Exercise

CacheClient'ga bir nechta kalitni bir vaqtda olish metodini qo'shing.

  • GetMany(keys []string) map[string]string metodini yozing: har bir kalit uchun Get chaqirib, TOPILGANLARINI natija xaritaga qo'shing
  • cache'ga "a"->"1" va "b"->"2" ni Set qiling ("c"ni Set QILMANG)
  • GetMany([]string{"a", "b", "c"}) natijasining uzunligini chop eting

Stuck? Reveal a hint to help you.

Hints (0/3)

Key Takeaway

Key Takeaway:

Client Library — ichki Cache ustiga qulay, yuqori darajali metodlar (GetOrCompute, GetMany kabi) qo'shib, foydalanuvchi kodini past darajadagi tafsilotlardan xalos qiladi.

Finish
OUTPUT

$ go run main.go
Kodingizni ishga tushiring

Client Library

Klient kutubxonasi

Bank ilovasidan foydalanganingizda, siz bankning ICHKI ma'lumotlar bazasi bilan to'g'ridan-to'g'ri "gaplashmaysiz" — buning o'rniga sodda, qulay ilovadan foydalanasiz, u esa BARCHA murakkab ishni ORQADA bajaradi. Client Library — bizning cache uchun aynan shu "qulay ilova" vazifasini bajaradi: foydalanuvchi kodiga cache bilan ishlashning ODDIY, tushunarli usulini taqdim etadi.

example.go
package main

import (
	"fmt"
	"time"
)

type Cache struct {
	data map[string]string
}

func NewCache() *Cache { return &Cache{data: make(map[string]string)} }
func (c *Cache) Set(key, value string) { c.data[key] = value }
func (c *Cache) Get(key string) (string, bool) { v, ok := c.data[key]; return v, ok }

// CacheClient — ichki Cache'ni O'RAB, qulayroq, yuqori darajali metodlar taqdim etadi
type CacheClient struct {
	cache *Cache
}

func NewCacheClient(cache *Cache) *CacheClient {
	return &CacheClient{cache: cache}
}

// GetOrDefault — kalit topilmasa, standart qiymat qaytaradi (xatolik bilan
// ishlashni SODDALASHTIRADI)
func (cl *CacheClient) GetOrDefault(key, defaultValue string) string {
	value, ok := cl.cache.Get(key)
	if !ok {
		return defaultValue
	}
	return value
}

// GetOrCompute — kalit topilmasa, uni HISOBLAB, keshga SAQLAB, keyin qaytaradi
func (cl *CacheClient) GetOrCompute(key string, compute func() string) string {
	if value, ok := cl.cache.Get(key); ok {
		return value
	}
	value := compute()
	cl.cache.Set(key, value)
	return value
}

func main() {
	cache := NewCache()
	client := NewCacheClient(cache)

	fmt.Println(client.GetOrDefault("missing", "N/A"))

	computeCalls := 0
	result := client.GetOrCompute("expensive", func() string {
		computeCalls++
		time.Sleep(time.Millisecond) // "og'ir hisoblash"ni simulyatsiya qilamiz
		return "hisoblangan natija"
	})
	fmt.Println(result, computeCalls)
}

GetOrCompute — production tizimlarda ENG KO'P ishlatiladigan cache naqshlaridan biri (cache-aside deb ataladi): avval keshdan tekshiriladi, TOPILMASA — qimmat operatsiya (masalan baza so'rovi) BAJARILADI, natija keshga SAQLANADI, va shu bilan KEYINGI so'rov uchun kesh allaqachon TAYYOR bo'ladi.

CacheClientCachening O'ZINI emas, balki UNGA MUROJAAT qilishning QULAYROQ usulini taqdim etadi ("Wrapper" naqshi). Bu — "Service Boundaries" darsida ko'rgan g'oyaning kutubxona darajasidagi ko'rinishi: foydalanuvchi kodi past darajadagi (Get, ok tekshiruvi) tafsilotlar bilan emas, balki YUQORI darajadagi maqsad ("bu qiymatni ol, yo'q bo'lsa hisobla") bilan ishlaydi.

>_ Exercise

CacheClient'ga bir nechta kalitni bir vaqtda olish metodini qo'shing.

  • GetMany(keys []string) map[string]string metodini yozing: har bir kalit uchun Get chaqirib, TOPILGANLARINI natija xaritaga qo'shing
  • cache'ga "a"->"1" va "b"->"2" ni Set qiling ("c"ni Set QILMANG)
  • GetMany([]string{"a", "b", "c"}) natijasining uzunligini chop eting

Stuck? Reveal a hint to help you.

Hints (0/3)

Key Takeaway

Key Takeaway:

Client Library — ichki Cache ustiga qulay, yuqori darajali metodlar (GetOrCompute, GetMany kabi) qo'shib, foydalanuvchi kodini past darajadagi tafsilotlardan xalos qiladi.