GoDasturchi
Table-Driven Design

Table-Driven Design

Jadval asosidagi dizayn

"Professional Go Testing" kursida jadval asosidagi testlarni, "Table-Driven Logic" darsida esa jadval asosidagi oddiy mantiqni ko'rgan edingiz. Endi shu g'oyani butun dastur arxitekturasi darajasida qo'llaymiz: turli muhit yoki holat uchun kod filiallari (if/switch) yozish o'rniga, ma'lumotni bitta markazlashtirilgan jadvalga jamlash.

Buni restoran menyusiga o'xshating: har safar mijoz kelganda oshpaz "agar mijoz shu narsani so'rasa, unda..." deb o'ylab o'tirmaydi — menyu allaqachon jadval ko'rinishida tayyor, va oshpaz unga qarab ishlaydi. Yangi taom qo'shish uchun oshpazning "mantig'i"ni emas, faqat menyu jadvalini o'zgartirish kifoya.

example.go
package main

import "fmt"

type Config struct {
	MaxRetries int
	Timeout    int
}

// Jadval: har bir muhit uchun sozlamalar bir joyda
var environments = map[string]Config{
	"dev":  {MaxRetries: 1, Timeout: 5},
	"prod": {MaxRetries: 5, Timeout: 30},
}

func LoadConfig(env string) Config {
	return environments[env]
}

func main() {
	cfg := LoadConfig("prod")
	fmt.Println(cfg.MaxRetries, cfg.Timeout)
}

Agar buni if env == "dev" { ... } else if env == "prod" { ... } ko'rinishida yozganingizda edi, yangi muhit (masalan "staging") qo'shish uchun kodning mantiq qismini o'zgartirish kerak bo'lardi. Jadval yondashuvida esa yangi muhit qo'shish — shunchaki environments xaritasiga bitta qator qo'shish, LoadConfig funksiyasining o'zi hech qachon o'zgarmaydi.

Bu naqsh ayniqsa konfiguratsiya, marshrutlash qoidalari, xato kodlari kabi "ma'lumot ko'p, mantiq kam" holatlarda kuchli: mantiqni bir marta to'g'ri yozib qo'yasiz, keyin faqat jadvalni to'ldirib borasiz.

>_ Exercise

HTTP status kodlariga mos foydalanuvchi xabarlarini jadval orqali boshqaring.

  • statusMessages xaritasini yarating: 200->"OK", 404->"topilmadi", 500->"server xatosi"
  • MessageFor(code int) string funksiyasini yozing: xaritadan topib qaytarsin, topilmasa "noma'lum holat" qaytarsin
  • MessageFor(404) va MessageFor(999) natijalarini chop eting

Stuck? Reveal a hint to help you.

Hints (0/3)

Key Takeaway

Key Takeaway:

Jadval asosidagi dizaynda ma'lumot (sozlama, qoida) va mantiq ajratiladi — yangi holat qo'shish uchun mantiqni emas, faqat jadvalni o'zgartirasiz.

NEXT UP

Worker Pool Pattern

OUTPUT

$ go run main.go
Kodingizni ishga tushiring

Table-Driven Design

Jadval asosidagi dizayn

"Professional Go Testing" kursida jadval asosidagi testlarni, "Table-Driven Logic" darsida esa jadval asosidagi oddiy mantiqni ko'rgan edingiz. Endi shu g'oyani butun dastur arxitekturasi darajasida qo'llaymiz: turli muhit yoki holat uchun kod filiallari (if/switch) yozish o'rniga, ma'lumotni bitta markazlashtirilgan jadvalga jamlash.

Buni restoran menyusiga o'xshating: har safar mijoz kelganda oshpaz "agar mijoz shu narsani so'rasa, unda..." deb o'ylab o'tirmaydi — menyu allaqachon jadval ko'rinishida tayyor, va oshpaz unga qarab ishlaydi. Yangi taom qo'shish uchun oshpazning "mantig'i"ni emas, faqat menyu jadvalini o'zgartirish kifoya.

example.go
package main

import "fmt"

type Config struct {
	MaxRetries int
	Timeout    int
}

// Jadval: har bir muhit uchun sozlamalar bir joyda
var environments = map[string]Config{
	"dev":  {MaxRetries: 1, Timeout: 5},
	"prod": {MaxRetries: 5, Timeout: 30},
}

func LoadConfig(env string) Config {
	return environments[env]
}

func main() {
	cfg := LoadConfig("prod")
	fmt.Println(cfg.MaxRetries, cfg.Timeout)
}

Agar buni if env == "dev" { ... } else if env == "prod" { ... } ko'rinishida yozganingizda edi, yangi muhit (masalan "staging") qo'shish uchun kodning mantiq qismini o'zgartirish kerak bo'lardi. Jadval yondashuvida esa yangi muhit qo'shish — shunchaki environments xaritasiga bitta qator qo'shish, LoadConfig funksiyasining o'zi hech qachon o'zgarmaydi.

Bu naqsh ayniqsa konfiguratsiya, marshrutlash qoidalari, xato kodlari kabi "ma'lumot ko'p, mantiq kam" holatlarda kuchli: mantiqni bir marta to'g'ri yozib qo'yasiz, keyin faqat jadvalni to'ldirib borasiz.

>_ Exercise

HTTP status kodlariga mos foydalanuvchi xabarlarini jadval orqali boshqaring.

  • statusMessages xaritasini yarating: 200->"OK", 404->"topilmadi", 500->"server xatosi"
  • MessageFor(code int) string funksiyasini yozing: xaritadan topib qaytarsin, topilmasa "noma'lum holat" qaytarsin
  • MessageFor(404) va MessageFor(999) natijalarini chop eting

Stuck? Reveal a hint to help you.

Hints (0/3)

Key Takeaway

Key Takeaway:

Jadval asosidagi dizaynda ma'lumot (sozlama, qoida) va mantiq ajratiladi — yangi holat qo'shish uchun mantiqni emas, faqat jadvalni o'zgartirasiz.

NEXT UP

Worker Pool Pattern