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.
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.
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
$ go run main.go
Kodingizni ishga tushiring