GoDasturchi
When to Use Generics (and When Not To)

When to Use Generics (and When Not To)

Generics qachon kerak (va qachon kerak emas)

Generics kuchli vosita, lekin har bir muammoning yechimi emas. Ular kodni murakkablashtiradi: o'qiyotgan odam endi nafaqat mantiqni, balki tur parametrlari va cheklovlarni ham tushunishi kerak. Qachon generics ishlatish kerakligi haqida foydali qoida: agar bir xil mantiqni bir nechta aniq tur bilan yozayotgan bo'lsangiz (SumInts, SumFloats kabi), generics o'rinli.

Lekin agar sizga faqat bitta metod imzosi kerak bo'lsa — masalan, "bu qiymat Area() float64 metodiga ega bo'lsin" — bu Interfaces & Polymorphism kursidagi oddiy interfeys bilan yaxshiroq yechiladi, generics bilan emas:

example.go
// Ortiqcha: bu yerda generics shart emas
func TotalArea[T Shaper](shapes []T) float64 { ... }

// Yaxshiroq: oddiy interfeys yetarli, chaqiruvchi turlarni aralashtira oladi
func TotalArea(shapes []Shaper) float64 { ... }

Klassik, to'g'ri generics qo'llanilishi — ma'lumot tuzilmalari va umumiy amallar ustida: slice'ni filtrlash, xaritalash, guruhlash kabi amallar har qanday element turi bilan bir xil ishlaydi, va aynan mana shu holatlarda generics o'z o'rnini topadi.

example.go
func Filter[T any](items []T, keep func(T) bool) []T {
    result := []T{}
    for _, item := range items {
        if keep(item) {
            result = append(result, item)
        }
    }
    return result
}
// Har qanday element turi bilan ishlaydi — bu yerda generics aynan kerakli yechim

>_ Exercise

Filter[T any](items []T, keep func(T) bool) []T generic funksiyasini yozing. U itemsdan faqat keep funksiyasi true qaytargan elementlarni saqlab qolgan yangi slice qaytaradi. Bu — generics haqiqatan ham to'g'ri yechim bo'lgan holat: mantiq ("saqlab qolish yoki qolmaslik") elementlar turidan butunlay mustaqil.

Stuck? Reveal a hint to help you.

Hints (0/3)

Key Takeaway

Key Takeaway:

Generics — bir xil mantiqni ko'plab aniq turlar bilan qayta ishlatish (Sum, Filter, Unique) kerak bo'lganda to'g'ri yechim. Agar sizga faqat bitta metod imzosi kerak bo'lsa, oddiy interfeys ko'pincha soddaroq va yetarli. To'g'ri vositani tanlash — tajriba bilan keladigan muhandislik ko'nikmasi.

Finish
OUTPUT

$ go run main.go
Kodingizni ishga tushiring

When to Use Generics (and When Not To)

Generics qachon kerak (va qachon kerak emas)

Generics kuchli vosita, lekin har bir muammoning yechimi emas. Ular kodni murakkablashtiradi: o'qiyotgan odam endi nafaqat mantiqni, balki tur parametrlari va cheklovlarni ham tushunishi kerak. Qachon generics ishlatish kerakligi haqida foydali qoida: agar bir xil mantiqni bir nechta aniq tur bilan yozayotgan bo'lsangiz (SumInts, SumFloats kabi), generics o'rinli.

Lekin agar sizga faqat bitta metod imzosi kerak bo'lsa — masalan, "bu qiymat Area() float64 metodiga ega bo'lsin" — bu Interfaces & Polymorphism kursidagi oddiy interfeys bilan yaxshiroq yechiladi, generics bilan emas:

example.go
// Ortiqcha: bu yerda generics shart emas
func TotalArea[T Shaper](shapes []T) float64 { ... }

// Yaxshiroq: oddiy interfeys yetarli, chaqiruvchi turlarni aralashtira oladi
func TotalArea(shapes []Shaper) float64 { ... }

Klassik, to'g'ri generics qo'llanilishi — ma'lumot tuzilmalari va umumiy amallar ustida: slice'ni filtrlash, xaritalash, guruhlash kabi amallar har qanday element turi bilan bir xil ishlaydi, va aynan mana shu holatlarda generics o'z o'rnini topadi.

example.go
func Filter[T any](items []T, keep func(T) bool) []T {
    result := []T{}
    for _, item := range items {
        if keep(item) {
            result = append(result, item)
        }
    }
    return result
}
// Har qanday element turi bilan ishlaydi — bu yerda generics aynan kerakli yechim

>_ Exercise

Filter[T any](items []T, keep func(T) bool) []T generic funksiyasini yozing. U itemsdan faqat keep funksiyasi true qaytargan elementlarni saqlab qolgan yangi slice qaytaradi. Bu — generics haqiqatan ham to'g'ri yechim bo'lgan holat: mantiq ("saqlab qolish yoki qolmaslik") elementlar turidan butunlay mustaqil.

Stuck? Reveal a hint to help you.

Hints (0/3)

Key Takeaway

Key Takeaway:

Generics — bir xil mantiqni ko'plab aniq turlar bilan qayta ishlatish (Sum, Filter, Unique) kerak bo'lganda to'g'ri yechim. Agar sizga faqat bitta metod imzosi kerak bo'lsa, oddiy interfeys ko'pincha soddaroq va yetarli. To'g'ri vositani tanlash — tajriba bilan keladigan muhandislik ko'nikmasi.