Sobes.tech
Middle

Dasturlashda umumiylashtirishlar (Generics) nima?

sobes.tech AI

AIdan javob

Programma tillashlari (Generics) — bu dasturlash tillarida turli ma'lumot turlari bilan ishlaydigan komponentlar (sinflar, interfeyslar, metodlar/funksiyalar) yaratishga imkon beradigan mexanizm bo'lib, bu tur xavfsizligini yo'qotmasdan va turlarni konvertatsiya qilish (casting) qilmasdan amalga oshiriladi.

Genericsdan foydalanishning asosiy maqsadlari:

  • Tur xavfsizligini oshirish: Kompilyator, dastur ishga tushirilishidan oldin, turlarni tekshiradi va xatolarni aniqlaydi.
  • Kod o'qilishi va tushunarli bo'lishini yaxshilash: Komponent qaysi ma'lumot turlari bilan ishlayotganini aniq ko'rish mumkin.
  • Kodning qayta ishlatilishini ta'minlash: Bir komponentni turli turlarda ishlash uchun yaratish mumkin, bu esa bir nechta versiyalar yozish o'rniga.
  • Turlarni konvertatsiya qilish ehtiyojini kamaytirish: Aniq turlarni konvertatsiya qilishga ehtiyoj qolmaydi, bu kodni toza va kamroq xatolikka moyil qiladi ClassCastException (bu qo'llaniladigan tillarda, masalan, Java).

Genericsdan foydalanish misollari:

  • Kolleksiyalar: Ro'yxatlar (List), to'plamlar (Set), xaritalar (Map) ma'lum bir turdagi elementlarni saqlay oladi, bu esa boshqa turdagi elementlar kiritilmasligini ta'minlaydi.
  • Metodlar/funksiyalar: Metod parametrlar bilan ishlash yoki umumiy turdagi qiymatni qaytarishi mumkin.
  • Sinflar/interfeyslar: Umumiy ma'lumot tuzilmalari yoki xulq-atvor shablonlarini yaratish mumkin.

Java misoli:

// Generik Pair sinfi
public class Pair<T, U> {
    private T first;
    private U second;

    public Pair(T first, U second) {
        this.first = first;
        this.second = second;
    }

    public T getFirst() {
        return first;
    }

    public U getSecond() {
        return second;
    }
}

// Foydalanish
Pair<String, Integer> pair = new Pair<>("Hello", 123);
String str = pair.getFirst(); // Turlarni konvertatsiya qilish shart emas
int num = pair.getSecond(); // Turlarni konvertatsiya qilish shart emas

// Noto'g'ri Pair misoli
// Pair<String, Integer> wrongPair = new Pair<>(123, "Hello"); // Kompilyatsiya xatosi: turlar mos kelmaydi

C# misoli:

// Generik Pair sinfi
public class Pair<T, U>
{
    public T First { get; set; }
    public U Second { get; set; }

    public Pair(T first, U second)
    {
        First = first;
        Second = second;
    }
}

// Foydalanish
var pair = new Pair<string, int>("Hello", 123);
string str = pair.First; // Turlarni konvertatsiya qilish shart emas
int num = pair.Second; // Turlarni konvertatsiya qilish shart emas

// Noto'g'ri Pair misoli
// var wrongPair = new Pair<string, int>(123, "Hello"); // Kompilyatsiya xatosi: turlar mos kelmaydi

TypeScript misoli:

// Generik funksiya - massivning birinchi elementini olish
function getFirstElement<T>(arr: T[]): T | undefined {
    if (arr.length > 0) {
        return arr[0];
    }
    return undefined;
}

// Foydalanish
let numbers: number[] = [1, 2, 3];
let firstNumber = getFirstElement(numbers); // firstNumber turi number

let words: string[] = ["a", "b", "c"];
let firstWord = getFirstElement(words); // firstWord turi string

// let mixedArray: (number | string)[] = [1, "a", 2];
// let firstMixed = getFirstElement(mixedArray); // firstMixed turi number | string

Shunday qilib, Generics kuchli vositadir, u yordamida moslashuvchan, tur xavfsiz va qayta foydalaniladigan kodlar yozish mumkin.