GoDasturchi
When to Abstract

When to Abstract

Qachon abstraksiya qilish kerak

Oldingi darsda "muddatidan oldin abstraksiya qilmang" dedik. Lekin abstraksiya kerak bo'ladigan aniq holatlar ham bor — buni bilish ham xuddi shunday muhim.

example.go
package main

import "fmt"

// Endi IKKITA haqiqiy implementatsiya bor — bu interfeys uchun yaxshi sabab
type PaymentMethod interface {
	Pay(amount int) string
}

type CardPayment struct{}

func (c CardPayment) Pay(amount int) string {
	return fmt.Sprintf("Karta orqali %d so'm to'landi", amount)
}

type CashPayment struct{}

func (c CashPayment) Pay(amount int) string {
	return fmt.Sprintf("Naqd %d so'm to'landi", amount)
}

func checkout(method PaymentMethod, amount int) string {
	return method.Pay(amount)
}

func main() {
	fmt.Println(checkout(CardPayment{}, 50000))
	fmt.Println(checkout(CashPayment{}, 30000))
}

Abstraksiya (interfeys) qachon haqiqatan foydali: (1) ikki yoki undan ko'p haqiqiy implementatsiya bor bo'lsa, (2) testda soxta (fake) versiya almashtirish kerak bo'lsa ("Mocking Dependencies" darsida ko'rgan), yoki (3) tashqi paket foydalanuvchilariga implementatsiya detalini yashirish kerak bo'lsa. Agar bu uchtasidan birortasi yo'q bo'lsa — ehtimol abstraksiya hali erta.

>_ Exercise

Ikkita implementatsiya uchun interfeys yarating.

  • Notifier interfeysi (Send(msg string) string) yozing
  • SMSNotifier va EmailNotifier turlarini Send metodi bilan yozing
  • ikkalasini ham bitta notify(n Notifier, msg string) funksiyasi orqali chaqiring

Stuck? Reveal a hint to help you.

Hints (0/3)

Key Takeaway

Key Takeaway:

Ikki yoki undan ko'p haqiqiy implementatsiya, testda almashtirish ehtiyoji, yoki implementatsiyani yashirish zarurati — abstraksiya uchun haqiqiy sabablar.

NEXT UP

Flatten Nested Code

OUTPUT

$ go run main.go
Kodingizni ishga tushiring

When to Abstract

Qachon abstraksiya qilish kerak

Oldingi darsda "muddatidan oldin abstraksiya qilmang" dedik. Lekin abstraksiya kerak bo'ladigan aniq holatlar ham bor — buni bilish ham xuddi shunday muhim.

example.go
package main

import "fmt"

// Endi IKKITA haqiqiy implementatsiya bor — bu interfeys uchun yaxshi sabab
type PaymentMethod interface {
	Pay(amount int) string
}

type CardPayment struct{}

func (c CardPayment) Pay(amount int) string {
	return fmt.Sprintf("Karta orqali %d so'm to'landi", amount)
}

type CashPayment struct{}

func (c CashPayment) Pay(amount int) string {
	return fmt.Sprintf("Naqd %d so'm to'landi", amount)
}

func checkout(method PaymentMethod, amount int) string {
	return method.Pay(amount)
}

func main() {
	fmt.Println(checkout(CardPayment{}, 50000))
	fmt.Println(checkout(CashPayment{}, 30000))
}

Abstraksiya (interfeys) qachon haqiqatan foydali: (1) ikki yoki undan ko'p haqiqiy implementatsiya bor bo'lsa, (2) testda soxta (fake) versiya almashtirish kerak bo'lsa ("Mocking Dependencies" darsida ko'rgan), yoki (3) tashqi paket foydalanuvchilariga implementatsiya detalini yashirish kerak bo'lsa. Agar bu uchtasidan birortasi yo'q bo'lsa — ehtimol abstraksiya hali erta.

>_ Exercise

Ikkita implementatsiya uchun interfeys yarating.

  • Notifier interfeysi (Send(msg string) string) yozing
  • SMSNotifier va EmailNotifier turlarini Send metodi bilan yozing
  • ikkalasini ham bitta notify(n Notifier, msg string) funksiyasi orqali chaqiring

Stuck? Reveal a hint to help you.

Hints (0/3)

Key Takeaway

Key Takeaway:

Ikki yoki undan ko'p haqiqiy implementatsiya, testda almashtirish ehtiyoji, yoki implementatsiyani yashirish zarurati — abstraksiya uchun haqiqiy sabablar.

NEXT UP

Flatten Nested Code